5.19. /etc/shadow ファイルを更新する適切なパーミッションを passwd に与えるにはどうすればいいですか?

残念ながら、簡単な解は存在しません。これは、passwd ユーティリティがパスワードを変更するたびに /etc/shadow ファイルを再作成するからです。これにより、passwd ユーティリティを成功裏に使う度に、違う i ノードからファイルが始まるのです。

システム管理者には、簡単な解決法があります。LFS を開始して、LFS の中から passwd ユーティリティを使うのです。パスワードを変更する必要のあるユーザがいる場合、LDAP を使えば、ユーザが自分のパスワードを変更できるクライアント認証手段を提供してくれます。

標準的 unix システムファイルを使って、UNIX 認証をする時に、ユーザが自分のシステムパスワードを変更できるようにする選択肢があります。ですが、お勧めはできません/usr/bin/passwd に /etc への書きこみアクセスを与えれば、いつでも shadow ファイルをその i ノード番号に関わらず修正できるようになります。

警告: 誰かが /usr/bin/password や、それが使うライブラリ/PAM モジュールの何れかに脆弱性を発見すれば、その人は潜在的に /etc ディレクトリへの書きこみアクセスを得ることができます。 脆弱性が見つかれば、あなたのアクセス制御を出し抜くことができるわけで、これはそもそも MAC を用いる目的を無駄にするものです。このオプションは自己の裁量で使うようにしてください。

/usr/bin/passwd/etc への書きこみアクセスを与えることにしたのなら、/etc の下にあって、/usr/bin/passwd が修正できるようにしたくないファイルとディレクトリ全てを保護する ACL を作成することをお勧めします。 これにより、上記のリスクが著しく減少します (しかも正確に行えば、完全に取り除くこともできます)。 例えば:
/sbin/lidsconf -A -s /usr/bin/passwd -o /etc                     -j WRITE
/sbin/lidsconf -A -s /usr/bin/passwd -o /etc/hosts.allow         -j READONLY
/sbin/lidsconf -A -s /usr/bin/passwd -o /etc/hosts.deny          -j READONLY
/sbin/lidsconf -A -s /usr/bin/passwd -o /etc/rc0.d               -j READONLY
/sbin/lidsconf -A -s /usr/bin/passwd -o /etc/rc1.d               -j READONLY
/sbin/lidsconf -A -s /usr/bin/passwd -o /etc/rc2.d               -j READONLY
/sbin/lidsconf -A -s /usr/bin/passwd -o /etc/rc3.d               -j READONLY
/sbin/lidsconf -A -s /usr/bin/passwd -o /etc/rc4.d               -j READONLY
/sbin/lidsconf -A -s /usr/bin/passwd -o /etc/rc5.d               -j READONLY
/sbin/lidsconf -A -s /usr/bin/passwd -o /etc/rc6.d               -j READONLY
/sbin/lidsconf -A -s /usr/bin/passwd -o /etc/init.d              -j READONLY
/sbin/lidsconf -A -s /usr/bin/passwd -o /etc/cron.d              -j READONLY
/sbin/lidsconf -A -s /usr/bin/passwd -o /etc/pam.d               -j READONLY
...
上は、どんなに想像力を逞しくしたところで完全なリストではありませんが、きっかけにはなります。/etcpasswd にアクセスさせたくないファイルやディレクトリを追加したときはいつでも、それを保護する新しい ACL を作らねばならないことも、頭に入れておいてください。

i ノードの更新に関するメモ: /etc/shadow/etc/passwd へのアクセスを許可する ACL を定義したなら、LIDS にi ノードを更新したことを知らせ、それから設定ファイルを リロードするのを忘れないようにしなければなりません。さもないと、問題が生じることになります。

例えば:/etc/passwd が DENY で保護されており、/bin/login/etc/passwd を読めるものとします。パスワードを変更した後、i ノードが更新されなければ、誰かが次回ログインしようとした時に問題が発生します。/bin/login/etc/passwd を読みこむことができず、ログインが不可能になります。あるいはさらに酷く、単に <ENTER> キーを押すだけでログインできるようになってしまうのです。