3.2. 制限のないプロセス

制限のないプロセスは、制限のないドメインで実行されます。例えば、init で実行される制限のないサービスは unconfined_service_t ドメインで、カーネルで実行される制限のないサービスは kernel_t ドメインで、制限のない Linux ユーザーによって実行される制限のないサービスは unconfined_t ドメインで実行されることになります。制限のないプロセスでは SELinux ポリシールールが適用されますが、既存のポリシールールは制限のないドメイン内で実行中のプロセスにほとんどすべてのアクセスを許可します。制限のないドメイン内で実行中のプロセスは、ほとんど DAC ルールにフォールバックします。制限のないプロセスが危険にさらされても、SELinux は攻撃者によるシステムリソースやデータへのアクセス獲得を阻止しません。しかし、もちろん DAC ルールは常に使われます。SELinux は DAC ルールの上に加わるもので、DAC ルールに取って代わるものではありません。
SELinux が有効であることを確認し、システムが以下の例を実行できるようにするには、「制限のあるプロセス」にある 手順3.1「SELinux ステータスの確認方法」を完了してください。
以下の例では、制限なしで実行中の場合、Apache HTTP Server (httpd) が Samba 向けのデータにアクセスできる様子を示します。Red Hat Enterprise Linux ではデフォルトで、httpd プロセスは制限のある httpd_t ドメイン内で実行されることに留意してください。これはあくまで例であり、本番環境では用いないでください。ここでは httpdwgetdbusaudit パッケージがインストールされ、SELinux ターゲットポリシーが使われ、SELinux が enforcing モードで実行されていることを前提としています。

手順3.3 制限のないプロセスの例

  1. 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
  2. 以下のコマンドを実行し、httpd プロセスが稼働していないことを確認します。
    ~]$ systemctl status httpd.service
    httpd.service - The Apache HTTP Server
       Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
       Active: inactive (dead)
    出力が異なる場合は、root ユーザーで以下のコマンドを実行し、httpd プロセスを停止します。
    ~]# systemctl stop httpd.service
  3. httpd プロセスを制限なしで実行する場合は、root ユーザーで以下のコマンドを実行し、/usr/sbin/httpd ファイルのタイプを制限のあるドメインに移行しないものに変更します。
    ~]# chcon -t bin_t /usr/sbin/httpd
  4. /usr/sbin/httpdbin_t タイプがラベル付けされていることを確認します。
    ~]$ ls -Z /usr/sbin/httpd
    -rwxr-xr-x. root root system_u:object_r:bin_t:s0       /usr/sbin/httpd
  5. 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 Thu 2013-08-15 11:17:01 CEST; 5s ago
  6. 以下のコマンドを実行し、httpdunconfined_service_t ドメインで実行中であることを確認します。
    ~]$ ps -eZ | grep httpd
    system_u:system_r:unconfined_service_t:s0 11884 ? 00:00:00 httpd
    system_u:system_r:unconfined_service_t:s0 11885 ? 00:00:00 httpd
    system_u:system_r:unconfined_service_t:s0 11886 ? 00:00:00 httpd
    system_u:system_r:unconfined_service_t:s0 11887 ? 00:00:00 httpd
    system_u:system_r:unconfined_service_t:s0 11888 ? 00:00:00 httpd
    system_u:system_r:unconfined_service_t:s0 11889 ? 00:00:00 httpd
  7. Linux ユーザーでの書き込みアクセスがあるディレクトリーに切り替え、以下のコマンドを実行します。デフォルト設定に変更がなければ、このコマンドは成功します。
    ~]$ wget http://localhost/testfile
    --2009-05-07 01:41:10--  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'
    
    [ <=>                            ]--.-K/s   in 0s
    
    2009-05-07 01:41:10 (0.00 B/s) - `testfile' saved [0/0]
    httpd プロセスには samba_share_t タイプのラベルが付いたファイルへのアクセス権はありませんが、httpd は制限のない unconfined_service_t ドメインで実行しており、DAC ルールにフォールバックします。このため、wget コマンドは成功します。もし httpd が制限のある httpd_t ドメインで実行していたら、wget コマンドは失敗していたでしょう。
  8. restorecon ユーティリティーは、ファイルのデフォルト SELinux コンテキストを復元します。root で以下のコマンドを実行すると、/usr/sbin/httpd のデフォルトの SELinux コンテキストが復元されます。
    ~]# restorecon -v /usr/sbin/httpd
    restorecon reset /usr/sbin/httpd context system_u:object_r:unconfined_exec_t:s0->system_u:object_r:httpd_exec_t:s0
    /usr/sbin/httpdhttpd_exec_t タイプがラベル付けされていることを確認します。
    ~]$ ls -Z /usr/sbin/httpd
    -rwxr-xr-x  root root system_u:object_r:httpd_exec_t:s0 /usr/sbin/httpd
  9. root で以下のコマンドを実行して httpd を再起動します。再起動したら、httpd が制限のある httpd_t ドメインで実行していることを確認します。
    ~]# systemctl restart httpd.service
    ~]$ ps -eZ | grep httpd
    system_u:system_r:httpd_t:s0    8883 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    8884 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    8885 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    8886 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    8887 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    8888 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    8889 ?        00:00:00 httpd
  10. root で testfile を削除します。
    ~]# rm -i /var/www/html/testfile
    rm: remove regular empty file `/var/www/html/testfile'? y
  11. httpd の実行が必要がない場合は、root で以下のコマンドを実行して httpd を停止します。
    ~]# systemctl stop httpd.service
このセクションの例は、危険にさらされた制限のあるプロセスからデータがどのように保護されるか (SELinux で保護)、また危険にさらされた制限のないプロセスから攻撃者がよりデータにアクセスしやすいか (SELinux で保護されていない) を示しています。