適当にSELinuxを無効にしたらひどい目にあった話

CentOSが起動しなくなるという、キツめのやらかしについて、自戒を込めて。

#原因：SELinuxの設定ミス

そう、いつもの作業のように、私はCentOS7.4にログインし、SELinuxを恒久無効化しようとしていたのでした。

>[5.4.2. SELINUX の無効化](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/security-enhanced_linux/sect-security-enhanced_linux-enabling_and_disabling_selinux-disabling_selinux)
SELinux を無効にするには、/etc/selinux/config で SELINUX=disabled と設定します。



しかし、正しい「SELINUX」オプションではなく、誤って「SELINUXTYPE」オプションをdisableしてしまったのが不幸の始まりでした。

`vi /etc/selinux/config`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/ef00fb2a-d28c-f968-d27a-8039e63f0589.png)






#上がってこないサーバ
設定が終わったと思い、OSを再起動すると、一向に上がってこない。正しくは、CentOS起動画面から10分待っても動かない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/ef1929fb-2dd7-b6ce-7325-f29c10c2306a.png)


強制的にパワーオフし、コンソール画面を見ていると、[Failed to load SELinux policy.]の文字が・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/fb4e7bec-b543-744b-662f-e4043991a806.png)

ここで、「やっちまったな」と気づきました。

>今回設定をしてしまったのは、[SELUINUXTYPE]オプションで、ユーザやファイルの高度なアクセス制御(MLS等)を行うためのものです。SELinuxはOS起動時にこの設定を読み込み、必要な場合は処理を行います。この設定が存在しない引数の場合、カーネルパニックとなります。
><details><summary>参考</summary><div>
[5.3. 主要設定ファイル](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/security-enhanced_linux/sect-security-enhanced_linux-working_with_selinux-main_configuration_file
)
SELINUXTYPE=targeted
SELINUXTYPE オプションは、使用する SELinux ポリシーを設定します。ターゲットポリシーがデフォルトのポリシーです。MLS ポリシーを使用する場合にのみ、このオプションを変更してください。
<br>

[強制アクセス制御（SELinux）の基礎](https://thinkit.co.jp/article/13296)
MLS（Multi Level Security）
MLSは、カテゴリ別のアクセス制御（MCS）にレベル別のアクセス制御を追加した機能です。ユーザやプロセスがアクセス可能な範囲を詳細に制御でき、非常に高度なセキュリティを実現できます。ただし、運用や管理が大変で、強固なセキュリティを求められる国防／軍事システムなどで利用されるような機能と言えます。

[[fedora WIKI]SELinux/Config](https://fedoraproject.org/wiki/SELinux/Config)
When booting up the machine, init uses libselinux to read this file, and determines which policy to load and what mode to put the machine in.*
></div></details>






#シングルユーザーモードでのログイン
もう二度とログインできないねえ・・・を素でやらかしてしまったので、grubからシングルユーザモードで無理やりログインしようとしました。
>後で調べたのですが、grubカーネルオプションで[SELinux=0]とする方法も効くようですね。
[Centos7：grubからSELinuxを無効にして起動する](https://okisanjp.hatenablog.jp/entry/archives/771)

#仮想コンソールがエラーで落ちまくる
grubを操作してシングルユーザモードでログインするためには、電源をONしてから急速に操作を行う必要があります。

今回のサーバはESXi6.5上のVMで、vSphere Web ClientのWeb仮想コンソールで操作しようとしていたのですが、OSの電源を入れ、grub画面を操作しようとWeb仮想コンソールを起動するたびに、以下のメッセージが出てしまいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/f0425d1c-a72a-8a5e-ea4b-6019bf7cad31.png)

```
予期しないエラーが発生しました。
クライアントは機能し続ける可能性がありますが、ここでブラウザを更新し、
バグレポートを送信することを推奨します。
```
この例外ウィンドウに従って[再ロード]を行うと、必ずvSphere Web Clientのログイン画面に戻されるので、ログインしている間にカーネルパニックまで進んでしまっている・・・電源落とす・・・電源上げる・・・を繰り返す・・・という拷問をしこたま味わいました。



<br>

**【解決策：ESCキーでウインドウを閉じる】**
これは20分ほど格闘している中で偶然発見した系なので、公式ナレッジではないですが、この例外ウィンドウは**ESCキーを押すと消えます。**これで問題なくgrub操作に入ることができました。




#grub起動、カーネルパラメータ変更、OS起動
シングルユーザモードでbashを起動するため、カーネルパラメータを弄ってOSを起動しようという算段でした。

まずはOS選択にて[e]を押してeditモードに入ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/2e0ca58b-4e1c-0f0c-1f29-50e3869a4a5d.png)


[linux16]行のカーネルパラメータの`ro`以降を`rw init=/bin/sh`に書き換えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/28678d22-559b-a1c8-044f-3ce058811473.png)
　これを
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/4e1cdfb7-b3ea-0693-ced6-35286021316f.png)
　こうじゃ

