第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
| 字段 | 含义 | 解析要点 |
|---|---|---|
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.4 修复动作:日志轮转策略配置
审计日志若不轮转会迅速占满磁盘,导致 auditd 停止写入,丢失关键事件。修复动作集中在 /etc/audit/auditd.conf 中调整以下参数:
| 参数 | 默认值 | 推荐生产值 | 说明 |
|---|---|---|---|
max_log_file | 5 | 100~500 | 单个日志文件大小上限(MB) |
num_logs | 4 | 10~30 | 轮转保留的历史日志文件数量 |
max_log_file_action | ROTATE | ROTATE | 达到上限时执行轮转(ROTATE)或忽略(IGNORE) |
space_left_action | SYSLOG | EMAIL + SYSLOG | 磁盘空间不足时的预警动作 |
action_mail_acct | root | 监控团队邮箱 | 接收告警的邮件账户 |
# /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
配置后立即生效:
注意:重启 auditd 不会丢失已有日志,但正在写入的事件可能中断毫秒级时间。
sudo systemctl restart auditd 或 sudo service auditd restart。注意:重启 auditd 不会丢失已有日志,但正在写入的事件可能中断毫秒级时间。
1.5 复测:验证日志采集与轮转
完成配置后,必须通过实际触发 SELinux 事件来验证日志采集和轮转是否正常工作。
- 触发 AVC 事件(安全环境建议使用测试容器或非生产节点):
# 创建一个安全上下文不匹配的文件来触发拒绝
touch /tmp/test_selinux
chcon -t admin_home_t /tmp/test_selinux
cat /tmp/test_selinux # 预期被 SELinux 拒绝
- 检查日志记录:
ausearch -m avc -ts recent | grep test_selinux
# 若输出包含 type=AVC 且 denied,说明采集正常
- 验证轮转机制:
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% | 每日 |