Linux 日志审计与合规实践

1次阅读

auditd未启动导致ausearch无记录,须systemctl enable –now auditd并检查/var/log/audit/audit.log;监控/etc/shadow需加-f perm=000捕获失败事件;execve日志过多应按时间、用户、路径过滤;日志轮转需配置auditd.conf与logrotate或远程转发。

Linux 日志审计与合规实践

auditd 服务没启动,ausearch 查不到任何记录

auditd 是 linux 审计子系统的守护进程,所有内核级审计事件(比如文件访问、系统调用、权限变更)都得靠它收集中转。不启动它,auditctl 加的规则只是挂在内存里,重启就丢,ausearchaureport 也全为空。

实操建议:

  • 先确认状态:systemctl status auditd,不是 active (running) 就得 systemctl enable --now auditd
  • 检查日志是否写入磁盘:ls -l /var/log/audit/audit.log,空文件或不存在说明 auditd 没真正跑起来,或配置被覆盖
  • 别依赖 auditctl -e 1(锁定规则)后就以为万事大吉——它不等同于 auditd 启动,锁规则前 auditd 必须已运行
  • 某些云镜像(如部分 AWS AMI)默认禁用 auditd,需手动启用,且 SELinux 策略可能拦截其日志写入,可临时设为 permissive 验证

想监控敏感文件但 -w /etc/shadow -p rwxa 不生效

audit 规则里的 -p 参数只捕获“路径上发生的操作”,不是递归,也不管硬链接或符号链接跳转;更关键的是,/etc/shadow 这类文件通常由特权进程(如 passwdusermod)通过 openatread 系统调用访问,而普通用户直接读会 Permission Denied——audit 能看到拒绝事件,但默认不记录(除非显式开启失败事件)。

实操建议:

  • -k shadow_access 方便后续 ausearch -k shadow_access 快速过滤
  • 必须加上失败事件捕获:auditctl -w /etc/shadow -p rwxa -k shadow_access -F perm=000perm=000 表示所有权限检查失败)
  • 注意 -p rwxa 中的 aAttribute change)对 /etc/shadow 几乎无意义,因为它的权限/属主变更通常走 chown/chmod,应单独加规则监控这些命令的执行
  • 规则持久化要写进 /etc/audit/rules.d/*.rules,不能只用 auditctl 临时加——重启后失效

ausearch -m execve 日志太多,根本没法定位真实可疑行为

execve 是进程执行的起点,所有 shell、脚本、二进制启动都会触发,尤其在有自动化任务或容器环境里,每分钟几百条很常见。盲目查 execve 等于在日志海里捞针。

实操建议:

  • 缩小范围:加时间窗口,比如 ausearch -m execve -ts yesterday;加用户上下文,-ui 0(root)、-ui 1001(某业务用户)
  • 排除高频白名单:用 --input-logs 结合 grep -v 过滤掉 /usr/bin/bash/bin/sh/usr/bin/systemctl 等常规路径(注意路径要和日志中 exe 字段完全一致)
  • 关注异常参数:用 ausearch -m execve | aureport -f -i 看文件访问模式,再反查哪些 execve 带了可疑参数(如 curl http://python -c "import os; os.system
  • 别忘了 execve 日志里 cwd(当前工作目录)和 cmdline(完整命令行)字段比 exe 更能暴露意图,但默认不显示,要用 aureport --key --interpretausearch --input-logs | aureport -f -i 解析

合规要求保留 90 天日志,但 /var/log/audit/ 磁盘爆了

audit.log 默认不轮转,也不压缩,一条 execve 记录就占 200+ 字节,高负载机器一天轻松破 G。硬设 max_log_file 只是到上限就停写,不解决长期留存问题。

实操建议:

  • 改用 audispd-pluginslog_file 插件配合外部轮转:在 /etc/audit/auditd.conf 中设 log_file = /var/log/audit/audit.log + max_log_file = 100(MB)+ num_logs = 7(本地最多留 7 个),再配 logrotate 压缩归档
  • 禁用 space_left 相关告警(如 space_left_action = email),它们在磁盘紧张时可能触发误报,反而掩盖真实空间耗尽原因
  • 远程转发更可靠:启用 audispdaf_unixsyslog 插件,把日志实时发到 SIEM(如 elk、Splunk),本地只留最近 24 小时,既满足合规留存又避免单点故障
  • 注意:auditctl -e 2(不可更改模式)会阻止 auditd 重载配置,轮转脚本若尝试 systemctl reload auditd 会失败,得用 kill -USR1 $(pidof auditd) 手动触发日志切分

audit 规则越细,日志量越大;但规则太粗,又漏关键行为。真正难的不是加几条 auditctl,是持续校准规则粒度、验证日志可检索性、以及确保归档链路不中断——这些环节一断,前面所有配置都白搭。

text=ZqhQzanResources