Red Hat Training
A Red Hat training course is available for Red Hat Enterprise Linux
8.2.2. 制限のあるサービスの実行方法
サービスは、様々な方法で実行可能です。このため、SELinux にサービスの実行方法を指示する必要があります。これは、ランタイム時に SELinux ポリシーの一部変更を許可するブール値でできます。これは、SELinux ポリシー記述の知識がなくても可能です。これにより、SELinux ポリシーの再ロードや再コンパイルをせずに、NFS ファイルシステムへのサービスによるアクセスを許可するといった変更が可能になります。また、デフォルトでないポート番号でのサービス実行は、
semanage
コマンドでポリシー設定を更新する必要があります。
例えば、Apache HTTP Server の MySQL との通信を許可するには、
httpd_can_network_connect_db
のブール値をオンにします。
~]# setsebool -P httpd_can_network_connect_db on
特定のサービスでアクセスが拒否される場合は、
getsebool
および grep
コマンドを使って、アクセスを許可するブール値が利用可能かどうかを調べます。例えば、getsebool -a | grep ftp
コマンドと使って FTP 関連のブール値を検索します。
~]$ getsebool -a | grep ftp
allow_ftpd_anon_write --> off
allow_ftpd_full_access --> off
allow_ftpd_use_cifs --> off
allow_ftpd_use_nfs --> off
ftp_home_dir --> off
ftpd_connect_db --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
ブール値の一覧表示とそれらがオンかオフかを表示するには、
getsebool -a
コマンドを実行します。ブール値の一覧表示、各ブール値の説明、それらがオンかオフかについては、Linux root で semanage boolean -l
を実行します。ブール値の一覧表示と設定については、「ブール値」 を参照してください。
ポート番号
ポリシー設定によっては、サービスは特定のポート番号でのみ実行が許可されます。サービスが実行されているポートをポリシーを変更せずに変えようとすると、サービスのスタート失敗につながる場合があります。例えば、Linux 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 Server がリッスン可能なポートを定義します。このケースでは、TCP ポート 80、443、488、8008、8009、8443 になります。管理者が httpd.conf
を設定し httpd
がポート 9876 (Listen 9876
) をリッスンするようにしても、ポリシーがこれを反映するように更新されていないと、service httpd start
コマンドは失敗します。
~]# service httpd start
Starting httpd: (13)Permission denied: make_sock: could not bind to address [::]:9876
(13)Permission denied: make_sock: could not bind to address 0.0.0.0:9876
no listening sockets available, shutting down
Unable to open logs
[FAILED]
以下のような 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
http_port_t
ポートタイプに一覧表示されていないポートを httpd
がリッスンできるようにするには、semanage port
コマンドを実行して、ポートをポリシー設定に追加します[13]。
~]# semanage port -a -t http_port_t -p tcp 9876
-a
オプションは新規レコードを追加します。-t
オプションはタイプを定義します。-p
オプションはプロトコルを定義します。最後の引数は、追加するポート番号です。
[13]
semanage port -a
コマンドは、エントリーを /etc/selinux/targeted/modules/active/ports.local
ファイルに追加します。注記: デフォルトでは、このファイルは Linux root ユーザーのみが読み取れます。