コース一覧
LinuC レベル1 102試験対策(LPIC-1対応)
passwdとshadow

LinuC レベル1 102試験対策(LPIC-1対応)

LinuC レベル1/LPIC-1の102範囲を、シェル、ユーザーとセキュリティ、ネットワーク、システム管理の実機演習と章末問題で固めます。Linuxを安全に運用するための知識とコマンド操作を体系的に身につける25レッスンのコースです。

1
102 シェルとスクリプト
01. シェル環境18分
02. testと条件式18分
03. スクリプトの制御18分
04. cronとat15分
05. systemdタイマー18分
06. 過去問 シェル15分
2
102 ユーザーとセキュリティ
01. passwdとshadow18分
02. ユーザー管理コマンド18分
03. suとsudo18分
04. 特殊パーミッション18分
05. ホストのセキュリティ18分
06. SSHとGPG18分
07. 過去問 ユーザーとセキュリティ15分
3
102 ネットワーク
01. TCP/IPとウェルノウンポート18分
02. アドレス設定18分
03. ルーティング18分
04. 名前解決の設定18分
05. 疎通トラブルシュート18分
06. 過去問 ネットワーク15分
4
102 システム管理
01. 時刻とNTP15分
02. ロケールと文字コード18分
03. ログ管理18分
04. サービス管理の試験形式18分
05. メールと印刷のきほん15分
06. 過去問 システム管理15分

passwdとshadow

/etc/passwd の1行を見て、3番目が UID か GID かで迷ったら、その問題は落ちます。順序は理屈で導けないので、実物を見ながら固めます。

/etc/passwd は7つ、コロン区切り

誰でも読める 644 のファイルです。

プレーンテキスト

root:x:0:0:root:/root:/bin/bash
番号名前意味
1ユーザー名ログイン名
2パスワード欄現在は x が入り、実体は /etc/shadow にある
3UIDユーザーID。root は必ず 0
4GIDプライマリグループのID
5コメント (GECOS)氏名や連絡先。カンマ区切りで複数持てる
6ホームディレクトリログイン直後のカレントディレクトリ
7ログインシェルログイン時に起動されるプログラム

第2フィールドの x は、パスワードの本体は shadow にあるという印です。ここに暗号化文字列を直接書いていた時代もありましたが、passwd は誰でも読めるため危険で、いまは分離されています。第7フィールドが /usr/sbin/nologin や /bin/false のアカウントは、ログインしようとしても即座に終了します。サービス専用のアカウントで使う手です。

/etc/shadow は9つ、日付は1970年からの経過日数

こちらは root だけが読める 640 または 000 です。

番号名前意味
1ユーザー名passwd と対応させるキー
2暗号化パスワードハッシュ化された文字列
3最終変更日1970-01-01 からの経過日数
4最短日数変更後この日数は再変更できない
5最長日数この日数を超えると変更が必要
6警告日数期限の何日前から警告するか
7猶予日数期限切れ後、無効化までの猶予
8失効日アカウント自体が使えなくなる日
9予約将来のための未使用フィールド

第2フィールドの読み方が頻出です。! や !! で始まればロックされていて、パスワード認証でログインできません。* はパスワードが設定されておらずログイン不可です。空文字ならパスワード無しで入れてしまう危険な状態です。$6$ で始まれば SHA-512 でハッシュ化されています。

/etc/group のメンバー欄にプライマリグループは出ない

番号名前意味
1グループ名sudo など
2パスワードほぼ x。実体は /etc/gshadow
3GIDグループID
4メンバー補助グループとして所属するユーザーをカンマ区切りで列挙

第4フィールドに載るのは補助グループとしての所属だけです。プライマリグループの所属は /etc/passwd の第4フィールドで表現されるので、/etc/group のメンバー欄には現れません。引っかけとして頻出です。/etc/gshadow はグループのパスワードと管理者を持つファイルで、passwd に対する shadow と同じ関係です。

UID 0 は root、1 から 999 まではシステムユーザー用に予約され、一般ユーザーは Debian 系でも Red Hat 系でも 1000 番から割り当てられます。この範囲は /etc/login.defs の UID_MIN と UID_MAX で決まります。

ファイルを直接読むより getent

ターミナル

getent passwd root
getent group sudo

getent は /etc/nsswitch.conf の設定に従ってデータベースを引きます。ローカルファイルだけでなく LDAP などの外部ソースも含めて引けるので、cat /etc/passwd より正確です。引数を省略すると全件出ます。整合性の検査は pwck が passwd と shadow を、grpck が group と gshadow を見て、フィールド数の不足や重複、存在しないホームディレクトリを報告します。

試験で狙われるところ

UID が第3、GID が第4です。暗号化パスワードが入るのは /etc/passwd ではなく /etc/shadow です。/etc/shadow の日付は西暦ではなく経過日数です。/etc/group のメンバー欄にプライマリグループは現れません。そして ! はロック、* は未設定という違いがあります。

ヒント

cut は -d で区切り文字、-f でフィールド番号を指定します。コロン区切りなら cut -d ':' -f 3 です

awk は -F ':' で区切り文字を指定し、$3 のように番号でフィールドを参照します。条件だけ書けばその条件に合う行が出力されます

1行目は > で新規作成、2行目以降は >> で追記します。例として echo "rootuid=$(grep '^root:' /etc/passwd | cut -d ':' -f 3)" > /root/user-report.txt です

  • 1. grep '^root:' /etc/passwd で root の行を見て、7つのフィールドを目で確認する
  • 2. cut -d ':' -f 3 で root の UID を取り出し、rootuid=<値> の形で /root/user-report.txt に書く
  • 3. nobody の行から第7フィールド (ログインシェル) を取り出し、nobodyshell=<値> の形で追記する
  • 4. awk -F ':' で第3フィールドが 1000 以上の行を数え、normalusers=<件数> の形で追記する
  • 5. /etc/group の行数を wc -l で数え、grouplines=<件数> の形で追記する

Linux は使うときに起動します(初回は約102MB通信します)

5 項目で採点します