Linux 系统审计与安全合规方法

2次阅读

auditd 未启动导致 ausearch 查不到记录,需 systemctl enable –now auditd 并确保内核支持 config_audit=y、规则已写入 /etc/audit/rules.d/ 且持久化加载。

Linux 系统审计与安全合规方法

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

auditd 是 linux 审计子系统的守护进程,所有内核审计事件都必须经它接收、过滤、落盘。不运行它,auditctl 加的规则只是内存里的幻影,ausearch 自然查不到东西。

检查是否运行:systemctl status auditd;若未激活,先 systemctl enable --now auditd。注意:某些最小化安装(如 Alpine、部分容器镜像)默认不装 auditd 包,得先 apt install auditdyum install audit

  • 启动前确认 /etc/audit/rules.d/ 下有 .rules 文件,否则 auditd 启动后无规则可加载
  • 若用 systemd 启动失败,看 journalctl -u auditd -n 50,常见报错是 Cannot open /dev/audit —— 这说明内核没编译 CONFIG_AUDIT=y,需换内核或重编译
  • auditctl -l 只显示当前生效的规则,但重启 auditd 后会清空;持久化必须写进 /etc/audit/rules.d/*.rules 并执行 augenrules --load

想监控 /etc/passwd 修改,但 -w /etc/passwd -p wa 不触发

文件写权限(w)和属性修改(a)确实能捕获 chmod/chown,但对 /etc/passwd 这类被程序覆盖写入的场景,往往只触发一次“写”事件,且可能被缓冲延迟。更稳的方式是监听其父目录 + 过滤文件名。

推荐写法:-w /etc/ -p wa -k etc_passwd_changes,再用 ausearch -k etc_passwd_changes | awk '$13 ~ /passwd$/ {print}' 筛选。这样能捕获 cp、mv、vi 保存等所有路径变更行为。

  • -p wa 中的 a 对硬链接创建/删除无效,需额外加 -w /etc/passwd -p r 监听读取(用于检测暴力破解尝试)
  • SELinux 启用时,auditd 规则仍生效,但部分系统调用可能被 SELinux 先拦截,导致 audit 不记录 —— 此时要配合 ausearch -m avc 查 SELinux 拒绝日志
  • 频繁写入小文件(如日志轮转)会导致 audit 日志暴增,建议用 -F key= 打标 + log_file = /var/log/audit/audit-etc.log 单独分流

auditctl 加了规则却收不到 ssh 登录事件

SSH 登录本身不直接修改文件或系统调用,它走的是 PAM 认证链。audit 默认不跟踪用户空间认证流程,必须显式启用 PAM audit 模块并配置规则。

确认 /etc/pam.d/sshd 含有这一行:auth [default=ignore] pam_audit.so;同时在 /etc/audit/rules.d/login.rules 中加:-a always,exit -F arch=b64 -S execve -F exe=/usr/sbin/sshd -k ssh_login(x86_64 系统)。

  • 32 位系统要用 arch=b32,混用会丢事件
  • execve 能捕获 sshd 子进程拉起(如 bash),但登录失败通常只记在 /var/log/secure;要抓失败,得结合 -F auid=4294967295(未登录用户的 auid 值)过滤
  • 容器环境里,宿主机 auditd 无法捕获容器内 sshd 的 execve —— 必须在容器内单独跑 auditd,或改用 eBPF 工具如 tracee

audit 日志暴涨填满磁盘,log_file 配置不生效

auditd 的日志轮转靠 auditd.conf 中的 max_log_filenum_logs 控制,但这两个参数只在 auditd 主进程收到 SIGHUP 或重启时才重新读取,改完不 reload 就等于白改。

正确流程:改完 /etc/audit/auditd.conf 后,必须执行 systemctl kill --signal=SIGHUP auditdservice auditd reload(取决于发行版)。验证是否生效:auditctl -s | grep "max_log"

  • max_log_file_action = rotate 才启用轮转;设成 emailexec 会跳过轮转逻辑
  • 若用 logrotate 管理 /var/log/audit/audit.log,必须配 copytruncate,否则 auditd 写句柄丢失,新日志会写进已删除文件的 inode,磁盘空间不释放
  • 高频事件(如监控 /proc)建议关掉 enable_krb5disp_qos,避免网络/队列开销拖慢审计线程

真正难的不是加规则,是区分哪些事件必须留、哪些可以丢——比如监控 openat 全局规则,十有八九会把 auditd 自己压垮。

text=ZqhQzanResources