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默认只记录少量事件。很多关键操作(比如谁改了注册表、谁创建了进程)默认是不记的。所以,你光看安全日志是不够的。
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看Event ID,别把“审核成功”和“审核失败”搞反了。我在客户环境遇到过,审计策略全开了成功,失败的反而没开,结果攻击者尝试了100次登录失败,日志里一条都没记。
- Linux规则宁少勿滥,一条
-w /etc -p rwxa就能让你磁盘爆炸。精准监控,配好轮转,再把日志外传到集中平台。 - 两边都建议实时转发,别只依赖本地日志。本地日志只作为最后一道备份,线上分析靠SIEM。
auditctl -l 列出当前所有规则,确认没有多余的。Windows则定期导出一份 auditpol /get /category:* 做备份,方便对比变更。