5.3. 分析した SELinux 拒否の修正
sealert コマンドによって提案されたラベル付けの問題と設定調整を優先して、SELinux ポリシーの問題を修正します。他のトラブルシューティング手順が失敗した場合を除き、ローカルポリシーモジュールをすぐに生成しないようにしてください。
ほとんどの場合、sealert ツールが提供する提案により、SELinux ポリシーに関連する問題を修正するための適切なガイドが提供されます。sealert を使用して SELinux 拒否を解析する方法は、SELinux 拒否メッセージの解析 を参照してください。
ツールが、audit2allow コマンドを使用して設定変更を提案している場合は注意が必要です。SELinux の拒否が発生した場合、最初にローカルポリシーモジュールを生成する手段として audit2allow を使用すべきではありません。トラブルシューティングは、問題がラベルにあるかどうかを確認することから始めるべきです。2 番目に多いケースは、プロセス設定を変更したにもかかわらず、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コマンドは、/srv/myweb/ディレクトリーおよびその下のすべてのファイルおよびディレクトリーのコンテキストを SELinux ファイルコンテキストの設定に追加します。semanageユーティリティーはコンテキストを変更しません。root でrestoreconユーティリティーを使用して変更を適用します。# restorecon -R -v /srv/myweb- コンテキストの誤り
matchpathconコマンドは、ファイルパスのコンテキストをチェックし、そのパスのデフォルトラベルと比較します。以下の例では、ラベルが間違っているファイルを含むディレクトリーにおけるmatchpathconの使用方法を説明します。$ 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 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 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- 標準以外の方法で設定された制限のあるアプリケーション
サービスはさまざまな方法で実行できます。それを考慮するには、サービスをどのように運用するかを具体的に指定する必要があります。これは、実行時に SELinux ポリシーの一部を変更できるようにする SELinux ブール値を使用することで実現できます。これにより、SELinux ポリシーの再読み込みや再コンパイルを行わずに、サービスが NFS ボリュームにアクセスするのを許可するなどの変更が可能になります。また、デフォルト以外のポート番号でサービスを実行するには、
semanageコマンドを使用してポリシー設定を更新する必要があります。たとえば、Apache HTTP Server が MariaDB と接続するのを許可する場合は、
httpd_can_network_connect_dbのブール値を有効にします。# setsebool -P httpd_can_network_connect_db on-Pオプションを指定すると、システムを再起動しても設定が保持されることに注意してください。SELinux が特定のサービスへのアクセスを拒否した場合、
getseboolとgrepユーティリティーを使用して、アクセスを許可するためのブール値が利用可能かどうかを確認します。たとえば、getsebool -a | grep ftpコマンドを使用して、FTP 関連のブール値を検索します。$ getsebool -a | grep ftp ftpd_anon_write --> off ftpd_full_access --> off ftpd_use_cifs --> off ftpd_use_nfs --> off ftpd_connect_db --> off httpd_enable_ftp_server --> off tftp_anon_write --> offブール値のリストを取得し、それらが有効か無効かを確認するには、
getsebool -aコマンドを使用します。ブール値とその意味および状態のリストを取得するには、selinux-policy-develパッケージをインストールし、root 権限でsemanage boolean -lコマンドを実行します。- ポート番号
ポリシー設定によっては、サービスは特定のポート番号でのみ実行できます。ポリシーを変更せずにサービスが実行するポートを変更しようとすると、サービスが起動できなくなる可能性があります。たとえば、root で
semanage port -l | grep httpコマンドを実行して、http関連のポートを一覧表示します。# semanage port -l | grep http http_cache_port_t tcp 3128, 8080, 8118 http_cache_port_t udp 3130 http_port_t tcp 80, 443, 488, 8008, 8009, 8443 pegasus_http_port_t tcp 5988 pegasus_https_port_t tcp 5989http_port_tポートタイプは、Apache HTTP Server がリッスン可能なポートを定義します。この場合の TCP ポートは 80、443、488、8008、8009、および 8443 になります。管理者がhttpdがポート 9876 (Listen 9876) でリッスンするようにhttpd.confを設定しても、ポリシーがこれを反映するように更新されていない場合、次のコマンドは失敗します。# systemctl start httpd.service Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details. # systemctl status httpd.service httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: failed (Result: exit-code) since Thu 2013-08-15 09:57:05 CEST; 59s ago Process: 16874 ExecStop=/usr/sbin/httpd $OPTIONS -k graceful-stop (code=exited, status=0/SUCCESS) Process: 16870 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)以下のような 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_sockethttpdがhttp_port_tポートタイプに追加されていないポートをリッスンできるようにするには、semanage portコマンドを使用して別のラベルをポートに割り当てます。# semanage port -a -t http_port_t -p tcp 9876-aオプションは新規レコードを追加します。-tオプションはタイプを定義し、-pオプションはプロトコルを定義します。最後の引数は、追加するポート番号です。- 進化または破損したアプリケーション、および侵害されたシステム (稀に発生する難しいケース)
アプリケーションには、SELinux がアクセスを拒否する原因となるバグが含まれている可能性があります。また、SELinux のルールも進化させる必要があります。SELinux ポリシーに、特定の方法で実行されるアプリケーションに対するルールが欠けている場合、アプリケーションが期待どおりに動作しているにもかかわらず、アクセスが拒否される可能性があります。たとえば、PostgreSQL の新しいバージョンがリリースされた場合、現在のポリシーでは想定されていない動作を実行する可能性があり、本来許可されるべきアクセスが拒否される結果となる可能性があります。
このような状況では、アクセスが拒否された後に
audit2allowユーティリティーを使用して、アクセスを許可するカスタムポリシーモジュールを作成します。SELinux ポリシーに不足しているルールを報告するには Red Hat カスタマーポータル でサポートケースを提出します。selinux-policyコンポーネントについて言及して、audit2allow -w -aおよびaudit2allow -aコマンドの出力を含めます。アプリケーションが主要なセキュリティー特権を要求する場合、それはアプリケーションが侵害されている兆候である可能性があります。侵入検出ツールを使用して、このような疑わしい動作を検査します。
また、Red Hat カスタマーポータル の Solution Engine では、同じ問題または非常に類似する問題に関する記事が提供されます。ここでは、問題の解決策と考えられる方法が示されています。関連する製品とバージョンを選択し、selinux、avc などの SELinux 関連のキーワードと、ブロックされたサービスまたはアプリケーションの名前 (
selinux sambaなど) を使用します。