Linuxの「/etc/passwd」と「/etc/shadow」ファイルについてまとめました。
/etc/passwd
「/etc/passwd」ファイルには、各ユーザのアカウント情報が一行につき一ユーザずつ記述されています。
実際の「/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 中略 tamohiko:x:1000:1000:operator:/home/tamohiko:/bin/bash test:x:1001:1001::/home/test:/bin/bash
ファイルの中身を見てみると、「:」で区切られた7つのフィールドで構成されていることがわかります。
1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|
tamohiko: | x: | 1000: | 1000: | operator: | /home/tamohiko: | /bin/bash |
フィールドの内容
各フィールドに格納されている情報は下記の通りになります。
項目 | 説明 | |
---|---|---|
1 | ユーザ名 | ユーザ名が記述されている |
2 | パスワード | 「x」(/etc/shadow を使用)「*」(アカウントを維持的に無効化)「未設定」(パスワード設定なし)のいづれかとなっている |
3 | ユーザID | ユーザのID(uid)が記述されている |
4 | グループID | ユーザが所属している主グループのID(gid)が記述されいる |
5 | コメント | フルネームや役割などのコメント情報が記述されている |
6 | ホームディレクトリ | ユーザのホームディレクトリの場所がフルパスで記述されている |
7 | ログインシェル | ユーザがログインした際に適用されるシェルが記述されている |
ユーザ名
その名の通りユーザのアカウント名が記述されています。
パスワード
最近のOSでは、このフィールドに記述される設定値は以下の3種類になります。
- x 暗号化されたパスワードが「/etc/shadow」ファイルで管理されていること
- * 一時的にユーザのアカウントを無効化する場合に設定する
- 設定なし パスワードが設定されていない状態を表す
最近のOSはこのフィールドに「x」と設定されていると思いますが、これはシャドウパスワード(/etc/shadow)を使用していることを表しています。
昔のOSは暗号化されたパスワードがこのフィールドに直接記述されていたのですが、最近は暗号化されているといえ一般ユーザにパスワードを見せるのはセキュリティ上好ましくないため、パスワードは「/etc/shadow」ファイルで管理されるようになっています。
それぞれのパーミッションを確認してみると、「/etc/passwd」は一般ユーザからも読み込みが許可されていて、「/etc/shadow」は読み込みが許可されていないことが分かります。
# ls -l /etc/passwd -rw-r--r-- 1 root root 1236 6月 14 05:57 /etc/passwd # ls -l /etc/shadow ---------- 1 root root 1150 6月 14 05:58 /etc/shadow
ユーザID
ユーザに割り当てられる「uid」が記述されています。
一般ユーザに割り当てられる「uid」の範囲は「/etc/login.defs」の「UID_MIN」と「UID_MAX」で設定されています。
CentOS7で確認してみると下記のように設定されているので、ユーザに割り当てられる「uid」は1000~60000となっています。
UID_MIN 1000 UID_MAX 60000
グループID
ユーザが所属している主グループの「gid」が記述されています。
コメント
ユーザのフルネームや役割などのコメントを記述するためのフィールドになります。
記述がない場合は空欄となります。
ホームディレクトリ
ユーザのホームディレクトリのフルパスが記述されます。
ログインシェル
ユーザがログインした際に割り当てられるシェルが記述されます。
アカウントは作成したいがログインさせたくない場合などは「/sbin/nologin」を設定します。
/sbin/nologinについて
実際に「test」というユーザのログインシェルを「/sbin/nologin 」に設定したあとに、sshでtestユーザでログインしようとすると、ログインできないことが確認できます。
# ssh test@localhost test@localhost's password: Last login: Tue Jun 13 19:40:47 2017 from localhost This account is currently not available. Connection to localhost closed.
/etc/shadow
「/etc/shadow」ファイルには暗号化されたパスワードと、パスワードに関連する情報が記述されていて、rootユーザのみ読み書き可能となっています。
「/etc/shadow」ファイルの中身を表示してみます。
root:$6$MymiTFf0$1 中略 Vg2xMgatWlgu1:17324:0:99999:7::: bin:*:17110:0:99999:7::: daemon:*:17110:0:99999:7::: adm:*:17110:0:99999:7::: 中略 tamohiko:$6$9L1Zrd 中略 wL3daV59ycfiv//:17322:0:99999:7::: tamo:$6$EKCr77O/$H 中略 eroh4n7F.gPhuB1:17329:0:99999:7:::
「:」で区切られた9つのフィールドで構成されていることがわかります。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|
tamohiko: | $6$9L1Zrd 中略 wL3daV59ycfiv//: | 17322: | 0: | 99999: | 7: | : | : |
フィールドの内容
各フィールドに格納されている情報は下記の通りとなります。
項目 | 説明 | |
---|---|---|
1 | ユーザ名 | ユーザ名 |
2 | パスワード | 暗号化されたパスワードが記述されている |
3 | 最終パスワード変更日 | 最後にパスワードが変更された年月日(1970 年 1 月 1 日からの経過日数で表示)記述されている |
4 | パスワード変更可能日数 | パスワードが再度変更可能になるまでの日数が記述されている |
5 | パスワード有効期間 | パスワードの変更が必要になるまでの日数が記述されている |
6 | パスワード変更期間警告通知日 | パスワード有効期限切の警告を何日前から通知するかの日数が記述されている |
7 | パスワード有効期限経過後にアカウント使用不能になるまでの日数 | 有効期限経過後にパスワードを変更しなかった場合にアカウントが使用不可になるまでの日数が記述されている |
8 | アカウント有効期間 | アカウントが使用不可になるまでの日数(1970 年 1 月 1 日からの経過日数で表示)が記述されている |
9 | 予約フィールド | 現在は使用されていない |
ユーザ名
ユーザのアカウント名が記述されています。
パスワード
このフィールドには暗号化されたパスワードが記述されています。
なお、どの形式で暗号化されているかは頭の部分の記述で判別できます。
- $1$ md5
- $5$ SHA256
- $6$ SHA512
最近のOSでは「$6$(SHA512)」が使用されています。
最終パスワード変更日
最後にパスワードが変更された日を、1970年1月1日から経過した日数として記述されています。
このままでは一目で年月日を判別することが出来ないので、分かりやすく変換するには下記のようにひと手間かける必要があります。
expr 17320 \* 86400 | xargs -i% date --date=@% 2017年 6月 3日 土曜日 09:00:00 JST
1日は86400秒なので86400を掛けて経過日数から経過秒数に変更してから、xargsでdateコマンドにわたして変換させています。
そのほかの方法としては、chageコマンドを使用して確認するという方法があります。
chage -l ユーザ名
実際に確認してみると「/etc/shadow」に設定されている内容が分かりやすく表示されます。
# chage -l tamohiko 最終パスワード変更日 : 6月 05, 2017 パスワード期限: : なし パスワード無効化中 : なし アカウント期限切れ : なし パスワードが変更できるまでの最短日数 : 0 パスワードを変更しなくてよい最長日数 : 99999 パスワード期限が切れる前に警告される日数 : 7
パスワード変更可能日数
一度パスワードを変更してから、再度パスワードの変更が可能となるまでの日数になります。「0」に設定されている場合は即時パスワード変更可能となります。
パスワード有効期限
パスワードの変更が必要となるまでの日数が記述されています。
「99999」に設定されている場合は有効期限が無期限となります。
パスワード変更期間警告通知日
パスワードの有効期限が切れる日の何日前から警告メッセージユーザに通知するかを設定しています。
アカウント有効期間
アカウントが使用できる年月日を、1970年1月1日から経過した日数で表示しています。
予約フィールド
現在は使用されていません。
/etc/passwdと/etc/shadowの編集
「/etc/passwd」を編集する場合は「vipw」コマンドを、「/etc/shadow」を編集する場合は「vipw -s」コマンドを使用しましょう。編集方法は「vi」コマンドと同じになっています。
「vi」コマンド等でも編集は可能ですが、vipwコマンドは複数ユーザが同時に編集出来ないようにロックを掛けてくれるので、安全に編集を行うことが出来ます。
md5形式からのアカウントデータ移行
古いOSから「/etc/shadow」のパスワード情報を移行する際の注意点です。
以前のOSはパスワードの暗号化はmd5形式で行われていました。
そのためmd5暗号化された「/etc/shadow」のパスワード情報をsha512形式で暗号化されたOSの「/etc/shadow」に移行させた場合、暗号化の形式が移行元と移行先で異なるため、そのままではパスワード情報は移行できませんので注意してください。
移行元と移行先の暗号化形式が異なる場合は、移行先の暗号化形式をいったん移行元と同じように設定変更する必要があります。
暗号化形式は「/etc/pam.d/system-auth」ファイルの下記部分で設定されてるので、必要に応じてsha512の部分をmd5やsha256等に変更してからアカウントのパスワードを移行する必要があります。
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
暗号化の形式は「authconfig」コマンドを使用して変更することもできます。
例えば「md5」形式に変更する場合は下記のようにコマンドを実行します。
# authconfig --passalgo=md5 --update
設定変更の確認は「authconfig」コマンドで行えます。
# authconfig --test | grep algo password hashing algorithm is md5
すでに別の暗号化形式でパスワードが設定されているユーザは、次回パスワードを変更した際に設定し直した暗号化形式でパスワードが登録されます。
コメント
とても助かりました!ありがとうございます。
CentOS7をインストールした直後に一般ユーザーを登録したのですが、
その一般ユーザーからのログインができずに困っていました。
あれこれ検索をしてこちらの記事にたどり着き、
/etc/shadow
の記事を読んで原因を突き止め、おかげさまで解決しました。
なぜか、rootとは異なり、一般ユーザーのパスワードには先頭に”$6$”がついていない状態で保存されていたことに気づき、
「ユーザのパスワード設定・変更方法」
の記事を見ながら一般ユーザーのパスワードを変更したところ、
/etc/shadow
の一般ユーザーのパスワードには先頭に”$6$”がつき、
無事にログインもすることができるようになりました。
解決してとても嬉しかったので、お礼を申し上げる次第です。
長文失礼しました。
神田算数・数学教室さん
コメントありがとうございます。
お役に立てたようでうれしく思います。