第4章 ターゲットポリシー
ターゲットポリシーは、Red Hat Enterprise Linux で使われるデフォルトの SELinux ポリシーです。ターゲットポリシー使用時には、ターゲットとなるプロセスは制限されたドメインで実行され、ターゲット外のプロセスは制限のないドメインで実行されます。例えば、デフォルトではログインしたユーザーは
unconfined_t
ドメインで実行し、init で開始されたシステムプロセスは initrc_t
ドメインで実行されます。このドメインは両方とも、制限のないものです。
制限のないドメイン (制限のあるドメインも) は、実行可能および書き込み可能なメモリーチェックに制限されます。デフォルトでは、制限のないドメインで実行するサブジェクトは、書き込み可能なメモリーを割り当てることができず、その実行もできません。これにより、バッファオーバーフロー攻撃への脆弱性が低減されます。これらのメモリーチェックは、ブール値の設定で無効化されます。これにより、SELinux ポリシーのランタイムでの修正が可能になります。ブール値設定は、後で説明されます。
4.1. 制限のあるプロセス
Red Hat Enterprise Linux では、
sshd
や httpd
といったネットワーク上でリッスンするサービスは、ほとんどすべて制限があります。また、passwd アプリケーションなど、Linux root ユーザーとして実行し、ユーザーのためのタスクを実行するプロセスはほとんど、制限があります。プロセスに制限があると、プロセス自体のドメイン内で実行されます。例えば、httpd_t
ドメイン内で httpd
プロセスが実行される、といったようにです。制限のあるプロセスが攻撃者によって危険にさらされても SELinux ポリシー設定によっては、攻撃者のリソースへのアクセスや攻撃による損害は限定されます。
以下の例では、Samba が使用するファイルなどの正確にラベル付けられていないファイルを Apache HTTP Server (
httpd
) が読み取らないように SELinux が防いだ方法を示します。これはあくまで例であり、本番環境では用いないでください。ここでは、httpd および wget パッケージがインストールされ、SELinux ターゲットポリシーが使われ、SELinux が enforcing モードで実行されていることを前提としています。
sestatus
コマンドを実行し、SELinux が有効になっていること、 enforcing モードで実行中であること、ターゲットポリシーが使われていること、を確認します。~]$
sestatus
SELinux status: enabled SELinuxfs mount: /selinux Current mode: enforcing Mode from config file: enforcing Policy version: 24 Policy from config file: targetedSELinux が有効だと、SELinux status: enabled
が返されます。SELinux が enforcing モードで実行中だと、Current mode: enforcing
が返されます。SELinux ターゲットポリシーが使用されていると、Policy from config file: targeted
が返されます。- Linux root ユーザーで、
touch /var/www/html/testfile
コマンドを実行してファイルを作成します。 ls -Z /var/www/html/testfile
コマンドを実行し、SELinux コンテキストを表示します。-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/testfile
Red Hat Enterprise Linux ではデフォルトで、Linux ユーザーには制限がありません。そのため、testfile
ファイルに SELinuxunconfined_u
ユーザーのラベルが付けられてます。RBAC はファイルでなくプロセスに使用されます。ロールはファイルにとって意味がありません。object_r
ロールは、ファイルに使われる一般的なロールです (永続的なストレージおよびネットワークファイルシステム)。/proc/
ディレクトリー下では、プロセスに関連するファイルはsystem_r
ロールを使用する場合があります。[6]httpd_sys_content_t
タイプは、httpd
プロセスがこのファイルにアクセスすることを許可します。- Linux root ユーザーで
service httpd start
コマンドを実行し、httpd
プロセスを開始します。httpd
が正常にスタートすると、出力は以下のようになります。~]#
service httpd start
Starting httpd: [ OK ] - Linux ユーザーでの書き込みアクセスがあるディレクトリーに切り替え、
wget http://localhost/testfile
コマンドを実行します。デフォルト設定に変更がなければ、このコマンドは成功します。~]$
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
コマンドを使います。これは後で説明します。Linux root ユーザーで以下のコマンドを実行し、タイプを Samba が使用するタイプに変更します。~]#
chcon -t samba_share_t /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
へのアクセスを許可します。Linux ユーザーとしての書き込みアクセスがあるディレクトリーに切り替え、wget http://localhost/testfile
コマンドを実行します。デフォルト設定に変更がなければ、このコマンドは失敗します。~]$
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. - Linux root ユーザーで
rm -i /var/www/html/testfile
コマンドを実行し、testfile
を削除します。 httpd
の実行が不要ならば、Linux root ユーザーでservice httpd stop
コマンドを実行し、httpd
を停止します。~]#
service httpd stop
Stopping httpd: [ OK ]
この例では SELinux によって追加された新たなセキュリティーを説明しました。ステップ 7 では、DAC ルールは
httpd
プロセスによる testfile
へのアクセスを許可しますが、ファイルは httpd
プロセスがアクセス権のないタイプでラベル付けされているので、SELinux はアクセスを拒否します。
以下のようなエラーは、
/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)
また以下のようなエラーは、
/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