温馨提示×

centos selinux如何排错

小樊
54
2026-09-26 23:30:50
栏目: 智能运维

在 CentOS(以及 RHEL 系列)中,SELinux 常常是导致“权限明明对了却访问不了”的罪魁祸首。下面按从易到难、从排查到修复的顺序,系统讲一下 SELinux 排错方法。


一、先确认是不是 SELinux 的问题

1. 查看 SELinux 状态

getenforce
  • Enforcing:正在强制生效(最严格)
  • Permissive:只记录不拦截(排错常用)
  • Disabled:已关闭

查看详细状态:

sestatus

2. 临时关闭测试(仅排错用)

setenforce 0   # 切到 Permissive

如果服务立刻正常 → 基本可以确定是 SELinux 问题

⚠️ 生产环境不要长期关 SELinux,应改策略而不是关掉


二、查看 SELinux 拒绝日志(核心)

1. 使用 ausearch(最推荐)

ausearch -m avc -ts recent

或指定服务:

ausearch -m avc -c httpd

常见字段解释:

  • scontext:源上下文(进程)
  • tcontext:目标上下文(文件/端口)
  • tclass:类型(file / dir / tcp_socket)
  • denied:被拒绝的权限

2. 查看 /var/log/audit/audit.log

grep avc /var/log/audit/audit.log

3. 使用 setroubleshoot(新手友好)

安装:

yum install -y setroubleshoot-server

查看建议:

sealert -a /var/log/audit/audit.log

会直接告诉你:

  • 哪里被拒
  • 应该执行哪条命令修复

三、快速修复(最常见场景)

场景 1:Web 服务无法访问文件

ls -Z /var/www/html/

正确上下文应是:

httpd_sys_content_t

修复:

semanage fcontext -a -t httpd_sys_content_t "/data/web(/.*)?"
restorecon -Rv /data/web

场景 2:服务绑定非标准端口

例如 Nginx 用 8080:

semanage port -a -t http_port_t -p tcp 8080

查看端口策略:

semanage port -l | grep http

场景 3:进程访问被拒(布尔值)

查看相关布尔:

getsebool -a | grep httpd

开启:

setsebool -P httpd_can_network_connect on

(-P 表示永久)


四、文件上下文错误修复(非常常见)

1. 查看文件上下文

ls -Z 文件

2. 修复上下文

restorecon -Rv /path

3. 永久定义规则

semanage fcontext -a -t 类型 "/path(/.*)?"
restorecon -Rv /path

五、生成并应用 SELinux 策略(自动化)

使用 audit2allow

ausearch -m avc -ts recent | audit2allow -M myfix
semodule -i myfix.pp

⚠️ 注意:

  • audit2allow 是“兜底方案”
  • 优先用 布尔 / 端口 / 上下文
  • 不要盲目允许所有拒绝

六、排错标准流程(推荐记下来)

  1. getenforce
  2. setenforce 0 测试
  3. ausearch -m avc
  4. sealert -a
  5. 修上下文 / 端口 / 布尔
  6. restorecon
  7. setenforce 1

七、常见坑提醒

  • 文件是从 /tmp 或 home 拷过来的 → 上下文必错
  • NFS / FTP / Samba 都有专门布尔
  • Docker 容器里 SELinux 也要单独配置
  • Disabled 切回 Enforcing 前必须 fixfiles onboot

如果你有具体报错场景(如 Nginx / FTP / MySQL / 自定义服务),可以把 ausearch 或 sealert 的输出贴出来,我可以直接帮你写修复命令。

0 踩