免責事項:この質問は、SELinuxがアクティブなときにrootパスワードを変更する問題を解決するためのものではありません。すでに解決するためのガイドがたくさんあるためです。これは、SELinuxが内部で行う方法の詳細です。
私は最近SELinuxを使用していますが、最近はもっと連絡を取り合っています。 rootのパスワードを忘れた場合にどうしたらリセットできるかと誰かが私に尋ねた瞬間がありました。
CentOSを起動し、grubエントリを次のように編集しました
linux16 <kernel_location> root=/dev/mapper/centos-root rw init=/bin/bash
私はpasswd
を実行し、その後sync
を実行して強制的に再起動しました。再起動後、古いパスワードだけでなく、新しいパスワードでのログインも拒否されました。
再度再起動し、SELinuxを無効にするパラメーター(selinux=0
)をカーネルに渡しました。新しいパスワードでログインしてみましたが、うまくいきました。その後、fsの自動ラベル変更を(.autorelabel
ファイルを介して)強制し、SELinuxがアクティブな状態でログインできるようになりました。
私の質問は、なぜ起こるのですか?ユーザーまたはオブジェクトではなく、パスワードの変更のみがあった場合に、再ラベル付けがログインに影響を与えるのはなぜですか?
ご清聴ありがとうございました。
TL; DR:通常のrootパスワードのリセットは、SELinuxでは機能しません。どうして?
編集:これは、ハイパーバイザーとしてKVMを使用してCentOS7を実行している仮想マシンでテストされました。
新しくインストールしたCentOS 7.5システムでこの問題を再現できました。
これが起こっていることです:
init=/bin/bash
で起動すると、2つの問題が発生する可能性があります。
ルートファイルシステムは読み取り専用でマウントできます。この場合、passwd
はAuthentication token manipulation error
に文句を言います。
これは非常に明白です。ファイルシステムが読み書き可能にマウントされていない場合、ファイルシステムに書き込むことはできません。
SELinuxポリシーがロードされていない可能性があります。この場合、passwd
はパスワードを正常に変更しますが、上記の元の質問で説明されている問題が発生します。誰もログインできません。
パスワードハッシュは/etc/shadow
ファイルに保存されます。このファイルは通常、SELinuxタイプshadow_t
です。ただし、SELinuxポリシーがロードされていないときにファイルを変更すると、SELinuxタイプがファイルから削除され、unlabeled_t
のままになります。したがって、ログインを認証するためにファイルを読み取ろうとするサービスは、それを読み取ることができなくなります。
したがって、RHEL/CentOS 7でrootパスワードを変更するには、次のプロセスに従う必要があります。
init=/bin/bash
をgrubのカーネルコマンドラインの最後に追加します。/usr/sbin/load_policy -i
を使用してSELinuxポリシーをロードします。mount -o remount,rw /
で読み書き可能にマウントします。passwd root
mount -o remount,ro /
を使用して次回の起動時にクリーンなファイルシステムを作成します。exec /sbin/init 6
を使用してシステムを再起動します。これで、変更したrootパスワードでログインできます。
この手順の詳細な説明 はRed Hatから入手できます(サブスクリプションが必要です)。