查看SELinux拦截日志关键在捕获内核audit子系统生成的AVC拒绝事件,应使用journalctl过滤_TRANSPORT=kernel并匹配avc.*denied或type=AVC,配合启用auditd服务与journald持久化,并用sealert解析修复建议。

要查看 SELinux 拦截访问产生的日志,关键不是直接搜“SELinux”,而是捕获它实际记录在 journald 中的审计事件——这些事件由内核的 audit subsystem 生成,并经 auditd 或 journald 收集,通常以 AUDIT_ANOMALY、AVC(Access Vector Cache)等关键词标识。
定位 SELinux 拒绝日志的核心方法
SELinux 的拒绝行为(如服务无法绑定端口、进程无法读取文件)会触发 AVC 拒绝消息,journald 默认会收录这些内核审计日志。最有效的方式是:
-
用 journalctl 过滤 AVC 和 audit 相关条目:
journalctl -t kernel | grep -i "avc.*denied"
或更精准地:journalctl _TRANSPORT=kernel | grep -E "(avc:.*denied|type=AVC)" -
查看最近一次启动中所有 SELinux 相关事件:
journalctl -b | grep -i -E "(avc|selinux|audit)" -
实时跟踪新出现的 SELinux 拒绝:
journalctl -f -t kernel | grep -i "avc.*denied"
确保日志能被查到的前提条件
如果执行上述命令无输出,不代表没发生拦截,很可能是日志未持久化或 audit 未启用:
-
确认 auditd 服务正在运行(多数发行版默认启用):
sudo systemctl is-active auditd;若为 inactive,启用并启动:sudo systemctl enable --now auditd -
确保 journald 持久化开启:SELinux 审计日志常随内核日志写入,而默认 journal 存储在内存(
/run/log/journal),重启即丢失。需配置:
① 创建目录:sudo mkdir -p /var/log/journal
② 设置权限:sudo chown root:systemd-journal /var/log/journal
③ 修改/etc/systemd/journald.conf中Storage=persistent,再执行sudo systemctl restart systemd-journald
结合 sealert 工具辅助解读
单纯看 AVC 日志(如 avc: denied { read } for pid=1234 comm="httpd" name="index.html" dev="sda1" ino=56789)只告诉你“被拒”,不告诉“怎么修”。建议配合:
-
安装 setroubleshoot(RHEL/CentOS/Fedora)或 sealert(Ubuntu/Debian):
sudo dnf install setroubleshoot-server(或apt install selinux-utils) -
运行分析:
sudo sealert -a /var/log/audit/audit.log
该命令会将原始 AVC 拒绝转成可读建议(例如“允许 httpd 读取 public_content_t 类型文件:setsebool -P httpd_read_user_content 1”)
补充:对比传统 audit.log 文件
若系统启用了 auditd,完整审计日志还存于 /var/log/audit/audit.log。可直接查看:sudo ausearch -m avc -ts recent | aureport -a
或简单过滤:sudo grep "avc:.*denied" /var/log/audit/audit.log | tail -20
注意:journalctl 显示的是已解析/转发后的副本,而 audit.log 是原始二进制审计流的文本表示,信息更全但更难读。


















