Red Hat Training

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

11.2.2. 受限服务如何运行?

服务可以以多种方式运行。为了满足此需求,您需要指定如何运行您的服务。这可以通过布尔值来实现,允许在运行时更改 SELinux 策略的部分,而不必知晓编写 SELinux 策略。这允许更改,例如允许服务访问 NFS 卷,而无需重新加载或重新编译 SELinux 策略。此外,在非默认端口号上运行服务需要使用 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
要列出布尔值列表以及布尔值是 on 或 off,请运行 getsebool -a 命令。对于布尔值列表,说明每个布尔值是什么,以及它们是 on 或 off,以 root 用户身份运行 semanage boolean -l 命令。有关列出和配置布尔值的详情,请查看 第 4.6 节 “布尔值”

端口号

根据策略配置,服务只能在某些端口号中运行。尝试更改服务在没有更改策略的情况下运行的端口可能会导致服务无法启动。例如,以 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.conf,以便 httpd 侦听端口 9876(Listen 9876),但没有更新策略来反映这一点,以下命令会失败:
~]# 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)
/var/log/audit/audit.log 中记录类似如下的 SELinux 拒绝信息:
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 用户查看。