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: targetedSELinux が有効になっていると、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_uSELinux ユーザーにマッピングされた 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/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コマンドを実行します。デフォルト設定に変更がなければ、このコマンドは失敗します。--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