そして、[Ctrl-x]を押すことで、OSが上がり、コマンドを受け付けられるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/79b8640c-bc87-32d0-c098-71c4a5822194.png)


>カーネルパラメータに[init=/bin/sh]を渡して起動させるということは、普段の/etc/inittabの読み込みとかをすっ飛ばしてとりあえずshを起動する、ということのようです。
<details><summary>参考</summary><div>
kernel-parameters.txt
https://www.kernel.org/doc/Documentation/admin-guide/kernel-parameters.txt
<br>
「Systemd」を理解する ーシステム起動編ー
http://equj65.net/tech/systemd-boot/
></div></details>

bashが起動したので、あとは~~rootのパスワードを変更したり、~~やらかした設定を元に戻します。

`vi /etc/selinux/config`

#入力できない:
viで、やらかした設定`SELINUXTYPE=disabled`を`SELINUXTYPE=targeted`に修正後、`:wq`で抜けようとしたところ、何回押しても`:`キーが`;`としか入力されません。

というのも、今回のOS起動方法では、キーボードが英語入力となっているため、日本語キーボードでのキー表示記号と入力内容が全然違っているということが発覚しました。

(そういえばgrubでカーネルパラメータを編集するときも、なんだか記号の=が入力できないなぁ、でも設定付近に=があるから消さずに利活用しよう、とやっちゃってました)

もちろん、[日本語キーボードと英語キーボードの違い](https://users.miraclelinux.com/support/?q=node/154)を鑑みて押してもよいのですが、私の愛する東プレ REALFORCEでは**残念ながら全てのキーをshiftなし/ありで試しても、`:`と`=`が入力されない**という謎トラップが仕掛けられていたのでした。



<br>
**【解決策：記号を使わずに保存する】**

これも不勉強で今回知ったのですが、viには`:wq`以外にも`ZZ`で上書き保存できるとのこと。無かったら終わってた。これで保存を敢行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/6e8d14df-b4f4-44c6-087f-0ea96862dc98.png)

無事、保存ができました。再起動してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/478acf74-194f-94af-05ca-5fe7aa981a29.png)


問題なく起動し、回復しました。解決です！

#最後に
たかがconfig、されどconfig、シンプルに猛省しました。
今回は手元の検証環境でしたが、コンソールが現地にしかないリモート環境だったらと思うと、本当にやべぇやらかしでした。
設定後には必ず想定configとの突合確認を行います・・・

#参考
5.4.2. SELINUX の無効化
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/security-enhanced_linux/sect-security-enhanced_linux-enabling_and_disabling_selinux-disabling_selinux

5.3. 主要設定ファイル
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/security-enhanced_linux/sect-security-enhanced_linux-working_with_selinux-main_configuration_file

強制アクセス制御（SELinux）の基礎
https://thinkit.co.jp/article/13296

[fedora WIKI]SELinux/Config
https://fedoraproject.org/wiki/SELinux/Config

SELinux 覚書
https://qiita.com/JhonnyBravo/items/2012250c1cec9a682b86

SELinuxを無効にした後、Kernel panicになり起動できなくなった
https://www.ipentec.com/document/linux-boot-kernel-panic-after-selinux-disabled

Centos7：grubからSELinuxを無効にして起動する
https://okisanjp.hatenablog.jp/entry/archives/771

SELinux再入門-基礎編-
https://www.ffri.jp/assets/files/monthly_research/MR201406_A%20Re-introduction%20to%20SELinux_JPN.pdf

25.10. ブート中のターミナルメニューの編集
Red Hat Enterprise Linux 7 では、レスキューモードはシングルユーザーモードと同等であり、root パスワードを必要とします。
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/sec-terminal_menu_editing_during_boot

CentOS7 シングルユーザモードでrootのパスワードを変更する
https://it.rin-ka.net/centos7-single-mode/

rootパスワードをリセットする
https://www.server-world.info/query?os=CentOS_7&p=resetpass

シリアル コンソールを使用して GRUB とシングル ユーザー モードにアクセスする
https://docs.microsoft.com/ja-jp/azure/virtual-machines/troubleshooting/serial-console-grub-single-user-mode

「Systemd」を理解する ーシステム起動編ー
http://equj65.net/tech/systemd-boot/

kernel-parameters.txt
https://www.kernel.org/doc/Documentation/admin-guide/kernel-parameters.txt

26.3. シングルユーザーモードでブートする(grub legacy)
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/5/html/installation_guide/s1-rescuemode-booting-single

Red Hat Enterprise Linux - シングルユーザモードで起動したい(grub legacy)
https://support.hpe.com/hpsc/doc/public/display?docId=emr_na-c01982340

GRUB でイコール "=" を入力する方法
https://users.miraclelinux.com/support/?q=node/154