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 タイプを継承していることを示しています。
  1. 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 タイプのラベルが付けられていることが分かります。
  2. root ユーザーになり touch /var/www/html/file1 を実行して新しいファイルを作成します。
  3. 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 が実行されるドメイン) で実行しているプロセスが読み取りと書き込みを行なうことができるタイプを定義しています。 これにより、 プロセスが別のプロセス用のファイルにアクセスしてしまわないよう保護しています。
たとえば、httpdhttpd_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_tmysqld_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 がアクセスできるようラベル付けを行ないます。

  1. root ユーザーで mkdir -p /my/website を実行し、 httpd によって使用されるファイルを格納するディレクトリを最上位に作成します。
  2. ファイルコンテキスト設定のパターンに合致しないファイルやディレクトリには default_t タイプのラベルが付けられる場合があります。 制限のあるサービスからはこのタイプのファイルやディレクトリにはアクセスできません。
    $ ls -dZ /my
    drwxr-xr-x  root root unconfined_u:object_r:default_t:s0 /my
    
  3. 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 コマンド (semanagepolicycoreutils-python パッケージで提供) を使用します。 このコマンドにより変更がファイルコンテキスト設定に追加されます。このあと、restorecon コマンドを実行すると、ファイルコンテキスト設定が読み込まれ、ラベルの変更が適用されます。次の例では、httpd に使用させる新規ディレクトリと index.html ファイルを作成し、httpd によるアクセスを許可するためラベルに永久的な変更を行ないます。
  1. root ユーザーで mkdir -p /my/website を実行し、 httpd によって使用されるファイルを格納するディレクトリを最上位に作成します。
  2. root ユーザーで以下のコマンドを実行して、 ラベルの変更をファイルコンテキスト設定に追加します。
    semanage fcontext -a -t httpd_sys_content_t "/my(/.*)?"
    
    "/my(/.*)?" の式は、 /my/ ディレクトリおよび配下の全ファイルとディレクトリにラベルの変更が適用されるという意味です。
  3. root ユーザーで touch /my/website/index.html を実行し新しいファイルを作成します。
  4. 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」セクションにて参照してください。