13.2. タイプ
高度なプロセス分離を提供するために、SELinux Targeted ポリシーで使用される主要なパーミッション制御方法は Type Enforcement です。すべてのファイルとプロセスにはタイプのラベルが付いています。タイプはプロセスの SELinux ドメインを定義し、ファイルの SELinux タイプを定義します。SELinux ポリシールールは、タイプにアクセスするドメインであるか、別のドメインにアクセスするドメインであるかにかかわらず、タイプが相互にアクセスする方法を定義します。アクセスは、それを許可する特定の SELinux ポリシールールが存在する場合にのみ許可されます。
以下の例では、
/var/www/html/
ディレクトリーに新しいファイルを作成し、親ディレクトリー (/var/www/html/
) からhttpd_sys_content_t
タイプを継承したファイルを示しています。
- 以下のコマンドを入力して、
/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
ユーティリティーを使用して新規ファイルを作成します。~]# touch /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 コマンドは、
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
がアクセスできるようにします。
mkdir
ユーティリティーを root として使用して、httpd
で使用されるファイルを保存するためのトップレベルのディレクトリー構造を作成します。~]# mkdir -p /my/website
- file-context 設定のパターンに一致しないファイルおよびディレクトリーには、
default_t
タイプのラベルが付けられます。このタイプは、制限のあるサービスからはアクセスできません。~]$ ls -dZ /my drwxr-xr-x root root unconfined_u:object_r:default_t:s0 /my
- 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
が使用できるようにします。
mkdir
ユーティリティーを root として使用して、httpd
で使用されるファイルを保存するためのトップレベルのディレクトリー構造を作成します。~]# mkdir -p /my/website
- root で以下のコマンドを入力し、ラベルの変更を file-context 設定に追加します。
~]# semanage fcontext -a -t httpd_sys_content_t "/my(/.*)?"
"/my(/.*)?"
式は、ラベルの変更がmy/
ディレクトリーと、その下のすべてのファイルおよびディレクトリーに適用されることを意味します。 - root で
touch
ユーティリティーを使用して、新規ファイルを作成します。~]# touch /my/website/index.html
- 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」 を参照してください。