晴耕雨読

working in the fields on fine days and reading books on rainy days

SELinuxを有効化する

SELinuxを有効化する方法について説明します。 設定ファイルを SELINUX=enforcing に修正して再起動する方法と、setenforce で一時的に有効化する方法があります。

ブートローダーの設定でSELinuxが有効

まず、以下のコマンドで出力がないことを確認します。

~]# grep -E 'kernelopts=(\S+\s+)*(selinux=0|enforcing=0)+\b' /boot/grub2/grubenv

もし出力がある場合は、ブートローダーの設定でSELinuxが無効化されているので、SELinuxの設定ファイルである /etc/selinux/config を編集しても無駄になります。 修正するには /etc/default/grub ファイルの変数 GRUB_CMDLINE_LINUX_DEFAULT や GRUB_CMDLINE_LINUX から selinux=0enforcing=0 の文字列を削除した後、以下のコマンドを実行します。

~]# grub2-mkconfig -o /boot/grub2/grub.cfg

そして、システムを再起動します。

DisabledモードからSELinuxを有効化

Disabledモード(SELinux無効化)から、有効化するには /etc/selinux/config を修正して、SELINUX=enforcing にしてから再起動する必要があります。 setenforce コマンドはDisabledモードのときは使用できません。

~]# getenforce
Disabled
~]# setenforce 0
setenforce: SELinux is disabled
~]# setenforce 1
setenforce: SELinux is disabled

設定ファイルで SELINUX=enforcing を指定します。

/etc/selinux/config

#SELINUX=disabled
SELINUX=enforcing
SELINUXTYPE=targeted

サーバを再起動します。

~]# reboot

DisableからPermissiveまたはEnforcingモードにする際は、Relabelingが発生するので再起動するのに時間がかかります。

再起動時のSELinuxを有効化中のログ:

selinux-autorelabel[796]: *** Warning -- SELinux targeted policy relabel is required.
selinux-autorelabel[796]: *** Relabeling could take a very long time, depending on file system size and speed of hard drivers

PermissiveモードからSELinuxを有効化

Permissive(SELinuxのアクセス拒否ログのみ記録するモード)では、setenforce コマンドでSELinuxを有効化することができます。

~]# getenforce
Permissive
~]# setenforce 1
~]# getenforce
Enforcing

setenforceでは再起動すると元の状態に戻るので、永続的にSELinuxを有効化したい場合は、Disabledモードのときと同様に設定を修正して再起動する必要があります。 ラベリングはすでに行われているので、再起動時にRelabelingは発生しないので、特別時間がかかることはないです。

Permissiveの場合は、アクセス拒否ログの記録に permissive=1 と出力されます。

~]# getenforce
Permissive
~]# systemctl restart httpd
~]# tail /var/log/audit/audit.log | grep denied

監査ログ出力結果:

type=AVC msg=audit(0000000000.641:141): avc:  denied  { name_bind } for  pid=1592 comm="httpd" src=3131 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:unreserved_port_t:s0 tclass=tcp_socket permissive=1

Enforcingにした場合は、アクセス拒否ログの記録に permissive=0 と出力され、実際にアクセス拒否が行われます。

~]# setenforce 1
~]# getenforce
Enforcing
~]# systemctl restart httpd
Job for httpd.service failed because the control process exited with error code.
See "systemctl status httpd.service" and "journalctl -xe" for details.
~]# tail /var/log/audit/audit.log | grep denied

監査ログ出力結果:

type=AVC msg=audit(0000000000.747:146): avc:  denied  { name_bind } for  pid=1841 comm="httpd" src=3131 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:unreserved_port_t:s0 tclass=tcp_socket permissive=0

Enforcingモード

EnforcingはSELinuxが有効でアクセス拒否も実施するモードです。 setenforce コマンドで一時的にSELinuxを無効化(監査ログのみ記録)することもできますが、再起動するとEnforcingモードに戻ります。

~]# getenforce
Enforcing
~]# setenforce 0
~]# getenforce
Permissive
~]# setenforce 1
~]# getenforce
Enforcing

以上です。