SELinux

【SELinux】Boolean の仕組みと getsebool / setsebool コマンドの使い方

SELinux の Boolean とは何か

SELinux には Boolean と呼ばれる許可ルールのグループが定義されています。

例えば有名な Boolean の1つとして、「httpd_can_network_connect」があります。

これは httpd がCGIやPHP等のスクリプトを使って database や ldap , smtp等のプロトコルを使って外部ネットワークアクセスをする際に必要となる許可ルールが一式揃っており、httpd_can_network_connect を ON にするとそれら一式が全て許可される、というものです。

この Boolean の正体は、SELinux ポリシーの中の Conditional Policy と呼ばれるもので、条件によって有効/無効が変わるポリシーです。具体的には Booleanの値が 1 か 0 かで有効/無効が変わります。

getsebool / setsebool の使い方

有効無効の確認は getsebool を、設定は setsebool を使います。これらのコマンドは policycoreutils-python パッケージに含まれています。

[root@localhost ~]# dnf -y install policycoreutils-python
~~~
[root@localhost ~]# getsebool httpd_can_network_connect
httpd_can_network_connect --> off
[root@localhost ~]# setsebool -P httpd_can_network_connect on
[root@localhost ~]# getsebool httpd_can_network_connect
httpd_can_network_connect --> on
[root@localhost ~]#

"setsebool -P" の -P は persistent の意味で、再起動後も設定を維持するオプションです。

また、Boolean を一覧表示するには、”getsebool -a" を使います。-a は all の意味です。

[root@localhost ~]# getsebool -a | more
abrt_anon_write --> off
abrt_handle_event --> off
abrt_upload_watch_anon_write --> on
antivirus_can_scan_system --> off
antivirus_use_jit --> off
auditadm_exec_content --> on
authlogin_nsswitch_use_ldap --> off
authlogin_radius --> off

デフォルトで on になっているものも結構あります。

httpd_can_network_connect の許可ルール一式は sesearch コマンドで確認できます。sesearch は setools-console パッケージに含まれています。

[root@localhost ~]# dnf -y install setools-console
~~~
[root@localhost ~]# sesearch -b httpd_can_network_connect -A
allow httpd_suexec_t client_packet_type:packet recv; [ httpd_can_network_connect ]:True
allow httpd_suexec_t client_packet_type:packet send; [ httpd_can_network_connect ]:True
allow httpd_suexec_t httpd_suexec_t:tcp_socket { accept append bind connect create getattr getopt ioctl listen lock read setattr setopt shutdown write }; [ httpd_can_network_connect ]:True
allow httpd_suexec_t httpd_suexec_t:udp_socket { append bind connect create getattr getopt ioctl lock read setattr setopt shutdown write }; [ httpd_can_network_connect ]:True
allow httpd_suexec_t netif_t:netif { egress ingress tcp_recv tcp_send }; [ httpd_can_network_connect ]:True
allow httpd_suexec_t netif_t:netif { egress udp_send }; [ httpd_can_network_connect ]:True
allow httpd_suexec_t netif_t:netif { ingress udp_recv }; [ httpd_can_network_connect ]:True
allow httpd_suexec_t node_t:node { recvfrom sendto tcp_recv tcp_send }; [ httpd_can_network_connect ]:True
allow httpd_suexec_t node_t:node { recvfrom udp_recv }; [ httpd_can_network_connect ]:True
allow httpd_suexec_t node_t:node { sendto udp_send }; [ httpd_can_network_connect ]:True
allow httpd_suexec_t port_type:tcp_socket name_connect; [ httpd_can_network_connect ]:True
allow httpd_suexec_t port_type:tcp_socket { recv_msg send_msg }; [ httpd_can_network_connect ]:True
allow httpd_suexec_t port_type:udp_socket recv_msg; [ httpd_can_network_connect ]:True
allow httpd_suexec_t port_type:udp_socket send_msg; [ httpd_can_network_connect ]:True
allow httpd_sys_script_t client_packet_type:packet recv; [ httpd_can_network_connect && httpd_enable_cgi ]:True
allow httpd_sys_script_t client_packet_type:packet send; [ httpd_can_network_connect && httpd_enable_cgi ]:True
allow httpd_sys_script_t httpd_sys_script_t:tcp_socket { accept append bind connect create getattr getopt ioctl listen lock read setattr setopt shutdown write }; [ httpd_can_network_connect && httpd_enable_cgi ]:True
allow httpd_sys_script_t httpd_sys_script_t:udp_socket { append bind connect create getattr getopt ioctl lock read setattr setopt shutdown write }; [ httpd_can_network_connect && httpd_enable_cgi ]:True
allow httpd_sys_script_t netif_t:netif { egress ingress tcp_recv tcp_send }; [ httpd_can_network_connect && httpd_enable_cgi ]:True
allow httpd_sys_script_t netif_t:netif { egress udp_send }; [ httpd_can_network_connect && httpd_enable_cgi ]:True
allow httpd_sys_script_t netif_t:netif { ingress udp_recv }; [ httpd_can_network_connect && httpd_enable_cgi ]:True
allow httpd_sys_script_t node_t:node { recvfrom sendto tcp_recv tcp_send }; [ httpd_can_network_connect && httpd_enable_cgi ]:True
allow httpd_sys_script_t node_t:node { recvfrom udp_recv }; [ httpd_can_network_connect && httpd_enable_cgi ]:True
allow httpd_sys_script_t node_t:node { sendto udp_send }; [ httpd_can_network_connect && httpd_enable_cgi ]:True
allow httpd_sys_script_t node_t:tcp_socket node_bind; [ httpd_can_network_connect && httpd_enable_cgi ]:True
allow httpd_sys_script_t node_t:udp_socket node_bind; [ httpd_can_network_connect && httpd_enable_cgi ]:True
allow httpd_sys_script_t port_type:tcp_socket name_connect; [ httpd_can_network_connect && httpd_enable_cgi ]:True
allow httpd_sys_script_t port_type:tcp_socket { recv_msg send_msg }; [ httpd_can_network_connect && httpd_enable_cgi ]:True
allow httpd_sys_script_t port_type:udp_socket recv_msg; [ httpd_can_network_connect && httpd_enable_cgi ]:True
allow httpd_sys_script_t port_type:udp_socket send_msg; [ httpd_can_network_connect && httpd_enable_cgi ]:True
allow httpd_t port_type:tcp_socket name_connect; [ httpd_can_network_connect ]:True
[root@localhost ~]#

Boolean の定義変更

Boolean は定義が変わることもありますし、無くなる場合もあります。

例えば CentOS7.2/RHEL7.2 まではよく使われていた ftp_home_dir ですが、ポリシーに様々なルールが追加される過程で無意味(on でも off でも結果が変わらない状態) になってしまったため、CentOS7.3/RHEL7.3 以降では廃止されました。

[root@localhost ~]# setsebool -P ftp_home_dir=1
Boolean ftp_home_dir is not defined
1352257 – selinux policy missing ftp_home_dir boolean

コメント

タイトルとURLをコピーしました