Red Hat Training
A Red Hat training course is available for Red Hat Enterprise Linux
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_cgi
Boolean をオンにします。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」セクションにて参照してください。