Menu Close

Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

13.2. タイプ

高度なプロセス分離を提供するために、SELinux Targeted ポリシーで使用される主要なパーミッション制御方法は Type Enforcement です。すべてのファイルとプロセスにはタイプのラベルが付いています。タイプはプロセスのSELinuxドメインを定義し、ファイルのSELinuxタイプを定義します。SELinux ポリシールールは、タイプにアクセスするドメインであるか、別のドメインにアクセスするドメインであるかにかかわらず、タイプが相互にアクセスする方法を定義します。アクセスは、それを許可する特定の SELinux ポリシールールが存在する場合にのみ許可されます。
以下の例では、/var/www/html/ ディレクトリーに新しいファイルを作成し、親ディレクトリー (/var/www/html/) からhttpd_sys_content_t タイプを継承したファイルを示しています。
  1. 以下のコマンドを入力して、/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 ユーティリティーを使用して新規ファイルを作成します。
    ~]# touch /var/www/html/file1
  3. 以下のコマンドを入力して 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 コマンドは、httpd_sys_content_t タイプのラベルが付けられた file1 を表示します。SELinux を使用すると、httpd はこのタイプでラベル付けされたファイルを読み取ることができますが、Linux の権限で書き込みアクセスが許可されている場合でも書き込みはできません。SELinux ポリシーは、httpd_t ドメイン(httpd が実行されている場所)で実行中のプロセスが読み取りと書き込みを実行できるタイプを定義します。これは、プロセスが別のプロセスによって使用されるファイルにアクセスできないようにするのに役立ちます。
たとえば、httpd は、httpd_sys_content_t タイプ (Apache HTTP サーバー向け) のラベルが付いたファイルにアクセスできますが、デフォルトでは、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 ブール値を有効にします。httpd_sys_script_exec_t のラベルが付いたスクリプトは、httpd による実行時にhttpd_sys_script_t ドメインで実行されます。httpd_sys_script_t ドメインは、postgresql_t および mysqld_t などの他のシステムドメインにアクセスできます。
httpd_sys_rw_content_t
このタイプのラベルが付いたファイルは、httpd_sys_script_exec_t タイプのラベルが付いたスクリプトで作成できますが、その他のタイプのスクリプトでは変更できません。httpd_sys_rw_content_t タイプを使用して、httpd_sys_script_exec_t タイプのラベルが付いたスクリプトによる読み取りと書き込みの対象となるファイルにラベルを付ける必要があります。
httpd_sys_ra_content_t
このタイプのラベルが付いたファイルは、httpd_sys_script_exec_t タイプのラベルが付いたスクリプトにより追加できますが、その他のタイプのスクリプトにより変更することはできません。httpd_sys_ra_content_t タイプを使用して、httpd_sys_script_exec_t タイプのラベルが付いたスクリプトによる読み取りと追加を行うファイルに、ラベルを付ける必要があります。
httpd_unconfined_script_exec_t
このタイプでラベル付けされたスクリプトは、SELinux の保護なしで実行されます。その他のオプションをすべて使い切った後、複雑なスクリプトにはこのタイプのみを使用してください。httpd またはシステム全体の SELinux 保護を無効にするのではなく、このタイプを使用することが推奨されます。
注記
httpd で利用可能なタイプの詳細を確認するには、以下のコマンドを入力します。
~]$ grep httpd /etc/selinux/targeted/contexts/files/file_contexts

手順13.1 SELinux コンテキストの変更

ファイルおよびディレクトリーのタイプは、chcon コマンドで変更できます。chcon で行った変更は、ファイルシステムの再ラベル付けや restorecon コマンドでは存続しません。SELinux ポリシーは、ユーザーが任意のファイルの SELinux コンテキストを変更できるかどうかを制御します。以下の例では、httpd が使用する新しいディレクトリーと index.html ファイルを作成し、そのファイルおよびディレクトリーにラベルを付けて、それらに httpd がアクセスできるようにします。
  1. mkdir ユーティリティーを root として使用して、httpd で使用されるファイルを保存するためのトップレベルのディレクトリー構造を作成します。
    ~]# mkdir -p /my/website
  2. file-context 設定のパターンに一致しないファイルおよびディレクトリーには、default_t タイプのラベルが付けられます。このタイプは、制限のあるサービスからはアクセスできません。
    ~]$ ls -dZ /my
    drwxr-xr-x  root root unconfined_u:object_r:default_t:s0 /my
    
  3. root で以下のコマンドを入力し、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 の詳細は、「一時的な変更: chcon」 を参照してください。
semanage fcontext コマンド (policycoreutils-python パッケージにより semanage が提供される) を使用して、再ラベル付けおよび restorecon コマンドに持続するラベル変更を行います。このコマンドは、file-context 設定に変更を加えます。次に、file-context 設定を読み取る restorecon を実行してラベルの変更を適用します。以下の例では、httpd が使用する新しいディレクトリーと index.html ファイルを作成し、そのディレクトリーとファイルのラベルを永続的に変更して、httpd が使用できるようにします。
  1. mkdir ユーティリティーを root として使用して、httpd で使用されるファイルを保存するためのトップレベルのディレクトリー構造を作成します。
    ~]# mkdir -p /my/website
  2. root で以下のコマンドを入力し、ラベルの変更を file-context 設定に追加します。
    ~]# semanage fcontext -a -t httpd_sys_content_t "/my(/.*)?"
    "/my(/.*)?" 式は、ラベルの変更が my/ ディレクトリーと、その下のすべてのファイルおよびディレクトリーに適用されることを意味します。
  3. root で touch ユーティリティーを使用して、新規ファイルを作成します。
    ~]# touch /my/website/index.html
  4. root で以下のコマンドを入力し、ラベルの変更を適用します(restorecon は、手順 2 の semanage コマンドで変更された file-context 設定を読み取ります)。
    ~]# 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 の詳細は 「永続的な変更 - semanage fcontext」 を参照してください。