Menu Close

Red Hat Training

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

第4章 ターゲットポリシー

ターゲットポリシーは、Red Hat Enterprise Linux で使われるデフォルトの SELinux ポリシーです。ターゲットポリシー使用時には、ターゲットとなるプロセスは制限されたドメインで実行され、ターゲット外のプロセスは制限のないドメインで実行されます。例えば、デフォルトではログインしたユーザーは unconfined_t ドメインで実行し、init で開始されたシステムプロセスは initrc_t ドメインで実行されます。このドメインは両方とも、制限のないものです。
制限のないドメイン (制限のあるドメインも) は、実行可能および書き込み可能なメモリーチェックに制限されます。デフォルトでは、制限のないドメインで実行するサブジェクトは、書き込み可能なメモリーを割り当てることができず、その実行もできません。これにより、バッファオーバーフロー攻撃への脆弱性が低減されます。これらのメモリーチェックは、ブール値の設定で無効化されます。これにより、SELinux ポリシーのランタイムでの修正が可能になります。ブール値設定は、後で説明されます。

4.1. 制限のあるプロセス

Red Hat Enterprise Linux では、sshdhttpd といったネットワーク上でリッスンするサービスは、ほとんどすべて制限があります。また、passwd アプリケーションなど、Linux root ユーザーとして実行し、ユーザーのためのタスクを実行するプロセスはほとんど、制限があります。プロセスに制限があると、プロセス自体のドメイン内で実行されます。例えば、httpd_t ドメイン内で httpd プロセスが実行される、といったようにです。制限のあるプロセスが攻撃者によって危険にさらされても SELinux ポリシー設定によっては、攻撃者のリソースへのアクセスや攻撃による損害は限定されます。
以下の例では、Samba が使用するファイルなどの正確にラベル付けられていないファイルを Apache HTTP Server (httpd) が読み取らないように SELinux が防いだ方法を示します。これはあくまで例であり、本番環境では用いないでください。ここでは、httpd および wget パッケージがインストールされ、SELinux ターゲットポリシーが使われ、SELinux が enforcing モードで実行されていることを前提としています。
  1. sestatus コマンドを実行し、SELinux が有効になっていること、 enforcing モードで実行中であること、ターゲットポリシーが使われていること、を確認します。
    ~]$ 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 ターゲットポリシーが使用されていると、Policy from config file: targeted が返されます。
  2. Linux 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
    
    Red Hat Enterprise Linux ではデフォルトで、Linux ユーザーには制限がありません。そのため、testfile ファイルに SELinux unconfined_u ユーザーのラベルが付けられてます。RBAC はファイルでなくプロセスに使用されます。ロールはファイルにとって意味がありません。object_r ロールは、ファイルに使われる一般的なロールです (永続的なストレージおよびネットワークファイルシステム)。/proc/ ディレクトリー下では、プロセスに関連するファイルは system_r ロールを使用する場合があります。[6] httpd_sys_content_t タイプは、httpd プロセスがこのファイルにアクセスすることを許可します。
  4. Linux root ユーザーで service httpd start コマンドを実行し、httpd プロセスを開始します。httpd が正常にスタートすると、出力は以下のようになります。
    ~]# service httpd start
    Starting httpd:                                            [  OK  ]
    
  5. 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]
    
  6. chcon コマンドはラベルを張り替えますが、このラベル変更は、ファイルシステムのラベルが張り替えられると残りません。ファイルシステムのラベル張り替え後にも変更が残るようにするには、semanage コマンドを使います。これは後で説明します。Linux 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 コマンドを実行します。デフォルト設定に変更がなければ、このコマンドは失敗します。
    ~]$ 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.
    
  8. Linux root ユーザーで rm -i /var/www/html/testfile コマンドを実行し、testfile を削除します。
  9. httpd の実行が不要ならば、Linux root ユーザーで service httpd stop コマンドを実行し、httpd を停止します。
    ~]# service httpd stop
    Stopping 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


[6] MLS のような他のポリシーを使用している場合、secadm_r のような他のロールが使われることがあります。