/etc/passwd と /etc/shadow
『/etc/passwd』と『/etc/shadow』は、Linux システムにおけるユーザー情報を管理する2つのテキストファイルです。/etc/passwd にはユーザー名・UID・ホームディレクトリなどの基本情報が格納され、すべてのユーザーが読み取れます。パスワードのハッシュは、より厳格な権限で保護された /etc/shadow に分離されています。各ファイルはコロン(:)区切りのフィールドで構成されており、getent passwd コマンドや passwd コマンドから間接的に操作するのが安全です。
構文
/etc/passwd は 7 つのフィールドをコロン(:)で区切った形式です。
ユーザー名:x:UID:GID:GECOS:ホームディレクトリ:ログインシェル
/etc/shadow は 9 つのフィールドをコロン(:)で区切った形式です。
ユーザー名:ハッシュ:最終変更日:最小日数:最大日数:警告日数:非活性日数:有効期限:予約
構文一覧
| ファイル | フィールド | 説明 |
|---|---|---|
/etc/passwd | ユーザー名 | ログイン名です。システム内で一意である必要があります。 |
| パスワードプレースホルダー | 常に x が格納されます。実際のハッシュは /etc/shadow に保存されています。 | |
| UID | ユーザーID です。0 が root、1000 以上が一般ユーザーです。 | |
| GID | プライマリグループ ID です。/etc/group の対応するグループと紐付きます。 | |
| GECOS | 任意のコメント欄です。フルネームや電話番号などを記載します。空でも構いません。 | |
| ホームディレクトリ | ログイン後の作業ディレクトリのパスです。/home/ユーザー名 が一般的です。 | |
| ログインシェル | 起動するシェルのフルパスです。/sbin/nologin を指定するとログインを拒否できます。 | |
/etc/shadow | ユーザー名 | /etc/passwd と同じユーザー名です。両ファイルのユーザー名で対応付けされます。 |
| パスワードハッシュ | $id$salt$hash 形式です。! または * のときはパスワード認証が無効です。 | |
| 最終変更日 | パスワードを最後に変更した日を、1970-01-01 からの経過日数で表します。 | |
| 最小変更間隔 | パスワード変更後、次の変更を許可するまでの最小日数です。0 は制限なしを意味します。 | |
| 最大有効期間 | パスワードが有効な最大日数です。99999 は事実上の無期限です。 | |
| 警告日数 | パスワード期限切れの何日前からユーザーへ警告を表示するかを指定します。 | |
| 非活性日数 | 期限切れ後、アカウントを無効化するまでの猶予日数です。空の場合は無効化しません。 | |
| アカウント有効期限 | アカウントが利用できる最終日を経過日数で指定します。空の場合は無期限です。 |
使用例
/etc/passwd の全エントリを表示します。すべてのユーザーが読み取れるファイルです。
cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin webmaster:x:1001:1001:Web Master,,,:/home/webmaster:/bin/bash deploy:x:1002:1002:Deploy Account:/home/deploy:/bin/bash
特定ユーザーの行だけを抽出するには grep を使います。
grep '^webmaster:' /etc/passwd webmaster:x:1001:1001:Web Master,,,:/home/webmaster:/bin/bash
getent passwd でも同じ情報を取得できます。getent は /etc/passwd だけでなく LDAP 等の外部ディレクトリも含めて検索します。
getent passwd webmaster webmaster:x:1001:1001:Web Master,,,:/home/webmaster:/bin/bash
/etc/shadow のパスワードハッシュを確認します。root 権限が必要です。
sudo grep '^deploy:' /etc/shadow deploy:$6$rounds=5000$nacl8xkP3zQm1w2r$TvjZklM.../0:19800:0:99999:7:::
ハッシュは $id$salt$hash 形式です。上記の出力を分解すると次のようになります。
| 部分 | 値 | 意味 |
|---|---|---|
$6$ | SHA-512 | ハッシュアルゴリズムの識別子です。 |
rounds=5000$ | 5000 | ストレッチング回数です。多いほど総当たり攻撃に強くなります。 |
nacl8xkP3zQm1w2r | ソルト | ランダム文字列です。同じパスワードでも異なるハッシュを生成します。 |
TvjZklM.../0 | ハッシュ値 | パスワードから計算された実際のハッシュです。 |
useradd でユーザーを作成し、/etc/passwd に反映されたことを確認します。-m はホームディレクトリの同時作成、-c は GECOS フィールド、-s はログインシェルの指定です。
sudo useradd -m -c "System Operator" -s /bin/bash sysop
passwd コマンドでパスワードを設定します。対話的にパスワードの入力を求められます。
sudo passwd sysop Changing password for user sysop. New password: Retype new password: passwd: all authentication tokens updated successfully.
作成されたエントリを確認します。UID と GID は環境によって異なります。
getent passwd sysop sysop:x:1003:1003:System Operator:/home/sysop:/bin/bash
sudo grep '^sysop:' /etc/shadow sysop:$y$j9T$saltsaltsalt$hashhashhash:19800:0:99999:7:::
ログインシェルが /sbin/nologin に設定されたシステムアカウントの一覧を表示します。サービス用アカウント(bin、daemon 等)は対話ログインを禁止するためにこの設定になっています。
grep '/sbin/nologin$' /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
usermod で既存ユーザーのログインシェルを /sbin/nologin に変更すると、そのユーザーの対話ログインを無効化できます。
sudo usermod -s /sbin/nologin appuser
getent passwd appuser appuser:x:1002:1002:Application User:/home/appuser:/sbin/nologin
chage コマンドで /etc/shadow に記録されたパスワードポリシーを確認します。
sudo chage -l user1 Last password change : Mar 25, 2026 Password expires : never Password inactive : never Account expires : never Minimum number of days between password change : 0 Maximum number of days between password change : 99999 Number of days of warning before password expires : 7
パスワードの最大有効期間を 90 日に、期限切れ前の警告を 14 日前からに変更します。
sudo chage -M 90 user1 sudo chage -W 14 user1
変更後のポリシーを確認します。
sudo chage -l user1 Last password change : Mar 25, 2026 Password expires : Jun 23, 2026 Password inactive : never Account expires : never Minimum number of days between password change : 0 Maximum number of days between password change : 90 Number of days of warning before password expires : 14
概要
『/etc/passwd』と『/etc/shadow』は、Linux のユーザー管理の中心となるファイルです。歴史的には /etc/passwd 単体にパスワードハッシュも格納されていましたが、このファイルはすべてのユーザーに読み取り権限があるため、総当たり攻撃のリスクがありました。現代の Linux ではハッシュを root のみ読み取れる /etc/shadow に分離する「シャドウパスワード」方式が標準になっています。パスワードのハッシュアルゴリズムは $id$ プレフィックスで識別でき、現在は SHA-512($6$)や yescrypt($y$)が広く使われています。これらのファイルを直接編集する場合は vipw / vipw -s コマンドを使うと、ファイルのロックと構文チェックが行われるため安全です。ユーザーの作成・変更には useradd / usermod を、グループ情報については グループ管理(/etc/group) を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。