7.2. 使用命令行助手排除 SELinux 问题
您可以使用命令行助手对 SELinux 问题进行故障排除。示例故障排除过程演示了命令行助手的诊断功能。
先决条件
- 您已启用了命令行助手。
- 您有对系统的 root 访问权限。
流程
检查
httpd软件包版本,并确定 Web 服务器接受传入请求的端口:$ sudo rpm -qa httpdhttpd-2.4.62-2.fc40.x86_64$ cat /etc/httpd/conf/httpd.conf | grep ListenListen 80重启
httpd服务并检查错误:$ systemctl restart httpd $ sudo journalctl -xeu httpd.serviceJob for httpd. Service failed because the control process exited with error code.使用命令行助手来排除服务故障并检查 SELinux 状态:
$ c "why did httpd fail to start" $ c "selinux httpd port" $ sudo sestatus检查
httpd的 SELinux 上下文,并询问命令行助手获取指导信息:$ sudo cat /usr/share/selinux/targeted/contexts/httpd_var_run_tNo such file or directory$ c "i don't have a httpd_var_run_t contexts"设置 SELinux 上下文,并根据命令行助手建议配置端口:
$ sudo chcon -R -t httpd_var_run_t $ c "selinux won't let httpd listen on port 12345" $ sudo semanage port -a -t httpd_port_t -p tcp 12345如果您收到
ValueError,请询问命令行助手并应用推荐的修复:$ c "how do I fix ValueError: Type httpd_port_t is invalid, must be a port type" $ sudo ls -Z /usr/sbin/httpd $ chcon -t httpd_exec_t /usr/sbin/httpd $ sudo setenforce 1重启
httpd并在服务仍然失败时启用网络连接:$ sudo systemctl restart httpd $ c "how do I enable httpd to listen on port 12345 selinux" $ sudo setsebool -P httpd_can_network_connect=1如果服务再次失败,请检查日志并搜索 SELinux 拒绝:
$ journalctl -xeu httpd $ c "An ExecStart= process belonging to unit httpd.service has exited." $ sudo ausearch -m AVC,USER_AVC -ts recent在命令行助手中输入 AVC 拒绝输出进行分析:
$ c "avc: denied {name_bind} for pid=7184 comm="httpd" src=12345 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:unreserved_port_t:s0 tclass=tcp_socket permissive=0"将端口添加到正确的 SELinux 类型中以解决绑定错误:
$ sudo semanage port -a -t http_port_t -p tcp 12345
验证
重启 httpd 服务,并检查
httpd.service的状态:$ sudo systemctl restart httpd$ No error$ sudo systemctl status httpd.service服务器已配置、启动并在运行,并侦听
端口 443,端口 12345。