11.2. 問題の上位 3 つの原因
以下のセクションでは、問題の上位 3 つの原因 (ラベリングの問題、サービスのブール値とポートの設定、および SELinux ルールの進化) を説明します。
11.2.1. ラベル付けの問題 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
SELinux を実行しているシステムでは、すべてのプロセスとファイルに、セキュリティー関連の情報を含むラベルが付けられています。この情報は SELinux コンテキストと呼ばれます。このラベルが間違っていると、アクセスが拒否される可能性があります。ラベルが間違っていると、正しくないアプリケーションのプロセスにラベルが割り当てられる可能性があります。これにより、SELinux がアクセスを拒否し、プロセスが誤ったラベルのファイルを作成する可能性があります。
ラベル付けの問題の一般的な原因として、非標準ディレクトリーがサービスに使用される場合が挙げられます。たとえば、管理者は、Web サイトに
/var/www/html/ を使用する代わりに、/srv/myweb/ を使用します。Red Hat Enterprise Linux では、/srv ディレクトリーには var_t タイプのラベルが付けられます。/srv で作成されるファイルおよびディレクトリーは、このタイプを継承します。また、/myserver などの最上位のディレクトリーに新規作成したオブジェクトには、default_t タイプのラベルが付けられます。SELinux は、Apache HTTP Server (httpd)がこの両方のタイプにアクセスできないようにします。アクセスを許可するには、SELinux では、/srv/myweb/ のファイルが httpd からアクセス可能であることを認識する必要があります。
semanage fcontext -a -t httpd_sys_content_t "/srv/myweb(/.*)?"
~]# semanage fcontext -a -t httpd_sys_content_t "/srv/myweb(/.*)?"
この semanage コマンドは、
/srv/myweb/ ディレクトリー (およびその下のすべてのファイルおよびディレクトリー) のコンテキストを SELinux ファイルコンテキストの設定に追加します。[8].semanage ユーティリティーはコンテキストを変更しません。root で、restorecon ユーティリティーを実行して変更を適用します。
restorecon -R -v /srv/myweb
~]# restorecon -R -v /srv/myweb
ファイルコンテキストの設定にコンテキストを追加する方法は、「永続的な変更 - semanage fcontext」 を参照してください。
11.2.1.1. 正しいコンテキストとは ? リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
matchpathcon ユーティリティーは、ファイルパスのコンテキストを確認し、そのパスのデフォルトラベルと比較します。以下の例は、ラベルが間違っているファイルが含まれるディレクトリーで matchpathcon を使用した例を示しています。
matchpathcon -V /var/www/html/*
~]$ matchpathcon -V /var/www/html/*
/var/www/html/index.html has context unconfined_u:object_r:user_home_t:s0, should be system_u:object_r:httpd_sys_content_t:s0
/var/www/html/page1.html has context unconfined_u:object_r:user_home_t:s0, should be system_u:object_r:httpd_sys_content_t:s0
この例では、
index.html ファイルおよび page1.html ファイルに、user_home_t タイプのラベルが付けられています。このタイプは、ユーザーのホームディレクトリーのファイルに使用されます。mv コマンドを使用してファイルをホームディレクトリーから移動すると、ファイルに user_home_t タイプのラベルが付けられることがあります。このタイプは、ホームディレクトリーの外に存在してはなりません。このようなファイルを正しいタイプに復元するには、restorecon ユーティリティーを使用します。
restorecon -v /var/www/html/index.html
~]# restorecon -v /var/www/html/index.html
restorecon reset /var/www/html/index.html context unconfined_u:object_r:user_home_t:s0->system_u:object_r:httpd_sys_content_t:s0
ディレクトリー下の全ファイルのコンテキストを復元するには、
-R オプションを使用します。
restorecon -R -v /var/www/html/
~]# restorecon -R -v /var/www/html/
restorecon reset /var/www/html/page1.html context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:httpd_sys_content_t:s0
restorecon reset /var/www/html/index.html context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:httpd_sys_content_t:s0
matchpathcon の詳細な例は、「デフォルトの SELinux コンテキストの確認」 を参照してください。
11.2.2. 制限のあるサービスの実行方法 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
サービスはさまざまな方法で実行できます。これに対応するには、サービスの実行方法を指定する必要があります。これは、SELinux ポリシーの記述に関する知識がなくても、ランタイム時に SELinux ポリシーの一部を変更できるようにするブール値を使用して実現できます。これにより、SELinux ポリシーの再読み込みや再コンパイルを行わずに、サービスが NFS ボリュームにアクセスするのを許可するなどの変更が可能になります。また、デフォルト以外のポート番号でサービスを実行するには、semanage コマンドを使用してポリシー設定を更新する必要があります。
たとえば、Apache HTTP サーバーが MariaDB と接続するのを許可する場合は、
httpd_can_network_connect_db のブール値を有効にします。
setsebool -P httpd_can_network_connect_db on
~]# setsebool -P httpd_can_network_connect_db on
特定のサービスでアクセスが拒否される場合は、
getsebool ユーティリティーおよび grep ユーティリティーを使用して、アクセスを許可するブール値が利用できるかどうかを確認します。たとえば、getsebool -a | grep ftp コマンドを使用して FTP 関連のブール値を検索します。
ブール値のリストと、ブール値の有無を確認するには、getsebool -a コマンドを実行します。ブール値のリスト、各ブール値の意味、有効/無効を説明するには、root で semanage boolean -l を実行します。ブール値のリスト表示と設定の詳細は、「ブール値」 を参照してください。
ポート番号
ポリシー設定によっては、サービスは特定のポート番号でのみ実行できます。ポリシーを変更せずにサービスが実行するポートを変更しようとすると、サービスが起動できなくなる可能性があります。たとえば、root で semanage port -l | grep http コマンドを実行して、
http 関連のポートを一覧表示します。
http_port_t ポートタイプは、Apache HTTP サーバーがリッスンできるポートを定義します。この場合は、TCP ポート 80、443、488、8008、8009、および 8443 です。httpd がポート 9876 (Listen 976)でリッスンするように管理者が httpd.conf を設定しても、これを反映するようにポリシーが更新されていない場合、以下のコマンドは失敗します。
systemctl start httpd.service
~]# systemctl start httpd.service
Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details.
以下のような SELinux 拒否メッセージのログは、
/var/log/audit/audit.log に記録されます。
type=AVC msg=audit(1225948455.061:294): avc: denied { name_bind } for pid=4997 comm="httpd" src=9876 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:port_t:s0 tclass=tcp_socket
type=AVC msg=audit(1225948455.061:294): avc: denied { name_bind } for pid=4997 comm="httpd" src=9876 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:port_t:s0 tclass=tcp_socket
semanage port -a -t http_port_t -p tcp 9876
~]# semanage port -a -t http_port_t -p tcp 9876
-a オプションは新規レコードを追加します。-t オプションはタイプを定義し、-p オプションはプロトコルを定義します。最後の引数は、追加するポート番号です。
11.2.3. ルールの進化とアプリケーションの破損 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションが壊れ、SELinux がアクセスを拒否する可能性があります。また、SELinux ルールは進化しています。アプリケーションが特定の方法で実行しているのを SELinux が認識しておらず、アプリケーションが期待どおりに動作していても、アクセスを拒否してしまうような場合もあります。たとえば、PostgreSQL の新しいバージョンがリリースされた場合、アクセスが許可されるはずなのに、現在のポリシーがこれまでに確認したことのないアクションを実行し、アクセスが拒否される可能性があります。
このような状況では、アクセスが拒否された後に
audit2allow ユーティリティーを使用して、アクセスを許可するカスタムポリシーモジュールを作成します。audit2allow の使用方法は、「アクセスの許可: audit2allow」 を参照してください。
[8]
/etc/selinux/targeted/contexts/files/ のファイルは、ファイルおよびディレクトリーのコンテキストを定義します。このディレクトリーのファイルは、restorecon ユーティリティーおよび setfiles ユーティリティーにより読み込まれ、ファイルおよびディレクトリーをデフォルトコンテキストに復元します。
[9]
semanage port -a は、
/etc/selinux/targeted/modules/active/ports.local ファイルーにエントリーを追加します。デフォルトでは、このファイルは root のみが表示できることに注意してください。