CentOS SELinux 故障排查技巧
一、快速定位流程
- 确认当前与持久化模式:使用 getenforce(返回 Enforcing/Permissive/Disabled)与 sestatus -v 查看详细状态与策略类型;如需临时放行用于排障,执行 setenforce 0(仅本次生效),恢复用 setenforce 1。永久变更需编辑 /etc/selinux/config 的 SELINUX= 与 SELINUXTYPE=,并重启生效。
- 定位拒绝事件:优先查看 /var/log/audit/audit.log,可用 tail -f /var/log/audit/audit.log | grep denied 实时观察,或用 ausearch -m AVC -ts recent 拉取最近的 AVC 拒绝记录。
- 解释拒绝原因:对日志进行可读化分析,使用 audit2why -a 输出“为什么被拒绝”及修复建议。
- 校验关键上下文:对比进程、文件、端口的 安全上下文(如 system_u:system_r:nginx_t:s0),命令示例:
- 文件:ls -Z /var/www/html/index.html
- 进程:ps -eZ | grep nginx
- 端口:semanage port -l | grep http
- 精准修复:优先用策略工具修正上下文或布尔值;确需放行时,再用 audit2allow 生成最小可用规则并编译为模块加载。
- 变更验证:改完策略/上下文后重启服务并复现问题,确认不再出现 AVC 拒绝。
二、常见场景与对策
- 文件或目录上下文错误(如网站根目录变更):
- 查看标准目录上下文:ls -Z /var/www/html/index.html;2) 为自定义目录添加 fcontext 规则:semanage fcontext -a -t httpd_sys_content_t ‘/srv/www(/.*)?’;3) 应用上下文:restorecon -Rv /srv/www。
- NFS/SMB 挂载访问被拒:
- 给挂载点设置合适类型:semanage fcontext -a -t nfs_share_t “/mnt/nfs(/.*)?”;2) 应用:restorecon -Rv /mnt/nfs;3) 若仍异常,检查挂载选项与远端共享权限。
- 服务端口不在允许列表:
- 查询端口类型:semanage port -l | grep http;2) 将自定义端口加入类型(示例):semanage port -a -t http_port_t -p tcp 8080(如端口已被占用或策略不允许,先调整服务端口或策略)。
- 仅需临时排障:
- 全局临时放行:setenforce 0;
- 仅对某一类型进程放行:semanage permissive -a nginx_t(恢复:semanage permissive -d nginx_t)。
- 图形化辅助:有 GUI 时可安装并使用 SELinux Alert Browser(sealert) 一键查看与定位告警。
三、日志与工具速查表
| 目标 |
命令示例 |
说明 |
| 查看模式 |
getenforce / sestatus -v |
快速与详细状态 |
| 切换模式 |
**setenforce 0 |
1** |
| 查 AVC 拒绝 |
ausearch -m AVC -ts recent |
最近拒绝事件 |
| 解释原因 |
audit2why -a |
输出拒绝原因与建议 |
| 生成规则 |
audit2allow -a |
从日志生成 TE 规则草案 |
| 文件上下文 |
ls -Z / chcon -t type |
查看/临时修改 |
| 永久上下文 |
semanage fcontext -a -t type ‘/path(/.*)?’ + restorecon -Rv /path |
持久化修正 |
| 端口上下文 |
**semanage port -l |
grep http** / semanage port -a -t http_port_t -p tcp 8080 |
| 进程上下文 |
**ps -eZ |
grep nginx** |
| 布尔值开关 |
getsebool/setsebool -P httpd_can_network_connect on |
在线/持久化开关 |
以上命令覆盖了定位、解释、修复与验证的关键环节,适用于 RHEL/CentOS 7/8 的 targeted 策略环境。
四、安全修复与回滚建议
- 最小权限原则:优先通过 restorecon/fcontext 恢复为正确的默认类型,或用 semanage boolean -P 调整布尔值;仅在确有必要时才新增策略模块。
- 规则评审与测试:用 audit2allow -a 生成草案后,先在测试环境验证,确认不会引入过度放行;必要时拆分规则、细化到具体类型与权限。
- 模块化管理:将定制规则编译为模块并入库,便于回滚与复用,例如:
- 生成模块包:audit2allow -a -M mynginx
- 查看内容:semodule -i mynginx.pp
- 回滚:semodule -r mynginx
- 变更留痕:记录修改前后上下文/布尔值与规则版本,便于审计与回退。
五、排障禁忌与注意事项
- 避免直接 setenforce 0 长期运行:这会关闭强制访问控制,仅应作为临时排障手段;排障完成务必恢复到 Enforcing。
- 谨慎使用 chcon:仅临时修正;持久化请使用 semanage fcontext + restorecon,否则目录重建或 restorecon 运行后可能恢复错误上下文。
- 不要长期将进程设为 Permissive:使用 semanage permissive -a 仅针对问题进程类型,便于定位且风险可控。
- 修改 /etc/selinux/config 后必须重启才生效;变更前建议备份现有策略与关键配置文件。
- 生产环境优先“修上下文/布尔值”,其次“最小规则模块”,最后才考虑放宽策略;每次变更后进行业务回归与 AVC 复查。