2.2. 制限のあるプロセス

Red Hat Enterprise Linux では、 ネットワークでリッスンするサービスはほぼ全て制限されています。 また、 root ユーザーとして実行され passwd アプリケーションなどユーザーのタスクを行なうプロセスもほとんど制限されています。 プロセスが制限されている場合、 そのプロセスはそれ自体のドメイン内で実行されます。httpd プロセスならhttpd_t ドメイン内で実行されます。 制限のあるプロセスが攻撃を受けた場合、 SELinux ポリシー設定に応じて、 攻撃側がリソースにアクセスして加えることができる被害が限定されます。
次の例では、Samba での使用を目的としたファイルなど、正しくラベル付けが行なわれていないファイルは Apache HTTP サーバー (httpd) では読み込ませないよう SELinux で阻止する方法を示します。この例はサンプルのため、実稼働環境では使用しないようにしてください。ここでは、httpdwgetsetroubleshoot-serveraudit などのパッケージがすでにインストールされていること、SELinux の targeted ポリシーが使用されていること、enforcing モードで実行していることを前提としています。
  1. 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 が返されます。
  2. root ユーザーになり、 touch /var/www/html/testfile コマンドを実行してファイルを作成します。
  3. 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 プロセスによるこのファイルへのアクセスを許可しています。
  4. root ユーザーになり、 service httpd start コマンドを使って httpd プロセスを開始します。 httpd が正常に起動すると以下のような出力が表示されます。
    # /sbin/service httpd start
    Starting httpd:                                            [  OK  ]
    
  5. 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]
    
  6. 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
    
  7. 現在の 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.
    
  8. root ユーザーになり、 rm /var/www/html/testfile コマンドを実行し testfile を削除します。
  9. 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


[3] MLS など他のポリシーを使用する場合は secadm_r など別のロールを使用する場合があります。