第1章 SELinux审计日志概览

1.1 现象识别:何时需要查看审计日志

在 Linux 生产环境中,应用程序或服务突然出现 "Permission denied"、"Operation not permitted" 等错误,而文件权限(DAC)检查正常时,首要怀疑对象就是 SELinux。SELinux 的拒绝事件会被记录到审计日志中,特征是日志行包含 type=AVC 且 avc: denied。

快速判断规则:执行以下命令,若输出非空,则说明系统曾发生 SELinux 拒绝,需要进一步分析审计日志。
dmesg | grep "avc:  denied" | head -5
ausearch -m avc --start recent 2>/dev/null | head -10
  • 典型现象1:Web 服务返回 403 或 500,应用日志无明确权限错误,但系统日志出现 denied 关键字。
  • 典型现象2:新安装的服务无法启动,SELinux 布尔值或文件标签未正确配置。
  • 典型现象3:自定义脚本或二进制程序访问特定文件/端口被静默拦截。
现象识别对照表
错误表现可能原因(SELinux 相关)验证命令
应用崩溃 / 拒绝访问进程域(Domain)对目标客体缺少对应权限ausearch -m avc -ts recent
端口绑定失败布尔值 xxx_connect_any 未开启getsebool -a | grep connect
文件读写异常文件安全上下文与进程域不匹配ls -Z 目标文件

1.2 数据采集:审计日志文件位置与采集方法

SELinux 审计日志由 auditd 服务统一管理,默认写入以下文件。采集时应优先使用专用工具,避免直接 grep 大文件导致性能问题。

审计日志文件位置与用途
文件路径用途轮转策略来源
/var/log/audit/audit.log主审计日志,包含所有 AVC 拒绝事件/etc/audit/auditd.conf
/var/log/messages 或 /var/log/syslog部分 SELinux 拒绝可能被 rsyslog 转发至此/etc/logrotate.d/
/var/log/audit/audit.log.*轮转后的历史审计日志(如 audit.log.1、audit.log.2.gz)auditd.conf 中 num_logs 控制保留数量
采集命令速查:
  • ausearch -m avc -ts 09:00:00 -te 18:00:00 — 按时间范围查询 AVC 事件
  • aureport -a --start week --end today — 生成本周拒绝事件汇总报告
  • audit2why < /var/log/audit/audit.log — 自动分析拒绝原因并给出建议

1.3 原因定位:日志格式与关键字段解读

一条完整的 SELinux 审计日志行包含多个关键字段,解析这些字段是定位问题的核心技能。下面是一条典型的 AVC 拒绝日志:

type=AVC msg=audit(1680000000.123:45678): avc:  denied  { read } for  pid=1234
comm="httpd" name="index.html" dev="sda1" ino=56789
scontext=system_u:system_r:httpd_t:s0
tcontext=unconfined_u:object_r:admin_home_t:s0
tclass=file
SELinux 审计日志关键字段解析表
字段含义解析要点
type=AVC审计记录类型,AVC 表示 SELinux 访问向量缓存事件所有 SELinux 拒绝均以 type=AVC 开头
msg=audit(时间戳:序列号)事件发生时间和唯一序列号用于关联同一事件的多条记录
avc: denied { perm }被拒绝的权限(如 read、write、open)大括号内的权限名直接对应 perm 字段
scontext源安全上下文(进程主体)格式:用户:角色:类型:级别,类型(Domain)是定位关键
tcontext目标安全上下文(客体)文件/端口/进程的目标类型,与 scontext 对比可发现标签不匹配
tclass客体类别file、dir、tcp_socket、unix_stream_socket 等
perm请求的访问权限具体权限名(如 read、write、append)
⚠️ 常见误判:不要把 type=SYSCALL 与 type=AVC 混淆。SYSCALL 记录的是系统调用,不直接表示 SELinux 拒绝;只有 type=AVC 且包含 denied 才是 SELinux 策略拒绝事件。
图1-1 SELinux审计日志排查流程与关键字段 SELinux审计日志排查流程与关键字段 ① 现象识别 应用拒绝 / Permission denied dmesg | grep denied ② 数据采集 审计日志文件位置 /var/log/audit/audit.log ③ 原因定位 关键字段解析 scontext tcontext tclass perm ④ 修复动作 日志轮转策略配置 /etc/audit/auditd.conf ⑤ 复测验证 触发操作检查日志 ausearch -m avc -ts recent ⑥ 预防措施 监控告警与备份 轮转保留 / 集中管理 SELinux 审计日志关键字段示例 type=AVC msg=audit(1680000000.123:45678): avc: denied { read } scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file perm=read
图1-1 SELinux审计日志排查流程与关键字段解析

