【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 ~]# yum -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 ~]# yum -y install setools-console
~~~
[root@localhost ~]# sesearch -b httpd_can_network_connect -AC
Found 31 semantic av rules:
ET allow httpd_suexec_t netif_t : netif { udp_recv ingress } ; [ httpd_can_network_connect ]
ET allow httpd_suexec_t netif_t : netif { udp_send egress } ; [ httpd_can_network_connect ]
ET allow httpd_suexec_t netif_t : netif { tcp_recv tcp_send ingress egress } ; [ httpd_can_network_connect ]
ET allow httpd_sys_script_t httpd_sys_script_t : tcp_socket { ioctl read write create getattr setattr lock append bind connect listen accept getopt setopt shutdown } ; [ httpd_enable_cgi httpd_can_network_connect && ]
ET allow httpd_suexec_t node_t : node { udp_recv recvfrom } ; [ httpd_can_network_connect ]
ET allow httpd_suexec_t node_t : node { udp_send sendto } ; [ httpd_can_network_connect ]
ET allow httpd_suexec_t node_t : node { tcp_recv tcp_send recvfrom sendto } ; [ httpd_can_network_connect ]
ET allow httpd_suexec_t httpd_suexec_t : tcp_socket { ioctl read write create getattr setattr lock append bind connect listen accept getopt setopt shutdown } ; [ httpd_can_network_connect ]
ET allow httpd_sys_script_t port_type : tcp_socket name_connect ; [ httpd_enable_cgi httpd_can_network_connect && ]
ET allow httpd_sys_script_t port_type : tcp_socket { recv_msg send_msg } ; [ httpd_enable_cgi httpd_can_network_connect && ]
ET allow httpd_suexec_t port_type : tcp_socket name_connect ; [ httpd_can_network_connect ]
ET allow httpd_suexec_t port_type : tcp_socket { recv_msg send_msg } ; [ httpd_can_network_connect ]
ET allow httpd_sys_script_t httpd_sys_script_t : udp_socket { ioctl read write create getattr setattr lock append bind connect getopt setopt shutdown } ; [ httpd_enable_cgi httpd_can_network_connect && ]
ET allow httpd_suexec_t httpd_suexec_t : udp_socket { ioctl read write create getattr setattr lock append bind connect getopt setopt shutdown } ; [ httpd_can_network_connect ]
ET allow httpd_sys_script_t node_t : node { udp_recv recvfrom } ; [ httpd_enable_cgi httpd_can_network_connect && ]
ET allow httpd_sys_script_t node_t : node { udp_send sendto } ; [ httpd_enable_cgi httpd_can_network_connect && ]
ET allow httpd_sys_script_t node_t : node { tcp_recv tcp_send recvfrom sendto } ; [ httpd_enable_cgi httpd_can_network_connect && ]
ET allow httpd_t port_type : tcp_socket name_connect ; [ httpd_can_network_connect ]
ET allow httpd_suexec_t client_packet_type : packet recv ; [ httpd_can_network_connect ]
ET allow httpd_suexec_t client_packet_type : packet send ; [ httpd_can_network_connect ]
ET allow httpd_sys_script_t client_packet_type : packet recv ; [ httpd_enable_cgi httpd_can_network_connect && ]
ET allow httpd_sys_script_t client_packet_type : packet send ; [ httpd_enable_cgi httpd_can_network_connect && ]
ET allow httpd_sys_script_t netif_t : netif { udp_recv ingress } ; [ httpd_enable_cgi httpd_can_network_connect && ]
ET allow httpd_sys_script_t netif_t : netif { udp_send egress } ; [ httpd_enable_cgi httpd_can_network_connect && ]
ET allow httpd_sys_script_t netif_t : netif { tcp_recv tcp_send ingress egress } ; [ httpd_enable_cgi httpd_can_network_connect && ]
ET allow httpd_sys_script_t node_t : tcp_socket node_bind ; [ httpd_enable_cgi httpd_can_network_connect && ]
ET allow httpd_sys_script_t node_t : udp_socket node_bind ; [ httpd_enable_cgi httpd_can_network_connect && ]
ET allow httpd_suexec_t port_type : udp_socket recv_msg ; [ httpd_can_network_connect ]
ET allow httpd_suexec_t port_type : udp_socket send_msg ; [ httpd_can_network_connect ]
ET allow httpd_sys_script_t port_type : udp_socket recv_msg ; [ httpd_enable_cgi httpd_can_network_connect && ]
ET allow httpd_sys_script_t port_type : udp_socket send_msg ; [ httpd_enable_cgi httpd_can_network_connect && ]
[root@localhost ~]#

左端の E は enable、つまり有効な状態を意味します。httpd_can_network_connect を off にすると左端が D = disable、つまり無効な状態を意味します。

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

https://bugzilla.redhat.com/show_bug.cgi?id=1352257

シェアする

  • このエントリーをはてなブックマークに追加

フォローする