3.2. タイプ
Type Enforcement が SELinux の targeted ポリシーで使用されるメインのパーミッション制御になります。全ファイルおよびプロセスにタイプのラベルが付けられます。ファイルの場合はタイプ、プロセスの場合はドメインを定義します。任意のタイプにアクセスするドメインなのか、 別のドメインにアクセスするドメインなのかなど、SELinux のポリシールールではタイプによって互いがアクセスしあう方法を定義します。 アクセスを許可する特定の SELinux ポリシールールが存在する場合にのみ、 そのアクセスが許可されます。
以下の例では、
/var/www/html/ ディレクトリに新しいファイルを作成し、 そのファイルが親ディレクトリ (/var/www/html/) の httpd_sys_content_t タイプを継承していることを示しています。
ls -dZ /var/www/htmlを実行して/var/www/html/の SELinux コンテキストを表示させます。$ ls -dZ /var/www/html drwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/var/www/html/にはhttpd_sys_content_tタイプのラベルが付けられていることが分かります。- root ユーザーになり
touch /var/www/html/file1を実行して新しいファイルを作成します。 ls -Z /var/www/html/file1を実行して SELinux コンテキストを表示させます。$ ls -Z /var/www/html/file1 -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file1
ls -Z コマンドを使用すると file1 には httpd_sys_content_t タイプのラベルが付けられていることが分かります。 SELinux では、 httpd がこのタイプのラベルが付いたファイルを読み込めるよう許可していますが、 書き込みは許可していません。 Linux のパーミッションが書き込みアクセスを許可していても変わりません。 SELinux ポリシーで httpd_t ドメイン (httpd が実行されるドメイン) で実行しているプロセスが読み取りと書き込みを行なうことができるタイプを定義しています。 これにより、 プロセスが別のプロセス用のファイルにアクセスしてしまわないよう保護しています。
たとえば、
httpd は httpd_sys_content_t タイプ (Apache HTTP Server 用) のラベルが付いたファイルを読み込むことができますが、デフォルトでは samba_share_t タイプ (Samba 用) のラベルが付いたファイルにはアクセスできません。また、ユーザーのホームディレクトリにあるファイルには user_home_t タイプのラベルが付けられます。これにより、デフォルトで httpd がユーザーのホームディレクトリにあるファイルの読み取りや書き込みを行なわないよう保護しています。
httpd で使用されるタイプをいくつか以下に示します。 タイプを使い分けることで柔軟なアクセスを設定することができるようになります。
httpd_sys_content_t- このタイプは、静的な Web サイトで使用される
.htmlファイルなどの Web コンテンツに使用します。このタイプのラベルが付けられたファイルは、httpdおよびhttpdで実行されるスクリプトに対してアクセス可能となります (読み取り専用)。デフォルトでは、このタイプのラベルが付けられたファイルおよびディレクトリへのhttpdや他のプロセスによる書き込み、編集は行なえません。デフォルトでは、/var/www/html/内に作成またはコピーされたファイルにはhttpd_sys_content_tタイプのラベルが付けられます。 httpd_sys_script_exec_t- このタイプは、
httpdに実行させるスクリプトに対して使用します。 一般的には/var/www/cgi-bin/内の CGI (Common Gateway Interface) スクリプトに使用されます。 デフォルトでは、 SELinux ポリシーによりhttpdによる CGI スクリプトの実行は阻止されます。 これを許可するため、 スクリプトにhttpd_sys_script_exec_tタイプのラベル付けを行い、httpd_enable_cgiBoolean をオンにします。httpd_sys_script_exec_tのラベルが付けられたスクリプトは、httpdで実行されるとhttpd_sys_script_tドメインで実行されます。httpd_sys_script_tドメインには、postgresql_tやmysqld_tなど他のシステムドメインへのアクセスがあります。 httpd_sys_content_rw_t- このタイプのラベルを使用したファイルは、
httpd_sys_script_exec_tタイプのラベルが付いたスクリプトによる書き込みが可能になります。 ただし、 これ以外のラベルタイプのスクリプトによる編集はできません。httpd_sys_script_exec_tタイプのラベルが付いたスクリプトに読み込みや書き込みを行なわせるファイルには、httpd_sys_content_rw_tタイプのラベルを使用してください。 httpd_sys_content_ra_t- このタイプのラベルを使用したファイルは、
httpd_sys_script_exec_tタイプのラベルが付いたスクリプトによる追加が可能になります。 ただし、 これ以外のラベルタイプのスクリプトによる編集はできません。httpd_sys_script_exec_tタイプのラベルが付いたスクリプトに読み込みや追加を行なわせるファイルには、httpd_sys_content_ra_tタイプのラベルを使用してください。 httpd_unconfined_script_exec_t- このタイプのラベルを付けたスクリプトは SELinux の保護なしで実行されます。 このタイプの使用は、 これ以外の手段を試したがいずれもうまくいかない複雑なスクリプトを使用する場合に限ってください。
httpdに対して SELinux の保護をオフにする、 またはシステム全体に対して SELinux の保護をオフにするよりは、 このタイプを使用した方がよいでしょう。
注記
httpd に使用できる他のタイプについては次のコマンドを実行すると確認できます。
grep httpd /etc/selinux/targeted/contexts/files/file_contexts
SELinux のコンテキストを変更する
ファイルやディレクトリのタイプは chcon コマンドを使用すると変更することができます。 chcon を使って行なった変更は、 ファイルシステムの再ラベルや restorecon コマンドを実行すると失われます。 特定ファイルの SELinux コンテキストの変更をユーザーに許可するかどうかは SELinux ポリシーで制御します。 以下の例では、 httpd 用の index.html ファイルと新規ディレクトリを作成し、 そのファイルとディレクトリに httpd がアクセスできるようラベル付けを行ないます。
- root ユーザーで
mkdir -p /my/websiteを実行し、httpdによって使用されるファイルを格納するディレクトリを最上位に作成します。 - ファイルコンテキスト設定のパターンに合致しないファイルやディレクトリには
default_tタイプのラベルが付けられる場合があります。 制限のあるサービスからはこのタイプのファイルやディレクトリにはアクセスできません。$ ls -dZ /my drwxr-xr-x root root unconfined_u:object_r:default_t:s0 /my - root ユーザーで
chcon -R -t httpd_sys_content_t /my/を実行し、/my/ディレクトリおよびサブディレクトリのタイプを、httpdからアクセスできるタイプに変更します。これで/my/website/の配下に作成されるファイルは、default_tタイプではなくhttpd_sys_content_tタイプを継承するようになるため、 httpd からアクセスできるようになります。# chcon -R -t httpd_sys_content_t /my/ # touch /my/website/index.html # ls -Z /my/website/index.html -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /my/website/index.html
一時的な変更について:
chcon についての詳細を Red Hat Enterprise Linux 6 SELinux ユーザーガイドの「chcon」セクションにて参照してください。
再ラベルや
restorecon コマンドの実行後もこのラベルの変更を維持するために、semanage fcontext コマンド (semanage は policycoreutils-python パッケージで提供) を使用します。 このコマンドにより変更がファイルコンテキスト設定に追加されます。このあと、restorecon コマンドを実行すると、ファイルコンテキスト設定が読み込まれ、ラベルの変更が適用されます。次の例では、httpd に使用させる新規ディレクトリと index.html ファイルを作成し、httpd によるアクセスを許可するためラベルに永久的な変更を行ないます。
- root ユーザーで
mkdir -p /my/websiteを実行し、httpdによって使用されるファイルを格納するディレクトリを最上位に作成します。 - root ユーザーで以下のコマンドを実行して、 ラベルの変更をファイルコンテキスト設定に追加します。
semanage fcontext -a -t httpd_sys_content_t "/my(/.*)?""/my(/.*)?"の式は、/my/ディレクトリおよび配下の全ファイルとディレクトリにラベルの変更が適用されるという意味です。 - root ユーザーで
touch /my/website/index.htmlを実行し新しいファイルを作成します。 - root ユーザーで
restorecon -R -v /my/を実行しラベルの変更を適用します (ステップ 2 のsemanageコマンドで変更されたファイルコンテキスト設定がrestoreconにより読み込まる)。# restorecon -R -v /my/ restorecon reset /my context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0 restorecon reset /my/website context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0 restorecon reset /my/website/index.html context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
一時的な変更について:
semanage についての詳細を Red Hat Enterprise Linux SELinux ユーザーガイドの「semanage fcontext」セクションにて参照してください。