Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

第3章 Targeted ポリシー

Targeted ポリシーは、Red Hat Enterprise Linux で使用されるデフォルトの SELinux ポリシーです。Targeted ポリシーを使用する場合、対象となるプロセスは制限のあるドメインで実行され、対象とならないプロセスは制限のないドメインで実行されます。たとえば、デフォルトでは、ログイン中のユーザーは unconfined_t ドメインで実行され、init によって起動されたシステムプロセスは unconfined_service_t ドメインで実行されます。これらのドメインはどちらも制限されません。
実行可能および書き込み可能なメモリーチェックは、制限のあるドメインと制限のないドメインの両方に適用できます。ただし、デフォルトでは、制限のないドメインで実行しているサブジェクトは、書き込み可能なメモリーを割り当てて実行できます。これらのメモリーチェックを有効にするには、ブール値を設定します。これにより、SELinux ポリシーをランタイム時に変更できます。ブール値設定については、後で説明します。

3.1. 制限のあるプロセス

sshdhttpd などのネットワーク上でリッスンするほぼすべてのサービスは、Red Hat Enterprise Linux に制限されます。また、root ユーザーで実行され、passwd ユーティリティーなどのユーザーのタスクを実行するほとんどのプロセスには制限があります。プロセスが制限されると、httpd_t ドメインで実行している httpd プロセスのように、独自のドメインで実行されます。制限のあるプロセスが攻撃者によって侵害された場合、SELinux ポリシーの設定に応じて、攻撃者のリソースへのアクセスと、攻撃者が行う可能性のある損害は制限されます。
以下の手順に従って、SELinux が有効で、システムが以下の例を実行する準備が完了していることを確認します。

手順3.1 SELinux の状態を確認する方法

  1. SELinux が有効になり、Enforcing モードで実行されていること、および Targeted ポリシーが使用されていることを確認します。正しい出力は以下のようになります。
    ~]$ sestatus
    SELinux status:                 enabled
    SELinuxfs mount:                /sys/fs/selinux
    SELinux root directory:         /etc/selinux
    Loaded policy name:             targeted
    Current mode:                   enforcing
    Mode from config file:          enforcing
    Policy MLS status:              enabled
    Policy deny_unknown status:     allowed
    Max kernel policy version:      30
    SELinux モードの変更に関する詳細は、「SELinux のステータスおよびモードの永続的変更」 を参照してください。
  2. root として、/var/www/html/ ディレクトリーにファイルを作成します。
    ~]# touch /var/www/html/testfile
  3. 以下のコマンドを入力して、新規作成されたファイルの SELinux コンテキストを表示します。
    ~]$ ls -Z /var/www/html/testfile
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/testfile
    
    デフォルトでは、Linux ユーザーは Red Hat Enterprise Linux で制限なしで実行されます。そのため、testfile ファイルには SELinux unconfined_u ユーザーのラベルが付けられます。RBAC は、ファイルではなくプロセスに使用されます。ロールには意味がありません。object_r ロールはファイル (永続ストレージおよびネットワークファイルシステム上) に使用される汎用ロールです。/proc ディレクトリー下では、プロセスに関連するファイルは system_r ロールを使用する場合があります。httpd_sys_content_t タイプを使用すると、httpd プロセスがこのファイルにアクセスできるようになります。
以下の例は、SELinux が Samba で使用することが意図されているファイルなど、正しくラベル付けされていないファイルを読み込めるように、SELinux が Apache HTTP Server(httpd) を防ぐ方法を示しています。これはサンプルであり、本番環境では使用しないでください。httpd パッケージと wget パッケージがインストールされ、SELinux Targeted ポリシーが使用され、SELinux が Enforcing モードで動作していることを前提とします。

手順3.2 競合するプロセスの例

  1. root で httpd デーモンを起動します。
    ~]# systemctl start httpd.service
    サービスが実行中であることを確認します。出力には以下の情報が含まれている必要があります (タイムスタンプのみは異なります)。
    ~]$ systemctl status httpd.service
    httpd.service - The Apache HTTP Server
    	  Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
    	  Active: active (running) since Mon 2013-08-05 14:00:55 CEST; 8s ago
    
  2. Linux ユーザーが書き込み権限を持つディレクトリーに移動し、以下のコマンドを入力します。デフォルト設定が変更されない限り、このコマンドは成功します。
    ~]$ 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]
    
  3. 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
    
  4. 現在の DAC パーミッションでは、httpd プロセスが 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.
    
  5. root で testfile を削除します。
    ~]# rm -i /var/www/html/testfile
  6. httpd を実行する必要がない場合は、root で以下のコマンドを実行して停止します。
    ~]# systemctl stop httpd.service
この例は、SELinux により追加された追加のセキュリティーを示しています。DAC ルールでは、手順 2 で httpd プロセスが testfile へアクセスすることが許可されましたが、httpd プロセスがアクセス権を持たないタイプでファイルがラベル付けされているため、SELinux ではアクセスが拒否されました。
auditd デーモンが実行している場合は、以下のようなエラーが /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