5.7.2. 永続的な変更: semanage fcontext

semanage fcontext コマンドは、ファイルの SELinux コンテキストを変更します。ターゲットポリシーを使用している場合、このコマンドによる変更が file_contexts にあるファイルになされると /etc/selinux/targeted/contexts/files/file_contexts ファイルに追加され、/web/ ディレクトリー作成時など、新規ファイルやディレクトリーの変更の場合は file_contexts.local に追加されます。ファイルシステムの再ラベリング時に使用される setfiles コマンドと、デフォルトの SELinux コンテキストを復元する restorecon コマンドは、これらのファイルを読み取ります。つまり、semanage fcontext コマンドによる変更は、ファイルシステムが再ラベル付けされても永続的なものとなります。SELinux ポリシーは、ユーザーが特定のファイルの SELinux コンテキストを修正できるかどうかを制御します。
クイックリファレンス
ファイルシステムが再ラベル付けされても SELinux コンテキストの変更が維持されるには、以下の手順を実行します。
  1. semanage fcontext -a options file-name|directory-name コマンドを実行します。ファイルもしくはディレクトリーへのフルパスを使用します。
  2. restorecon -v file-name|directory-name コマンドを実行し、コンテキストの変更を適用します。
ファイルのタイプの変更
以下の例では、SELinux コンテキストの属性のうち、ファイルのタイプのみを変更しています。
  1. Linux root ユーザーで touch /etc/file1 コマンドを実行し、新規ファイルを作成します。デフォルトでは、/etc/ ディレクトリー内の新規ファイルは etc_t タイプのラベルが付けられます。
    ~]# ls -Z /etc/file1
    -rw-r--r--  root root unconfined_u:object_r:etc_t:s0       /etc/file1
    
  2. Linux root ユーザーで semanage fcontext -a -t samba_share_t /etc/file1 コマンドを実行し、file1 タイプを samba_share_t に変更します。-a オプションは新規レコードを追加し、-t オプションはタイプ (samba_share_t) を定義します。注記: このコマンドの実行は直接にはタイプを変更しません—file1etc_t タイプのラベル付けがされたままです。
    ~]# semanage fcontext -a -t samba_share_t /etc/file1
    ~]# ls -Z /etc/file1 
    -rw-r--r--  root root unconfined_u:object_r:etc_t:s0       /etc/file1
    
    semanage fcontext -a -t samba_share_t /etc/file1 コマンドが以下のエントリーを /etc/selinux/targeted/contexts/files/file_contexts.local に追加します。
    /etc/file1    unconfined_u:object_r:samba_share_t:s0
    
  3. Linux root ユーザーで restorecon -v /etc/file1 コマンドを実行し、タイプを変更します。semanage コマンドは /etc/file1 のエントリーを file.contexts.local に追加するので、restorecon コマンドはタイプを samba_share_t に変更します。
    ~]# restorecon -v /etc/file1
    restorecon reset /etc/file1 context unconfined_u:object_r:etc_t:s0->system_u:object_r:samba_share_t:s0
    
  4. Linux root ユーザーで rm -i /etc/file1 コマンドを実行し、file1 を削除します。
  5. Linux root ユーザーで semanage fcontext -d /etc/file1 コマンドを実行し、/etc/file1 に追加されたコンテキストを削除します。
ディレクトリーのタイプ変更
以下の例では、新規ディレクトリーの作成と、そのディレクトリーのファイルタイプを Apache HTTP Server が使用するタイプに変更する方法を示します。
  1. Linux root ユーザーで mkdir /web コマンドを実行し、新規ディレクトリーを作成します。このディレクトリーには default_t タイプのラベルが付けられます。
    ~]# ls -dZ /web
    drwxr-xr-x  root root unconfined_u:object_r:default_t:s0 /web
    
    ls -d オプションは、ls にコンテンツではなくディレクトリーについての一覧情報を作成させ、-Z オプションは ls に SELinux コンテキスト (この例では unconfined_u:object_r:default_t:s0) を表示させます。
  2. Linux root ユーザーで semanage fcontext -a -t httpd_sys_content_t /web コマンドを実行し、/web/ タイプを httpd_sys_content_t に変更します。-a オプションは新規レコードを追加し、-t オプションはタイプ (httpd_sys_content_t) を定義します。注記: このコマンドの実行は直接にはタイプを変更しません—/web/default_t タイプのラベル付けがされたままです。
    ~]# semanage fcontext -a -t httpd_sys_content_t /web
    ~]# ls -dZ /web 
    drwxr-xr-x  root root unconfined_u:object_r:default_t:s0   /web
    
    semanage fcontext -a -t httpd_sys_content_t /web コマンドが以下のエントリーを /etc/selinux/targeted/contexts/files/file_contexts.local に追加します。
    /web    unconfined_u:object_r:httpd_sys_content_t:s0
    
  3. Linux root ユーザーで restorecon -v /web コマンドを実行し、タイプを変更します。semanage コマンドは /web のエントリーを file.contexts.local に追加するので、restorecon コマンドはタイプを httpd_sys_content_t に変更します。
    ~]# restorecon -v /web
    restorecon reset /web context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    
    デフォルトでは、新規作成のファイルおよびディレクトリーは、親フォルダの SELinux タイプを引き継ぎます。この例では、/web/ に追加された SELinux コンテキストを削除する前は、/web/ ディレクトリーに作成されたファイルとディレクトリーは httpd_sys_content_t タイプのラベル付けがされています。
  4. Linux root ユーザーで semanage fcontext -d /web コマンドを実行し、/web/ に追加されたコンテキストを削除します。
  5. Linux root ユーザーで restorecon -v /web コマンドを実行し、デフォルトの SELinux コンテキストを復元します。
