Red Hat Training

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

11.2.2. 制限のあるサービスの実行方法

サービスはさまざまな方法で実行できます。これに対応するには、サービスの実行方法を指定する必要があります。これは、SELinux ポリシーの記述に関する知識がなくても、ランタイム時に SELinux ポリシーの一部を変更できるようにするブール値を使用して実現できます。これにより、SELinux ポリシーの再読み込みや再コンパイルを行わずに、サービスが NFS ボリュームにアクセスするのを許可するなどの変更が可能になります。また、デフォルト以外のポート番号でサービスを実行するには、semanage コマンドを使用してポリシー設定を更新する必要があります。
たとえば、Apache HTTP サーバーが MariaDB と接続するのを許可する場合は、httpd_can_network_connect_db のブール値を有効にします。
~]# setsebool -P httpd_can_network_connect_db on
特定のサービスでアクセスが拒否される場合は、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 コマンドを実行します。ブール値の一覧、各ブール値の意味、有効/無効を説明するには、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      5989
http_port_t ポートタイプは、Apache HTTP サーバーがリッスンできるポートを定義します。この場合は、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_socket
httpd が、http_port_t ポートタイプに追加されていないポートをリッスンできるようにするには、semanage port コマンドを実行して、ポリシー設定にポートを追加します。[9]:
~]# semanage port -a -t http_port_t -p tcp 9876
-a オプションは新規レコードを追加します。-t オプションはタイプを定義し、-p オプションはプロトコルを定義します。最後の引数は、追加するポート番号です。


[9] semanage port -a は、/etc/selinux/targeted/modules/active/ports.local ファイルーにエントリーを追加します。デフォルトでは、このファイルは root のみが表示できることに注意してください。