第3章 Targeted ポリシー
Targeted ポリシーは、Red Hat Enterprise Linux で使用されるデフォルトの SELinux ポリシーです。Targeted ポリシーを使用する場合、対象となるプロセスは制限のあるドメインで実行され、対象とならないプロセスは制限のないドメインで実行されます。たとえば、デフォルトでは、ログイン中のユーザーは
unconfined_t
ドメインで実行され、init によって起動されたシステムプロセスは unconfined_service_t
ドメインで実行されます。これらのドメインはどちらも制限されません。
実行可能および書き込み可能なメモリーチェックは、制限のあるドメインと制限のないドメインの両方に適用できます。ただし、デフォルトでは、制限のないドメインで実行しているサブジェクトは、書き込み可能なメモリーを割り当てて実行できます。これらのメモリーチェックを有効にするには、ブール値を設定します。これにより、SELinux ポリシーをランタイム時に変更できます。ブール値設定については、後で説明します。
3.1. 制限のあるプロセス
sshd
や httpd
などのネットワーク上でリッスンするほぼすべてのサービスは、Red Hat Enterprise Linux に制限されます。また、root ユーザーで実行され、passwd
ユーティリティーなどのユーザーのタスクを実行するほとんどのプロセスには制限があります。プロセスが制限されると、httpd_t
ドメインで実行している httpd
プロセスのように、独自のドメインで実行されます。制限のあるプロセスが攻撃者によって侵害された場合、SELinux ポリシーの設定に応じて、攻撃者のリソースへのアクセスと、攻撃者が行う可能性のある損害は制限されます。
以下の手順に従って、SELinux が有効で、システムが以下の例を実行する準備が完了していることを確認します。
手順3.1 SELinux の状態を確認する方法
- SELinux が有効になり、Enforcing モードで実行されていること、および Targeted ポリシーが使用されていることを確認します。正しい出力は以下のようになります。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ~]$ sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: enforcing Mode from config file: enforcing Policy MLS status: enabled Policy deny_unknown status: allowed Max kernel policy version: 30
~]$ sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: enforcing Mode from config file: enforcing Policy MLS status: enabled Policy deny_unknown status: allowed Max kernel policy version: 30
SELinux モードの変更に関する詳細は、「SELinux のステータスおよびモードの永続的変更」 を参照してください。 - root として、
/var/www/html/
ディレクトリーにファイルを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow ~]# touch /var/www/html/testfile
~]# touch /var/www/html/testfile
- 以下のコマンドを入力して、新規作成されたファイルの SELinux コンテキストを表示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ~]$ ls -Z /var/www/html/testfile -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/testfile
~]$ ls -Z /var/www/html/testfile -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/testfile
デフォルトでは、Linux ユーザーは Red Hat Enterprise Linux で制限なしで実行されます。そのため、testfile
ファイルには SELinuxunconfined_u
ユーザーのラベルが付けられます。RBAC は、ファイルではなくプロセスに使用されます。ロールには意味がありません。object_r
ロールはファイル (永続ストレージおよびネットワークファイルシステム上) に使用される汎用ロールです。/proc
ディレクトリー下では、プロセスに関連するファイルはsystem_r
ロールを使用する場合があります。httpd_sys_content_t
タイプを使用すると、httpd
プロセスがこのファイルにアクセスできるようになります。
以下の例は、SELinux が Samba で使用することが意図されているファイルなど、正しくラベル付けされていないファイルを読み込めるように、SELinux が Apache HTTP Server(
httpd
) を防ぐ方法を示しています。これはサンプルであり、本番環境では使用しないでください。httpd パッケージと wget パッケージがインストールされ、SELinux Targeted ポリシーが使用され、SELinux が Enforcing モードで動作していることを前提とします。
手順3.2 競合するプロセスの例
- root で
httpd
デーモンを起動します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow ~]# systemctl start httpd.service
~]# systemctl start httpd.service
サービスが実行中であることを確認します。出力には以下の情報が含まれている必要があります (タイムスタンプのみは異なります)。Copy to Clipboard Copied! Toggle word wrap Toggle overflow ~]$ systemctl status httpd.service httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: active (running) since Mon 2013-08-05 14:00:55 CEST; 8s ago
~]$ systemctl status httpd.service httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: active (running) since Mon 2013-08-05 14:00:55 CEST; 8s ago
- Linux ユーザーが書き込み権限を持つディレクトリーに移動し、以下のコマンドを入力します。デフォルト設定が変更されない限り、このコマンドは成功します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ~]$ wget http://localhost/testfile --2009-11-06 17:43:01-- http://localhost/testfile Resolving localhost... 127.0.0.1 Connecting to localhost|127.0.0.1|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 0 [text/plain] Saving to: `testfile' [ <=> ] 0 --.-K/s in 0s 2009-11-06 17:43:01 (0.00 B/s) - `testfile' saved [0/0]
~]$ wget http://localhost/testfile --2009-11-06 17:43:01-- http://localhost/testfile Resolving localhost... 127.0.0.1 Connecting to localhost|127.0.0.1|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 0 [text/plain] Saving to: `testfile' [ <=> ] 0 --.-K/s in 0s 2009-11-06 17:43:01 (0.00 B/s) - `testfile' saved [0/0]
- chcon コマンドによってファイルが再ラベル付けされます。ただし、このようなラベルの変更は、ファイルシステムの再ラベル付け時に維持されません。ファイルシステムの再ラベル付け後も存続する永続的な変更については、
semanage
ユーティリティーを使用します。これについては後述します。root で以下のコマンドを実行して、タイプを Samba が使用するタイプに変更します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow ~]# chcon -t samba_share_t /var/www/html/testfile
~]# chcon -t samba_share_t /var/www/html/testfile
以下のコマンドを入力して、変更を表示します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow ~]$ ls -Z /var/www/html/testfile -rw-r--r-- root root unconfined_u:object_r:samba_share_t:s0 /var/www/html/testfile
~]$ ls -Z /var/www/html/testfile -rw-r--r-- root root unconfined_u:object_r:samba_share_t:s0 /var/www/html/testfile
- 現在の DAC パーミッションでは、
httpd
プロセスがtestfile
にアクセスできるようになります。ユーザーの書き込み権限があるディレクトリーに移動し、以下のコマンドを入力します。デフォルト設定が変更されない限り、このコマンドは失敗します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow ~]$ wget http://localhost/testfile --2009-11-06 14:11:23-- http://localhost/testfile Resolving localhost... 127.0.0.1 Connecting to localhost|127.0.0.1|:80... connected. HTTP request sent, awaiting response... 403 Forbidden 2009-11-06 14:11:23 ERROR 403: Forbidden.
~]$ wget http://localhost/testfile --2009-11-06 14:11:23-- http://localhost/testfile Resolving localhost... 127.0.0.1 Connecting to localhost|127.0.0.1|:80... connected. HTTP request sent, awaiting response... 403 Forbidden 2009-11-06 14:11:23 ERROR 403: Forbidden.
- root で
testfile
を削除します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow ~]# rm -i /var/www/html/testfile
~]# rm -i /var/www/html/testfile
httpd
を実行する必要がない場合は、root で以下のコマンドを実行して停止します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow ~]# systemctl stop httpd.service
~]# systemctl stop httpd.service
この例は、SELinux により追加された追加のセキュリティーを示しています。DAC ルールでは、手順 2 で
httpd
プロセスが testfile
へアクセスすることが許可されましたが、httpd
プロセスがアクセス権を持たないタイプでファイルがラベル付けされているため、SELinux ではアクセスが拒否されました。
auditd
デーモンが実行している場合は、以下のようなエラーが /var/log/audit/audit.log
に記録されます。
type=AVC msg=audit(1220706212.937:70): avc: denied { getattr } for pid=1904 comm="httpd" path="/var/www/html/testfile" dev=sda5 ino=247576 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file type=SYSCALL msg=audit(1220706212.937:70): arch=40000003 syscall=196 success=no exit=-13 a0=b9e21da0 a1=bf9581dc a2=555ff4 a3=2008171 items=0 ppid=1902 pid=1904 auid=500 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=1 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1220706212.937:70): avc: denied { getattr } for pid=1904 comm="httpd" path="/var/www/html/testfile" dev=sda5 ino=247576 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file
type=SYSCALL msg=audit(1220706212.937:70): arch=40000003 syscall=196 success=no exit=-13 a0=b9e21da0 a1=bf9581dc a2=555ff4 a3=2008171 items=0 ppid=1902 pid=1904 auid=500 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=1 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
また、以下のようなエラーが
/var/log/httpd/error_log
に記録されます。
[Wed May 06 23:00:54 2009] [error] [client 127.0.0.1] (13)Permission denied: access to /testfile denied
[Wed May 06 23:00:54 2009] [error] [client 127.0.0.1] (13)Permission denied: access to /testfile denied