晴耕雨読

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

永続的にSELinuxコンテキストを変更する (semanage fcontext)

SELinuxで semanage コマンドを使って永続的にSELinuxコンテキストを変更する方法について説明します。

ファイルのコンテキスト変更 (-a)

まず、検証用に /etc/file1 ファイルを作成します。/etc 直下に作ったファイルは etc_t タイプのラベルが付けられます。

~]# touch /etc/file1
~]# ls -Z /etc/file1
unconfined_u:object_r:etc_t:s0 /etc/file1

続いて、/etc/file1 のルールに samba_share_t タイプを追加します。 -a は新しいレコードを追加するオプションで、-t はタイプを指定します。

~]# semanage fcontext -a -t samba_share_t /etc/file1

ルールの一覧(-lオプション)から、上記のルールが登録されたことを確認します。

~]# semanage fcontext -l | grep file1
/etc/file1         all files          system_u:object_r:samba_share_t:s0

しかし、ルールを追加しただけでは、ファイルにSELinuxコンテキストは適用されません。

~]# ls -Z /etc/file1
unconfined_u:object_r:etc_t:s0 /etc/file1

SELinuxコンテキストをデフォルト値に戻す restorecon コマンドを使って、設定をファイルに反映させます。

~]# restorecon -v /etc/file1
Relabeled /etc/file1 from unconfined_u:object_r:etc_t:s0 to unconfined_u:object_r:samba_share_t:s0

restorecon で設定が反映されました。

~]# ls -Z /etc/file1
unconfined_u:object_r:samba_share_t:s0 /etc/file1

ディレクトリのコンテキスト変更 (-a)

HTTPサーバが /var/www/html ではなく別のドキュメントルートを使用する場合は、ディレクトリのコンテキストを修正する必要があります。 まず、/var/www/html の代わりに /web をApacheのドキュメントルートとして使いたいとします。

~]# mkdir /web
~]# touch /web/file{1,2,3}.html

新しい最上位ディレクトリーを作成すると default_t タイプのラベルが付けられます。

~]# ls -dZ /web
unconfined_u:object_r:default_t:s0 /web
~]# ls -Z /web
total 0
unconfined_u:object_r:default_t:s0 file1.html
unconfined_u:object_r:default_t:s0 file2.html
unconfined_u:object_r:default_t:s0 file3.html

HTTPサーバがアクセスできるように、永続的に /web 以下を再帰的に httpd_sys_content_t タイプのラベルに変更するためのルールを追加します。 ルールの条件には Perl と互換性のある正規表現 (PCRE) を使ってタイプを適用するディレクトリを指定します。 ディレクトリは必ず絶対パスで指定してください。

~]# semanage fcontext -a -t httpd_sys_content_t '/web(/.*)?'

ルールの一覧 (-lオプション) に、上記のルールが登録されたことを確認します。

~]# semanage fcontext -l | grep /web
/web(/.*)?          all files          system_u:object_r:httpd_sys_content_t:s0

ルールを追加しただけでは、まだディレクトリにSELinuxコンテキストは適用されていません。 最後に restorecon を使って、設定をルール通りに元に戻す(自分で設定したルールを反映させる)作業を行います。

~]# restorecon -R -v /web
Relabeled /web from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /web/file1.html from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /web/file2.html from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /web/file3.html from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0

restorecon で設定が反映されました。

~]# ls -dZ /web
unconfined_u:object_r:httpd_sys_content_t:s0 /web
~]# ls -Z /web
unconfined_u:object_r:httpd_sys_content_t:s0 file1.html
unconfined_u:object_r:httpd_sys_content_t:s0 file2.html
unconfined_u:object_r:httpd_sys_content_t:s0 file3.html

追加したルールの削除 (-d)

コンテキストのルールを削除するには -d オプションを使い、ルールで使われている正規表現を指定します。

~]# semanage fcontext -d '/etc/file1'
~]# semanage fcontext -d '/web(/.*)?'

ルールを削除しただけではコンテキストが反映されないので、restorecon で設定を反映させます。

~]# restorecon -v /etc/file1
Relabeled /etc/file1 from unconfined_u:object_r:samba_share_t:s0 to unconfined_u:object_r:etc_t:s0
~]# restorecon -R -v /web
Relabeled /web from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0
Relabeled /web/file1.html from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0
Relabeled /web/file2.html from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0
Relabeled /web/file3.html from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0

以上です。

参考文献