Menu Close

Red Hat Training

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

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

ターゲットポリシーは、Red Hat Enterprise Linux で使用されるデフォルトの SELinux ポリシーです。ターゲットポリシーを使用する場合、制限のあるドメインで実行されるターゲットに設定されたプロセス、および制限のないドメインで実行されるプロセス。たとえば、デフォルトでは、ログインしているユーザーは 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 モードで実行されていること、およびターゲットポリシーが使用されていることを確認します。正しい出力は以下のようになります。
    ~]$ 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 で制限なしで実行されます。つまり、test file ファイルに SELinux unconfined_u user のラベルが付けられます。RBAC はファイルではなく、プロセスに使用されます。ロールにはファイルに対する意味がありません。object_r ロールは(永続ストレージおよびネットワークファイルシステム上)ファイルに使用される汎用ロールです。/proc ディレクトリー配下 で、プロセスに関連するファイルは system_r ロールを使用する場合があります。httpd_sys_content_t タイプを使用すると、httpd プロセスが このファイルにアクセスできるようになります。
以下の例は、SELinux が、Sambaが使用することを目的としたファイルなど、適切にラベル付けされていないファイルを読み込む方法を表しています。これは、実稼働環境で使用すべきではありません。httpd パッケージおよび wget パッケージがインストールされ、SELinux ターゲットポリシーが使用され、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. root で以下のコマンドを実行して、httpd を実行する必要がありません。
    ~]# systemctl stop httpd.service
この例では、SELinux が追加する追加のセキュリティーを示しています。DAC ルールでは、httpd プロセスが手順 2 の 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