SELinux 拒绝怎么定位
服务报权限拒绝、日志里出现 Permission denied,而文件权限本身没问题时,优先怀疑 SELinux。判定线索很直接:把模式临时切成 permissive 后恢复正常,基本可以确认是 SELinux 介入。定位顺序固定为 模式确认 → 抓 AVC 拒绝记录 → 读解释 → 按最小代价修复(标签、布尔或策略)→ 回到 enforcing 复测。不要用关闭 SELinux 收场。
基本信息
| 查看模式 | getenforce 返回 Enforcing/Permissive/Disabled;sestatus 看策略与详情 |
|---|---|
| 拒绝记录 | ausearch -m avc -ts recent,或 dmesg | grep -i avc |
| 解释工具 | sealert -a 日志文件、audit2why |
| 修复手段 | restorecon(标签)、setsebool -P(布尔)、semanage(策略与端口) |
| 权限要求 | root 或 sudo |
典型使用场景
- 应用日志目录迁移后服务无法写日志,报 Permission denied
- 自建服务监听非标准端口被拒(如 8080、9000)
- Web 上传目录可以列出但写不进去
- NFS 或共享目录挂载后匿名用户被拒
- 安全加固把系统切成 enforcing 后,原本隐藏的越权访问大面积暴露
五步定位演示
五步定位演示
getenforce # 1 确认当前模式
sestatus | head -5 # 1 看策略与挂载状态
curl -I http://127.0.0.1/app 2>&1 | head # 2 复现问题
ausearch -m avc -ts recent | tail -30 # 2 抓最近拒绝记录
sealert -a /var/log/audit/audit.log | head -40 # 3 读解释与建议
restorecon -Rv /data/web # 4 按建议修复(示例:标签)
setsebool -P httpd_can_network_connect on # 4 需要联网时的布尔开关
ss -tlnp | grep app # 5 回 enforcing 复测AVC 记录关键字段
| 字段 | 含义 | 排查用途 |
|---|---|---|
| denied | 动作被拒 | 确认是拒绝而非放行记录 |
| scontext | 发起方上下文 | 进程的类型域,如 httpd_t |
| tcontext | 目标上下文 | 文件或端口的类型,如 default_t |
| tclass | 目标类别 | file、dir、tcp_socket 等 |
| comm / exe | 发起进程 | 直接定位是哪个程序触发 |
| permissive=0 | 当前为强制模式 | 为 1 表示只在 permissive 下记录 |
setenforce 0 只能用来验证因果关系,确认后立刻 setenforce 1;把系统长期跑在 permissive 或直接 disabled 会让加固与等保审计项不达标。
从 disabled 改成 enforcing 前,官方建议先创建 /.autorelabel 并重启做一次全盘重新打标签,否则大量文件标签缺失会导致系统启动异常。