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
IT/インフラエンジニアの地位とスキル向上のために


コメント