1.4 修复动作:日志轮转策略配置

审计日志若不轮转会迅速占满磁盘,导致 auditd 停止写入,丢失关键事件。修复动作集中在 /etc/audit/auditd.conf 中调整以下参数:

auditd.conf 轮转关键参数
参数默认值推荐生产值说明
max_log_file5100~500单个日志文件大小上限(MB)
num_logs410~30轮转保留的历史日志文件数量
max_log_file_actionROTATEROTATE达到上限时执行轮转(ROTATE)或忽略(IGNORE)
space_left_actionSYSLOGEMAIL + SYSLOG磁盘空间不足时的预警动作
action_mail_acctroot监控团队邮箱接收告警的邮件账户
# /etc/audit/auditd.conf 典型生产配置片段
max_log_file = 200
num_logs = 15
max_log_file_action = ROTATE
space_left_action = EMAIL
action_mail_acct = security@example.com
admin_space_left_action = HALT
配置后立即生效:
sudo systemctl restart auditd 或 sudo service auditd restart。
注意:重启 auditd 不会丢失已有日志,但正在写入的事件可能中断毫秒级时间。

1.5 复测:验证日志采集与轮转

完成配置后,必须通过实际触发 SELinux 事件来验证日志采集和轮转是否正常工作。

  1. 触发 AVC 事件(安全环境建议使用测试容器或非生产节点):
# 创建一个安全上下文不匹配的文件来触发拒绝
touch /tmp/test_selinux
chcon -t admin_home_t /tmp/test_selinux
cat /tmp/test_selinux  # 预期被 SELinux 拒绝
  1. 检查日志记录:
ausearch -m avc -ts recent | grep test_selinux
# 若输出包含 type=AVC 且 denied,说明采集正常
  1. 验证轮转机制:
sudo auditd -s  # 查看当前 auditd 状态
ls -lh /var/log/audit/audit.log*
# 确认存在轮转后的历史文件(如 audit.log.1、audit.log.2.gz)
复测判断规则:
测试项通过标准失败处理
AVC 事件触发ausearch 能查到对应记录检查 auditd 是否运行、规则是否加载
日志轮转历史文件按 num_logs 数量保留检查 max_log_file_action 是否为 ROTATE
磁盘空间df -h /var/log/audit 使用率低于 80%调小 max_log_file 或增加 num_logs

1.6 预防:日志管理最佳实践

长期稳定运行依赖预防性措施,以下三条是生产环境必须落实的预防动作:

  • 集中日志收集:使用 rsyslog 或 fluentd 将审计日志实时转发至中心日志平台(如 ELK、Splunk),避免单点丢失。
  • 监控告警覆盖:对 type=AVC 且 denied 的事件设置实时告警,响应时间控制在 5 分钟内。
  • 定期健康检查:每周执行 aureport --summary 生成审计摘要,检查拒绝事件趋势和磁盘使用率。
⚠️ 常见预防疏漏:
  • 只配置轮转但未设置 space_left_action,导致磁盘写满后 auditd 静默停止。
  • 日志集中收集未过滤敏感字段(如 msg=audit 中可能包含路径名),需在传输前做脱敏处理。
  • 轮转后的历史日志未做压缩归档,长时间占用大量磁盘空间。
预防措施落地检查表
检查项验收标准频率
auditd 运行状态systemctl is-active auditd 返回 active每日
日志轮转正常ls -1 /var/log/audit/audit.log* | wc -l 等于 num_logs+1每周
拒绝事件趋势aureport -a --start week --end today 事件量无明显突增每周
磁盘使用率df /var/log/audit 使用率 < 75%每日