4. 操作系统审计日志:Windows安全日志与Linux auditd

好,这一章我们聊点落地的。审计日志这活儿,说白了就是给系统装个“黑匣子”。Windows和Linux两家各有各的玩法,但本质都一样——记录谁、在什么时候、对什么资源、做了什么操作。我刚开始带项目时,觉得两边配置差不多,结果被Windows的“事件ID”和Linux的“audit规则”折腾得不轻。今天我把常见的坑和要点掰开讲,你按着来基本不会出乱子。

4.1 Windows安全日志:从Event ID入手

Windows安全日志存在 %SystemRoot%\System32\winevt\Logs\Security.evtx 里。关键不是路径,而是那些事件ID。搞懂常用ID,你就能快速定位问题。

事件ID描述我常用的场景
4624登录成功检查用户正常登录时间线,尤其注意远程桌面(登录类型10)
4625登录失败爆破检测——同一个账户连续失败多次就该报警了
4672特殊权限登录管理员权限提升,比如普通用户su到admin
4648凭据被用来登录其他主机横向移动痕迹,我看过攻击者用这个跳板
4698计划任务创建持久化手段之一,曾经有客户中招后才发现任务被偷偷注册
4732用户加入本地管理员组权限滥用,我记得有次运维人员手滑把域用户加到了本地Administrators

这里有个小细节:Windows默认只记录少量事件。很多关键操作(比如谁改了注册表、谁创建了进程)默认是不记的。所以,你光看安全日志是不够的。

注意:别以为Windows安全日志就是万能的。我曾经在一个攻防演练里,攻击者通过强行停止EventLog服务然后清空日志,后来我们才加上实时转发和日志备份。单靠本地日志,被人删了你就抓瞎。

4.2 Windows审计策略配置:用auditpol比图形界面靠谱

图形界面用 secpol.msc -> 本地策略 -> 审核策略。但说实话,更推荐用命令 auditpol。为什么?因为你可以写脚本批量部署,而且可以细到子类别。

举个例子,开启登录和注销审计(成功+失败):

auditpol /set /subcategory:"Logon" /success:enable /failure:enable

开启进程创建审计(可以记录谁跑了什么程序):

auditpol /set /subcategory:"Process Creation" /success:enable

用 auditpol /list /subcategory:* 查看所有子类别。你想想看,Windows 10/2016以后有50多个子类别,一个一个手动点开得累死。

我的习惯:把常用审计策略写成批处理文件,新机器直接跑一遍。比如我常用的“基线审计”脚本里至少包含:登录、账户管理、进程创建、注册表、计划任务。

避坑指南:我曾经在Server 2008上配置了高级审计策略,结果和旧版策略冲突,日志直接不记了。后来发现一个铁律——要么只用旧版“审核策略”,要么只用新版“高级审核策略”,别混用。

4.3 Linux auditd:结构清晰但规则要小心

Linux下的审计日志靠 auditd 这套工具链。组件不多:

  • auditd:守护进程,接收内核审计事件并写入日志
  • auditctl:控制规则,运行时加规则(临时生效)
  • ausearch:查询日志,类似grep但更强大
  • aureport:生成汇总报告

配置文件在 /etc/audit/auditd.conf,规则文件在 /etc/audit/rules.d/ 下面(CentOS 7+ / Ubuntu 16.04+ 推荐方式)。

看一个最简单的规则:监控 /etc/passwd 的所有写操作。

auditctl -w /etc/passwd -p wa -k passwd_changes
# -w 文件路径  -p 权限(wa表示写+属性)  -k 自定义键

运行后,任何修改 /etc/passwd 的操作都会被记录。用 ausearch -k passwd_changes -ts today 就能查出来。

我曾经遇到过一个问题:有人写了规则监控 /var/log 目录下的所有文件,结果日志轮转时auditd自己把自己卡住了——因为auditd写日志的动作又触发了监控,形成死循环。搞定方案很简单:把 /var/log/audit 排除掉就行。

经验:千万别用 -w / -p rwxa 监控根目录或整个 /var 目录。轻则日志暴涨,重则系统卡死。我给你列几条常用的安全规则:
  • -w /etc/passwd -p wa -k passwd
  • -w /etc/shadow -p wa -k shadow
  • -w /etc/sudoers -p wa -k sudoers
  • -w /bin/su -p x -k su_exec
  • -w /usr/bin/sudo -p x -k sudo_exec

4.4 日志查看与分析:ausearch和aureport

日志文件默认在 /var/log/audit/audit.log。你可以直接 less 看,但相信我,你会晕的。原始日志长这样:

type=SYSCALL msg=audit(1650000000.123:456): arch=c000003e syscall=59 success=no exit=-13 a0=7ffe... a1=7ffe... a2=7ffe... a3=7ffe... items=2 ppid=1234 pid=1235 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="su" exe="/bin/su" key="su_exec"

别慌,用 ausearch 提取关键信息:

  • ausearch -k su_exec -i 把数字ID转换成可读的用户名和时间
  • ausearch --success no -k su_exec 只看调用su失败的尝试
  • aureport --summary 生成事件汇总,一眼看出哪个用户动作最多

日志轮转在 /etc/audit/auditd.conf 里设:

max_log_file = 50
num_logs = 5
space_left_action = email
admin_space_left_action = halt

这里要注意:如果空间不足,你设了 halt 系统直接挂掉。我一般用 SYSLOG 或者 rotate,而不是让内核panic。你想想看,审计系统把生产力系统搞崩了,那就本末倒置了。

4.5 双系统审计的最佳实践:统一收口

Windows和Linux的日志格式完全不同,但目标一致。我习惯的做法是:

  • Windows:启用WEF(Windows Event Forwarding)把安全日志实时推送到中央日志收集器
  • Linux:auditd + rsyslog 把 audit.log 转发到远程syslog/syslog-ng
  • 对外接口:两边最终汇聚到SIEM(比如Wazuh、ELK),用统一查询语法

下面这张图把这套架构串了起来:

双系统审计日志统一收集架构 Windows事件日志 Security.evtx (4624/4625/4672…) WEF / WinRM 转发 订阅: Security, System auditd 审计日志 /var/log/audit/audit.log rsyslog / syslog-ng TCP/UDP 转发至中央日志 中央日志收集器 / SIEM Wazuh / ELK / Splunk 统一分析 关键:统一时间源(NTP)、统一日志格式(CEF/JSON)、统一规则告警 确保两侧日志的时序对齐,避免误报漏报 Windows Linux

最后总结三个要点:

  1. Windows看Event ID,别把“审核成功”和“审核失败”搞反了。我在客户环境遇到过,审计策略全开了成功,失败的反而没开,结果攻击者尝试了100次登录失败,日志里一条都没记。
  2. Linux规则宁少勿滥,一条 -w /etc -p rwxa 就能让你磁盘爆炸。精准监控,配好轮转,再把日志外传到集中平台。
  3. 两边都建议实时转发,别只依赖本地日志。本地日志只作为最后一道备份,线上分析靠SIEM。
小技巧:用 auditctl -l 列出当前所有规则,确认没有多余的。Windows则定期导出一份 auditpol /get /category:* 做备份,方便对比变更。