UNIXのパスワードファイルのお話

ちょっと必要になったので、UNIXのパスワードファイルに関して調べたことのまとめ。


Linux のパスワードファイルは /etc/passwd が基本で、Shadowパスワードシステムを使用していると、/etc/shadow にDESなどでエンコードされたパスワードが記録される。 Shadowパスワードシステムは最近の CentOS とかなら標準だが、昔は別途インストールする必要があった様子。


passwdファイルは「:」で区切られ「username:passwd:UID:GID:full_name:directory:shell」の用になっている。

username:ログイン名
passwd:エンコードされたパスワード、shadowを使う場合は「x」だけ
UID:ユーザID
GID:グループID
full_name:ユーザの名前、それ以外のコメントみたいなのでも可
directory:ユーザのホームディレクトリ
shell:ログインシェル

shadowファイルも同じようにコロンで区切られ、「username:passwd:last:may:must:warn:expire:disable:reserved」となっている

username:ログイン名
passwd:エンコードされたパスワード
last:1970年1月1日からパスワード最後変更日までの日数
may:パスワード変更できるようになるまでの日数
must:現在のパスワードの最大有効日数
warn:パスワードの期限切れの前に警告を出す日数
expire:パスワードが期限切れ後、アカウントがロックされるまでの日数
disable:1970年1月1日からアカウントが使用できなくなるまでの日数
reserved:将来使うときのために予約

となっている。


この passwd ファイルだけを使う方法と、shadow パスワードシステムを使う方法の切り替えは passwd ファイルにエンコードされたパスワードを記載するかしないかで切り替えることができ、passwd から shadow の生成、shadow から passwd の生成はそれぞれ pwconv、pwunconv で行うことができる。

ちなみに同じように /etc/group にも gshadow があって、それも grpconv と grpunconv で変換できる様子。


変換まえには pwck、grpck などのコマンドを使用してパスワードファイルの不整合をチェックしておくのがベスト。



FreeBSD のパスワードファイルは /etc/passwd と /etc/master.passwd ファイルの2つがある。 master.passwd が、 shadow に相当し、こちらの方にエンコードされたパスワードリストが記載されていて、passwdファイルはパスワードの部分が「*」に置き換えられたものになっている。


master.passwdファイルの1行は「username:passwd:UID:GID:class:change:expire:gecos:directory:shell」となっている。

username:ログイン名
passwd:パスワード
UID:ユーザID
GID:グループID
class:ログインクラス
change:パスワードの変更が必要になるまでのUTC基準点からの秒数
expire:アカウントの有効期限、これもUTC基準点からの秒数
gecos:ユーザ名とかユーザの一般的な情報、さらに「,」で区切って、「name,office,wphone,hphone」が設定できる。
  name:フルネーム
  office:オフィス番号
  wphone:職場の電話番号
  hphone:自宅の電話番号
directory:ユーザのホームディレクトリ
shell:ログインシェル

となっている。


Linux の方は最悪パスワードファイルを直接普通のエディタを使って手編集するのもありだけど、FreeBSD の方ではもし master.passwd をシステムで用意されている vipw とか pw とか adduser とかを使わずにエディタなどで編集しても、その変更は反映されない。


master.passwd がパスワードファイルのもとファイルなんだけど、システムが見ているのはその master.passwd から生成された /etc/pwd.db、/etc/spwd.db を見てログイン情報を得ている。


なので、master.passwd を手編集したら、そのあとは必ず pwd_mkdb コマンドを使って pwd.db、spwd.db をつくり直す必要がある。 vipw とか使えば自動的に pwd_mkdb が実行されるのでそう言う手間なことをする必要はない。


master.passwd にしても shadow にしても、パスワード自体の部分は crypt を使ってエンコードされているので、FreeBSDLinux で互換性はある。 よってアカウントのフィールドを適切に変更することで、パスワードファイルをほぼそのまま流用することができる。


簡単なのは、LinuxFreeBSD なら /etc/passwd と /etc/shadow から master.passwd の形式でファイルをつくり、それを FreeBSD の /etc/master.passwd に追加して、pwd_mkdb を実行。


FreeBSDLinux なら /etc/master.passwd から /etc/passwd に合せたエンコードされたパスワード部分も含めたパスワードファイルをつくり、それを /etc/passwd に追加して、pwconv を実行となる。


これで FreeBSD サーバから Linux へユーザアカウントを移す作業のめどついた。