selinux-policy が存在しないことが原因でログインできない場合の復旧手順

【環境】
$ cat /etc/redhat-release
CentOS Linux release 8.2.2004 (Core)

症状

タイトルに原因を書いてしまってるけど、次のような症状で相談を受けた。

  • OSインストール後、SELinuxは無効化にしていた

 (/etc/selinux/config で SELINUX=disabled にしていた)

  • その後、SELinuxを使ってみようと SELINUX=permissive にした
  • OSは起動するようだが、ログインできない


/etc/selinux/config にて、SELINUX ではなく SELINUXTYPE の方に設定値を書いてしまうという、よくある(?)ミスではない。


OS起動時のコンソールを見ていると、以下のような FAILED/DEPEND を出している。
( [OK] の行は省略)

しかも、起動時間は数分と結構長い。

[FAILED] Failed to start Import network configuration from initramfs.
[FAILED] Failed to start Authorization Manager.
[DEPEND] Dependency failed for Dynamic System Tuning Daemon.
[FAILED] Failed to start Network Manager.
[DEPEND] Dependency failed for Network Manager Wait Online.
[FAILED] Failed to start Login Service.


ネットワークサービスの起動にも失敗しているので、SSHで接続できない。

最後の方に表示される「Failed to start Login Service.」に関しては、表示されてすぐに login プロンプトに表示が切り替わってしまうので、2回見るまで気付かなかった。


この状態でログインしようとすると、どのようなユーザアカウントでも、ログインできない。

root ユーザでログインを試した場合、

Unable to get valid context for root

とメッセージが表示され、暫く応答が無くなる。

その後、

timed out after 60 second

と表示されて login プロンプトに戻り、ログインできない。


正常になった後で確認してみると、/var/log/messages には次のようなログが残っていた。

Sep 12 21:59:19 cent8 dbus-daemon[898]: dbus[898]: Failed to start message bus: Failed to open "/etc/selinux/targeted/contexts/dbus_contexts": No such file or directory

解決手順

通常の手順ではログインできないので、シングルユーザモードで起動する。

まずは、OSをどうにかして再起動する。
物理筐体なら電源長押しなど、仮想なら仮想ホスト側から停止。


OS起動時のカーネルの選択画面のところで、e キーを押し、GRUBのパラメータ編集画面に入る。

linux ($root)/vmlinuz-.... の行の最後に以下をを追加し、Ctrl-x を押して起動する。

rw init=/bin/sh

入力は英語キーボードになるので 「=」 は「^」のキーを押すと入力できる。

途中にある「ro」を消すのが一般的(?)な手順かと思うが、末尾に追記したら動作した。
(この手順が正しいのかは不明)

なお、シングルユーザモードの指定方法は、

になっている。


シングルユーザモードでログインした状態になるので、

/etc/selinux/config
 ↓
SELINUX=disabled

の設定に変更する。

設定保存後、OSを再起動する。

# exec /sbin/init


これで、SELinuxを無効にしてOSが起動する状態まで復帰できる。

SELINUX=permissive でも動作しない原因を探るため、rpm コマンドでselinux 関連のパッケージの導入状況を確認。


正常に動作するサーバ

# rpm -qa | grep -i selinux
libselinux-utils-2.9-3.el8.x86_64
libselinux-2.9-3.el8.x86_64
rpm-plugin-selinux-4.14.2-37.el8.x86_64
selinux-policy-targeted-3.14.3-41.el8_2.5.noarch
selinux-policy-3.14.3-41.el8_2.5.noarch
python3-libselinux-2.9-3.el8.x86_64

正常な動作をしなかったサーバ

# rpm -qa | grep -i selinux
libselinux-utils-2.9-3.el8.x86_64
libselinux-2.9-3.el8.x86_64
python3-libselinux-2.9-3.el8.x86_64


正常に動作しない方では、selinux-policy* が無かった。

話を聞いたところ、
SELinux を無効化した時に、要らないと思って selinux-policy* を削除した」
との事で原因判明。

という事で、以下をインストールすると、permissive でも動作するようになる。

# dnf install selinux-policy-targeted selinux-policy