SELinuxの無効化ミスでEC2起動不可になった際の対応

記事タイトルとURLをコピーする

こんにちは!CSM課の岩渕です。
SELinuxの無効化ミスによりEC2(Red Hat Linux 8)が起動できなくなったという事象に遭遇したので、対応方法を検証してみました。

補足:
ミドルウェアのインストール時やプログラムの実行において、SELinuxの無効化が要求される場合がありますが、無効化するとセキュリティレベルは落ちる可能性があるので、その点は認識しておく必要があります。

事象

Red Hat Linux 8(RHEL8)で SELinuxを無効化するために /etc/selinux/configに
「SELINUX=disabled」を設定すべきところ、誤って
「SELINUXTYPE=disabled」に設定してしまった。
その後、停止→起動しようとしたところ、正常起動できなくなった。

[ec2-user@ip-172-17-47-21 ~]$ cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=disabled
[ec2-user@ip-172-17-47-21 ~]$

インスタンスの状態は「running」になっていますが、ステータスチェックが1/2になっています。

システムログから何が起きているか確認してみましょう。

最終行付近に「Failed to load SELinux policy.」が確認できました。
これによりSELinuxの設定ミスにより起動できない状態であることが分かりました。

対処概要

今回は、以下の方法で対処してみました。
1.RHEL8を停止
2.RHEL8からボリュームをデタッチ
3.SSH接続可能な適当なインスタンス(AmazonLinux2)に、RHEL8のボリュームをアタッチ
4.AmazonLinux2でRHEL8のボリュームをマウント
5.AmazonLinux2でRHEL8のSELinuxの設定を修正
6.AmazonLinux2からRHEL8のボリュームをデタッチ
7.RHEL8にRHEL8のボリュームをアタッチし直し
8.RHEL8を起動

では、やってみましょう!

RHEL8の停止

RHEL8のEC2インスタンスを停止します。
通常の停止時間よりかなり時間(5分ほど)がかかりました。
※念のため、停止後に、当該インスタンスのボリュームのスナップショットを作成しました。

RHEL8からボリュームをデタッチ

RHEL8からボリュームをデタッチします。
デタッチするとボリュームの状態が「available」に変わります。
※デタッチ前にRHEL8のインスタンス画面から現状のデバイス名をメモしておいて下さい。
 本例では「/dev/sda1」です。最終工程で使用します。

SSH接続可能な適当なインスタンスにRHEL8のボリュームをアタッチ

SSH接続可能な適当なインスタンスとして、既に稼働中のAmazonLinux2を使用します。
上記でデタッチしたRHEL8のボリュームを、稼働中のAmazonLinux2にアタッチします。

「ボリュームのアタッチ」画面で以下を設定してアタッチします。
インスタンス:稼働中のAmazonLinux2のインスタンス
デバイス:デフォルト

アタッチが完了するとボリュームの状態が「in-use」に代わり、
AmazonLinux2のインスタンス画面で「ブロックデバイス」にデバイスが追加されたことが確認できます。

AmazonLinux2からブロックデバイスの一覧を確認しましょう。
ボリュームアタッチ前:

[ec2-user@ip-172-17-47-24 ~]$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk 
└─xvda1 202:1    0   8G  0 part /
[ec2-user@ip-172-17-47-24 ~]$ 

ボリュームアタッチ後:

[ec2-user@ip-172-17-47-24 ~]$ lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
xvda    202:0    0    8G  0 disk 
└─xvda1 202:1    0    8G  0 part /
xvdf    202:80   0  200G  0 disk 
├─xvdf1 202:81   0    1M  0 part 
└─xvdf2 202:82   0  200G  0 part 
[ec2-user@ip-172-17-47-24 ~]$ 

また、ボリュームにファイルシステム(XFS)があることを確認します。
今回は、/dev/xvdf2がマウント対象となるので、それが確認できればOKです。

[ec2-user@ip-172-17-47-24 ~]$ sudo file -s /dev/xvdf2
/dev/xvdf2: SGI XFS filesystem data (blksz 4096, inosz 512, v2 dirs)
[ec2-user@ip-172-17-47-24 ~]$ 

AmazonLinux2でRHEL8のボリュームをマウント

マウントポイントディレクトリを作成し、アタッチしたボリュームをマウントします。
dmesgからエラーが発生していないこと、またdfコマンドで正常にマウントできたことを確認します。

[ec2-user@ip-172-17-47-24 ~]$ sudo mkdir /data
[ec2-user@ip-172-17-47-24 ~]$ sudo mount /dev/xvdf2 /data
[ec2-user@ip-172-17-47-24 ~]$ 
[ec2-user@ip-172-17-47-24 ~]$ dmesg |tail
[ 8344.943502] XFS (xvdf2): EXPERIMENTAL reflink feature enabled. Use at your own risk!
[ 8344.949041] XFS (xvdf2): Mounting V5 Filesystem
[ 8344.968604] XFS (xvdf2): Ending clean mount
[ec2-user@ip-172-17-47-24 ~]$ 
[ec2-user@ip-172-17-47-24 ~]$ df -T
Filesystem     Type     1K-blocks    Used Available Use% Mounted on
devtmpfs       devtmpfs    485468       0    485468   0% /dev
tmpfs          tmpfs       503480       0    503480   0% /dev/shm
tmpfs          tmpfs       503480     412    503068   1% /run
tmpfs          tmpfs       503480       0    503480   0% /sys/fs/cgroup
/dev/xvda1     xfs        8376300 1133504   7242796  14% /
tmpfs          tmpfs       100696       0    100696   0% /run/user/1000
/dev/xvdf2     xfs      209702892 2449436 207253456   2% /data
[ec2-user@ip-172-17-47-24 ~]$ 

AmazonLinux2でマウントしたRHEL8のSELinuxの設定を修正

マウントディレクトリ配下のSELinux設定ファイル(etc/selinux/config)を正しい設定値に修正し、その後、マウント解除します。

[ec2-user@ip-172-17-47-24 ~]$ ll /data/etc/selinux/config
-rw-r--r--. 1 root root 548 Apr 13 07:39 /data/etc/selinux/config
[ec2-user@ip-172-17-47-24 ~]$ 
[ec2-user@ip-172-17-47-24 ~]$ sudo vi /data/etc/selinux/config
[ec2-user@ip-172-17-47-24 ~]$ 
[ec2-user@ip-172-17-47-24 ~]$ cat /data/etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
[ec2-user@ip-172-17-47-24 ~]$ 
[ec2-user@ip-172-17-47-24 ~]$ sudo umount /data

AmazonLinux2からRHEL8のボリュームをデタッチ

AmazonLinux2からRHEL8のボリュームをデタッチします。
デタッチするとボリュームの状態が「available」に変わります。

RHEL8にRHEL8のボリュームをアタッチし直し

RHEL8のインスタンスにRHEL8のボリュームをアタッチし直します。
その際、「ボリュームのアタッチ」画面で、以下を設定します。
インスタンス:RHEL8のインスタンス
デバイス:「RHEL8からボリュームをデタッチ」でメモしておいた「デバイス名」

RHEL8を起動

ようやく、RHEL8を起動できました。
ステータスチェックで2/2のチェックに合格、またSSHログインが正常にできることを確認して下さい。

まとめ

もっと、簡単にできると思って始めてみましたが、やってみると、以外と面倒でした。
でも、一度経験としておくと、いざという時、役に立ちそうですね。
本ブログが似たような境遇のどなたかの一助になれば、嬉しいです。
ではまた!