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 コンテキストの変更が維持されるには、以下の手順を実行します。
semanage fcontext -a options file-name|directory-name
コマンドを実行します。ファイルもしくはディレクトリーへのフルパスを使用します。restorecon -v file-name|directory-name
コマンドを実行し、コンテキストの変更を適用します。
ファイルのタイプの変更
以下の例では、SELinux コンテキストの属性のうち、ファイルのタイプのみを変更しています。
- 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 - Linux root ユーザーで
semanage fcontext -a -t samba_share_t /etc/file1
コマンドを実行し、file1
タイプをsamba_share_t
に変更します。-a
オプションは新規レコードを追加し、-t
オプションはタイプ (samba_share_t
) を定義します。注記: このコマンドの実行は直接にはタイプを変更しません—file1
はetc_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/file1semanage 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
- 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 - Linux root ユーザーで
rm -i /etc/file1
コマンドを実行し、file1
を削除します。 - Linux root ユーザーで
semanage fcontext -d /etc/file1
コマンドを実行し、/etc/file1
に追加されたコンテキストを削除します。
ディレクトリーのタイプ変更
以下の例では、新規ディレクトリーの作成と、そのディレクトリーのファイルタイプを Apache HTTP Server が使用するタイプに変更する方法を示します。
- Linux root ユーザーで
mkdir /web
コマンドを実行し、新規ディレクトリーを作成します。このディレクトリーにはdefault_t
タイプのラベルが付けられます。~]#
ls -dZ /web
drwxr-xr-x root root unconfined_u:object_r:default_t:s0 /webls
-d
オプションは、ls
にコンテンツではなくディレクトリーについての一覧情報を作成させ、-Z
オプションはls
に SELinux コンテキスト (この例ではunconfined_u:object_r:default_t:s0
) を表示させます。 - 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 /websemanage 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
- 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
タイプのラベル付けがされています。 - Linux root ユーザーで
semanage fcontext -d /web
コマンドを実行し、/web/
に追加されたコンテキストを削除します。 - Linux root ユーザーで
restorecon -v /web
コマンドを実行し、デフォルトの SELinux コンテキストを復元します。
ディレクトリーおよびコンテンツタイプの変更
以下の例では、新規ディレクトリーの作成と、そのディレクトリーのファイルタイプを (そのコンテンツとともに) Apache HTTP Server が使用するタイプに変更する方法を示します。この例で使用される設定は、Apache HTTP Server で (/var/www/html/
ではなく) 異なるドキュメントルートを使用する場合に適用します。
- Linux root ユーザーで
mkdir /web
コマンドを実行し、新規ディレクトリーを作成します。次にtouch /web/file{1,2,3}
コマンドで 3 つの空ファイル (file1
、file2
、file3
) を作成します。/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 - 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 file3semanage 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
- 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
タイプのラベルが付けられます。 - Linux root ユーザーで
semanage fcontext -d "/web(/.*)?"
コマンドを実行し、"/web(/.*)?"
に追加されたコンテキストを削除します。 - Linux root ユーザーで
restorecon -R -v /web
コマンドを実行し、デフォルトの SELinux コンテキストを復元します。
追加されたコンテキストの削除
以下の例では、SELinux コンテキストを追加・削除する方法を示しています。
- 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
- コンテキストを削除するには、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
コマンド実行後におけるファイルの誤ったラベル付けを避けるために、ファイルもしくはディレクトリーへのフルパスを使用してください。