拒绝记录长什么样
SELinux 拦截访问时会在审计日志里留下 AVC(Access Vector Cache)拒绝记录,字段包括被拒的进程、目标对象、操作类型与权限。排查的第一步不是急着放宽策略,而是判断属于哪一类:标签不对、布尔开关未开、还是真的缺少策略规则。这三类对应的修复方式完全不同,选错方向会把安全边界越改越宽。
基本信息
| 日志位置 | /var/log/audit/audit.log(auditd 未运行时可能在 dmesg 或 journal) |
|---|---|
| 检索命令 | ausearch -m avc -ts recent、ausearch -m avc -ts today |
| 解释工具 | sealert -a(setroubleshoot 包)、audit2why |
| 策略编译 | audit2allow(放宽策略的手段,须谨慎) |
| 修复方式 | restorecon 修标签、setsebool -P 开布尔、必要时定制策略 |
| 权限要求 | root |
典型使用场景
- 服务无法读取数据目录,日志里出现 AVC 拒绝
- 迁移站点后页面 403,需要确认是否为标签问题
- 排查某个自定义程序为何无法绑定端口
- 评估拒绝记录以决定是否需要定制策略
- 确认整改后拒绝是否消失,闭环验证
检索 AVC
检索 AVC
ausearch -m avc -ts recent # 最近的 AVC 拒绝
ausearch -m avc -ts today | tail -50 # 今天的记录,取最后若干条
sealert -a /var/log/audit/audit.log # 图形化解释(需 setroubleshoot 包)
audit2why < /var/log/audit/audit.log # 命令行解释,给出人话原因
dmesg | grep -i avc | tail # auditd 未安装时的备用入口
getenforce # 确认 SELinux 当前模式(Enforcing 才会拦截)按建议处理(示例)
按建议处理(示例)
# 若是标签问题(最常见):
restorecon -Rv /path
# 若是布尔值问题:
setsebool -P httpd_can_network_connect on # -P 表示持久化
semanage boolean -l | grep httpd # 查看布尔项说明与当前值
# 若是自定义目录,还需登记路径规则:
semanage fcontext -a -t httpd_sys_content_t '/web(/.*)?' && restorecon -Rv /web
ausearch -m avc -ts recent # 验证拒绝是否消失原因类型与修复
| 原因类型 | 典型迹象 | 修复方式 |
|---|---|---|
| 标签不符 | 进程类型与目标对象类型不匹配 | restorecon 恢复,或登记 fcontext 规则 |
| 布尔未开 | audit2why 提示缺少某项权限 | setsebool -P 打开对应布尔项 |
| 端口未登记 | 绑定非标准端口被拒 | semanage port -a 登记端口类型 |
| 策略确实缺失 | 解释建议生成模块 | 评估后用 audit2allow 定制策略 |
| 临时误判 | dmesg 有记录但服务正常 | 确认为历史记录,用 -ts 限定时间范围 |
audit2allow 生成的放行模块属于放宽策略:只有在确认没有更小的改动方案时才考虑,生成后要记录原因与影响范围,不要用『一条命令解决所有拒绝』的思路处理。
AVC 记录的时间戳来自审计子系统:跨时区或时间未同步的机器排查前先确认时间一致(chrony),否则按时间检索会对不上。