5.4. SELinux の有効化および無効化

SELinux のステータスをチェックするには、getenforce または sestatus コマンドを使います。getenforce コマンドは、EnforcingPermissiveDisabled のいずれかを返します。getenforce コマンドは、SELinux が有効な際に (SELinux ポリシールールが強制されている際に) Enforcing を返します。
~]$ getenforce
Enforcing
getenforce コマンドは、SELinux が有効ではあるものの SELinux ポリシールールが強制されておらず DAC ルールのみが使用されている場合に Permissive を返します。SELinux が無効だと、getenforce コマンドは、Disabled を返します。
sestatus コマンドは、SELinux のステータスと使用されている SELinux ポリシーを返します。
~]$ sestatus
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   enforcing
Mode from config file:          enforcing
Policy version:                 24
Policy from config file:        targeted
SELinux が有効だと、SELinux status: enabled が返されます。SELinux が enforcing モードで実行中だと、Current mode: enforcing が返されます。SELinux ターゲットポリシーが使用されていると、Policy from config file: targeted が返されます。

5.4.1. SELinux の有効化

重要

システムが最初に SELinux なしで、特に selinux-policy パッケージなしでインストールされ、これが後でシステムに追加された場合、SELinux を有効にするには追加のステップが必要になります。システムのスタートアップ時に SELinux が初期化されたことを確認するには、dracut ユーティリティーを実行して SELinux 認識を initramfs ファイルシステムに記載する必要があります。これを行わないと、SELinux がシステムのスタートアップ時に起動しません。
SELinux が無効になっているシステムでは、SELINUX=disabled オプションは /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 two values:
#       targeted - Targeted processes are protected,
#       mls - Multi Level Security protection.
SELINUXTYPE=targeted
また、getenforce コマンドは、Disabled を返します。
~]$ getenforce
Disabled
SELinux を有効にするには、以下の手順にしたがいます。
  1. rpm -qa | grep selinuxrpm -q policycoreutilsrpm -qa | grep setroubleshoot のコマンドを実行して、SELinux パッケージのインストールを確認します。本ガイドでは、以下のパッケージがインストールされていることを前提としています。selinux-policy-targetedselinux-policylibselinuxlibselinux-pythonlibselinux-utilspolicycoreutilspolicycoreutils-pythonsetroubleshootsetroubleshoot-serversetroubleshoot-plugins。これらのパッケージがインストールされていなければ、Linux root ユーザーで yum install package-name コマンドを使ってインストールします。policycoreutils-guisetroubleshootmcstrans の 3 パッケージはオプションです。
  2. SELinux の有効化の前に、ファイルシステム上の全ファイルを SELinux コンテキストでラベル付けする必要があります。これが行われないと、制限のあるドメインはアクセスが拒否される場合があり、システムの正常な起動を妨げます。これを避けるには、/etc/selinux/configSELINUX=permissive と設定します。
    # 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=permissive
    # SELINUXTYPE= can take one of these two values:
    #       targeted - Targeted processes are protected,
    #       mls - Multi Level Security protection.
    SELINUXTYPE=targeted
    
  3. Linux root ユーザーで reboot コマンドを実行してシステムを再起動します。次回の起動時に、ファイルシステムがラベル付けされます。このラベルプロセスでは、全ファイルに SELinux コンテキストがラベル付けされます。
    *** Warning -- SELinux targeted policy relabel is required.
    *** Relabeling could take a very long time, depending on file
    *** system size and speed of hard drives.
    ****
    
    一番下の行の * (アスタリスク) 記号はそれぞれ、ラベル付けされた 1000 ファイルを表します。上記の例では、4 つの * 記号はラベル付けされた 4000 ファイルを表しています。全ファイルにラベル付けする時間はシステム上のファイル数とハードディスクドライブの速度によって異なります。最近のシステムでは、このプロセスは 10 分程度で終わります。
  4. permissive モードでは、SELinux ポリシーは強制されませんが、enforcing モードであれば拒否されたであろうアクションについては拒否がログに記録されます。enforcing モードに変更する前に、Linux root ユーザーで grep "SELinux is preventing" /var/log/messages コマンドを実行して、SELinux が最後の起動時にアクセスを拒否しなかったことを確認します。最後の起動時にアクセス拒否がなかった場合は、このコマンドに返される出力はありません。起動時に SELinux がアクセスを拒否していた場合は、トラブルシューティング情報を 8章トラブルシューティング で参照してください。
  5. /var/log/messages に拒否メッセージがない場合は、/etc/selinux/configSELINUX=enforcing と設定します。
    # 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 two values:
    #       targeted - Targeted processes are protected,
    #       mls - Multi Level Security protection.
    SELINUXTYPE=targeted
    
  6. システムを再起動して、getenforce コマンドが Enforcing を返すことを確認します。
    ~]$ getenforce
    Enforcing
    
  7. Linux root ユーザーで semanage login -l コマンドを実行し、SELinux ユーザーと Linux ユーザー間のマッピングを表示します。出力は以下のようになります。
    Login Name                SELinux User              MLS/MCS Range
    
    __default__               unconfined_u              s0-s0:c0.c1023
    root                      unconfined_u              s0-s0:c0.c1023
    system_u                  system_u                  s0-s0:c0.c1023
    
このような出力にならない場合は、Linux root でユーザーマッピングを修正します。SELinux-user username is already defined 警告を無視しても問題ありません。ここでの username は、unconfined_uguest_uxguest_u のいずれかになります。
  1. semanage user -a -S targeted -P user -R "unconfined_r system_r" -r s0-s0:c0.c1023 unconfined_u
  2. semanage login -m -S targeted -s "unconfined_u" -r s0-s0:c0.c1023 __default__
  3. semanage login -m -S targeted -s "unconfined_u" -r s0-s0:c0.c1023 root
  4. semanage user -a -S targeted -P user -R guest_r guest_u
  5. semanage user -a -S targeted -P user -R xguest_r xguest_u

重要

SELinux の permissive または disabled モードでシステムが稼働している場合、ユーザーにはファイルを誤ってラベル付けするパーミッションがあります。また、SELinux が無効の間に作成されたファイルにはラベル付けがされません。enforcing モードに変更すると、これが問題になります。間違ったラベルが付いたファイルやラベルなしのファイルが問題を起こさないように disabled モードから permissive モードや enforcing モードに変更すると、ファイルシステムは自動的に再ラベル付けが行われます。