ディレクトリーおよびコンテンツタイプの変更
以下の例では、新規ディレクトリーの作成と、そのディレクトリーのファイルタイプを (そのコンテンツとともに) Apache HTTP Server が使用するタイプに変更する方法を示します。この例で使用される設定は、Apache HTTP Server で (/var/www/html/ ではなく) 異なるドキュメントルートを使用する場合に適用します。
  1. Linux root ユーザーで mkdir /web コマンドを実行し、新規ディレクトリーを作成します。次に touch /web/file{1,2,3} コマンドで 3 つの空ファイル (file1file2file3) を作成します。/web/ ディレクトリーおよびその中のファイルには、default_t タイプのラベルが付けられます。
    ~]# ls -dZ /web
    drwxr-xr-x  root root unconfined_u:object_r:default_t:s0 /web
    ~]# ls -lZ /web 
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file1
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file2
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file3
    
  2. Linux root ユーザーで semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?" コマンドを実行し、/web/ ディレクトリーとその中にあるファイルのタイプを httpd_sys_content_t に変更します。-a オプションは新規レコードを追加し、-t オプションはタイプ (httpd_sys_content_t) を定義します。"/web(/.*)?" の正規表現は、semanage コマンドが変更を /web/ ディレクトリーとその中のファイルに適用させるようにします。注記: このコマンドの実行は直接にはタイプを変更しません—/web/ およびその中のファイルは default_t タイプのラベル付けがされたままです。
    ~]# ls -dZ /web
    drwxr-xr-x  root root unconfined_u:object_r:default_t:s0 /web
    ~]# ls -lZ /web 
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file1
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file2
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file3
    
    semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?" コマンドが以下のエントリーを /etc/selinux/targeted/contexts/files/file_contexts.local に追加します。
    /web(/.*)?    system_u:object_r:httpd_sys_content_t:s0
    
  3. Linux root ユーザーで restorecon -R -v /web コマンドを実行し、/web/ ディレクトリーとその中にあるファイルのタイプを変更します。-R オプションは再帰的ということで、/web/ ディレクトリー下の全ファイルおよびディレクトリーが httpd_sys_content_t タイプでラベル付けされることを意味します。semanage コマンドは /web(/.*)? のエントリーを file.contexts.local に追加したので、restorecon コマンドはタイプを httpd_sys_content_t に変更します。
    ~]# restorecon -R -v /web
    restorecon reset /web context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    restorecon reset /web/file2 context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    restorecon reset /web/file3 context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    restorecon reset /web/file1 context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    
    デフォルトでは、新規作成のファイルおよびディレクトリーは、親フォルダの SELinux タイプを引き継ぎます。この例では、/web/ ディレクトリーに作成されたファイルとディレクトリーは httpd_sys_content_t タイプのラベルが付けられます。
  4. Linux root ユーザーで semanage fcontext -d "/web(/.*)?" コマンドを実行し、"/web(/.*)?" に追加されたコンテキストを削除します。
  5. Linux root ユーザーで restorecon -R -v /web コマンドを実行し、デフォルトの SELinux コンテキストを復元します。
追加されたコンテキストの削除
以下の例では、SELinux コンテキストを追加・削除する方法を示しています。
  1. Linux root ユーザーで semanage fcontext -a -t httpd_sys_content_t /test コマンドを実行します。/test/ ディレクトリーはなくても構いません。このコマンドは、以下のコンテキストを /etc/selinux/targeted/contexts/files/file_contexts.local に追加します。
    /test    system_u:object_r:httpd_sys_content_t:s0
    
  2. コンテキストを削除するには、Linux root ユーザーで semanage fcontext -d file-name|directory-name コマンドを実行します。ここでの file-name|directory-name は、file_contexts.local の最初の部分です。以下は file_contexts.local のコンテキストの例です。
    /test    system_u:object_r:httpd_sys_content_t:s0
    
    最初の部分は /test になっています。restorecon 実行後もしくはファイルシステムが再ラベル付けされた後に /test/ ディレクトリーへの httpd_sys_content_t のラベル付けを防ぐには、Linux root ユーザーで file_contexts.local からコンテキストを削除します。
    ~]# semanage fcontext -d /test
例えば /web(/.*)? のようにコンテキストが正規表現の一部である場合、正規表現の前後に引用符を使います。
~]# semanage fcontext -d "/web(/.*)?"
semanage についての詳細は、semanage(8) の man ページを参照してください。

重要

semanage fcontext -a で SELinux のコンテキストを変更する場合、ファイルシステムの再ラベル付け後もしくは restorecon コマンド実行後におけるファイルの誤ったラベル付けを避けるために、ファイルもしくはディレクトリーへのフルパスを使用してください。