Show Table of Contents
第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 モードで実行中であること、ターゲットポリシーが使われていること、を確認します。~]$
sestatusSELinux 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 startStarting 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/testfilels -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 stopStopping 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

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.