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 ドメインで実行されます。これはサンプルであり、本番環境では使用しないでください。httpd、wget、dbus、および audit パッケージがインストールされ、SELinux Targeted ポリシーが使用され、SELinux が Enforcing モードで実行されていることを前提としています。
手順3.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 - 以下のコマンドを実行して、
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 httpdプロセスが制限なしで実行されるようにするには、root で以下のコマンドを実行して、/usr/sbin/httpdファイルのタイプを、制限のあるドメインに移行しないタイプに変更します。~]# chcon -t bin_t /usr/sbin/httpd/usr/sbin/httpdにbin_tタイプのラベルが付けられていることを確認します。~]$ ls -Z /usr/sbin/httpd -rwxr-xr-x. root root system_u:object_r:bin_t:s0 /usr/sbin/httpd- 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 - 以下のコマンドを入力して、
unconfined_service_tドメインで実行しているhttpdを表示します。~]$ 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 - 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 コマンドは失敗していました。 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/httpdにhttpd_exec_tタイプのラベルが付けられていることを確認します。~]$ ls -Z /usr/sbin/httpd -rwxr-xr-x root root system_u:object_r:httpd_exec_t:s0 /usr/sbin/httpd- root で次のコマンドを実行して
httpdを再起動します。再起動したら、制限のあるhttpd_tドメインでhttpdが実行されていることを確認します。~]# 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 - root で
testfileを削除します。~]# rm -i /var/www/html/testfile rm: remove regular empty file `/var/www/html/testfile'? y httpdを実行する必要がない場合は、root で以下のコマンドを実行してhttpdを停止します。~]# systemctl stop httpd.service
これらのセクションの例では、セキュリティー侵害を受けた制限のあるプロセス (SELinux で保護) からデータを保護する方法、およびセキュリティー侵害を受けた制限のないプロセス (SELinux によって保護されていない) のデータがいかに攻撃者にとってアクセスしやすいかについて示します。