こんにちは!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ログインが正常にできることを確認して下さい。
まとめ
もっと、簡単にできると思って始めてみましたが、やってみると、以外と面倒でした。
でも、一度経験としておくと、いざという時、役に立ちそうですね。
本ブログが似たような境遇のどなたかの一助になれば、嬉しいです。
ではまた!