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 にある |
| 3 | UID | ユーザーID。root は必ず 0 |
| 4 | GID | プライマリグループの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 |
| 3 | GID | グループ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 sudogetent は /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 のメンバー欄にプライマリグループは現れません。そして ! はロック、* は未設定という違いがあります。