2.2. 制限のあるプロセス
Red Hat Enterprise Linux では、 ネットワークでリッスンするサービスはほぼ全て制限されています。 また、
root
ユーザーとして実行され passwd アプリケーションなどユーザーのタスクを行なうプロセスもほとんど制限されています。 プロセスが制限されている場合、 そのプロセスはそれ自体のドメイン内で実行されます。httpd
プロセスならhttpd_t
ドメイン内で実行されます。 制限のあるプロセスが攻撃を受けた場合、 SELinux ポリシー設定に応じて、 攻撃側がリソースにアクセスして加えることができる被害が限定されます。
次の例では、Samba での使用を目的としたファイルなど、正しくラベル付けが行なわれていないファイルは Apache HTTP サーバー (
httpd
) では読み込ませないよう SELinux で阻止する方法を示します。この例はサンプルのため、実稼働環境では使用しないようにしてください。ここでは、httpd、 wget、setroubleshoot-server、audit などのパッケージがすでにインストールされていること、SELinux の targeted ポリシーが使用されていること、enforcing モードで実行していることを前提としています。
sestatus
コマンドを実行し、 SELinux が有効になっていること、 enforcing モードで実行していること、 targeted ポリシーが使われていることを確認します。$ /usr/sbin/sestatus SELinux status: enabled SELinuxfs mount: /selinux Current mode: enforcing Mode from config file: enforcing Policy version: 24 Policy from config file: targeted
SELinux が有効になっていると、SELinux status: enabled
が返されます。 SELinux が enforcing モードで実行されていると、Current mode: enforcing
が返されます。 SELinux targeted ポリシーが使用されていると、Policy from config file: targeted
が返されます。- 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
このtestfile
ファイルには、SELinux のunconfined_u
ユーザーラベルが付けられています。unconfined_u
SELinux ユーザーにマッピングされた Linux ユーザーによってこのファイルが作成されたためです。ファイルではなくプロセスの場合には、ロールベースのアクセス制御 (RBAC) が使用されます。ファイルの場合はロールに意味はなく、汎用ロールとなるobject_r
ロールが使用されます (永続的なストレージおよびネットワークファイルシステム上のファイル)。/proc/
ディレクトリ配下では、プロセスに関連するファイルにはsystem_r
ロールが使用される場合があります。[3]httpd_sys_content_t
タイプでhttpd
プロセスによるこのファイルへのアクセスを許可しています。- root ユーザーになり、
service httpd start
コマンドを使ってhttpd
プロセスを開始します。httpd
が正常に起動すると以下のような出力が表示されます。# /sbin/service httpd start Starting httpd: [ OK ]
- Linux ユーザーでの書き込みアクセスがあるディレクトリに移動してから、
wget http://localhost/testfile
コマンドを実行します。 デフォルト設定に変更がなければ、 このコマンドは成功します。--2009-12-01 11:40:28-- 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-12-01 11:40:28 (0.00 B/s) - `testfile' saved [0/0]
chcon
コマンドでファイルのラベルを付け換えます。ただし、ファイルシステムのラベルが付け換えられると、 この変更は失われます。ファイルシステムのラベルが付け換えられた場合でも、 こうした変更を永続的に維持するには、semanage
コマンドを使用します。このコマンドについてはのちほど説明していきます。 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
コマンドを実行します。デフォルト設定に変更がなければ、このコマンドは失敗します。--2009-12-01 11:43:18-- 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-12-01 11:43:18 ERROR 403: Forbidden.
- root ユーザーになり、
rm /var/www/html/testfile
コマンドを実行しtestfile
を削除します。 httpd
を実行しておく必要がない場合は、 root ユーザーになりservice httpd stop
コマンドを実行しhttpd
を停止します。# /sbin/service httpd stop Stopping httpd: [ OK ]
上記の例では、 SELinux によって追加される安全性を示しました。 ステップ 5 では、 DAC ルールによって
httpd
プロセスの testfile
へのアクセスが許可されています。しかし、httpd
プロセスによるアクセス権がないタイプにラベルが付け換えられたため、SELinux によってアクセスが拒否されるようになります。ステップ 7 のあと、setroubleshoot-server パッケージをインストールすると、次のようなエラーが /var/log/messages
にログ記録されます。
setroubleshoot: SELinux is preventing httpd (httpd_t) "getattr" to /var/www/html/testfile (samba_share_t). For complete SELinux messages run sealert -l c05911d3-e680-4e42-8e36-fe2ab9f8e654
また、 以下のようなエラーは
/var/log/httpd/error_log
にログ記録されます。
[Tue Dec 01 11:43:18 2009] [error] [client 127.0.0.1] (13)Permission denied: access to /testfile denied