auditd可精准捕获非root用户对/etc/shadow的非法读取:需配置两条规则——兜底记录全部读取(-w /etc/shadow -p r -k shadow_read_all)和高置信度拦截非root行为(-a always,exit -F path=/etc/shadow -F perm=r -F auid!=0 -k unauthorized_shadow_read),并用ausearch等工具实时告警与响应。

auditd 本身不阻止读取,但能精准捕获每一次对 /etc/shadow 的读操作,并区分是否合法。关键在于用好 auid(原始登录用户ID)过滤非 root 行为,再配合日志分析与轻量响应,实现“捕获即告警、告警可联动”的实效监控。
一、写对规则:聚焦非法读取,避免噪音
直接监控路径读取(-p r)会记录所有访问,包括 root 自己的合法操作。真正要抓的是“非 root 用户发起的读取”。推荐两条互补规则,写入 /etc/audit/rules.d/10-shadow.rules:
-
-w /etc/shadow -p r -k shadow_read_all—— 兜底记录全部读取,用于基线比对或调试; -
-a always,exit -F path=/etc/shadow -F perm=r -F auid!=0 -k unauthorized_shadow_read—— 只捕获 auid 不为 0 的读取,这才是高置信度的非法行为信号。
注意:-k 是必须项,不是标签而是日志检索键;auid 比 uid 更可靠,它不会被 su/sudo 改变,能真实反映谁登录进来的。
二、确认生效:加载后立刻验证
规则写完不能只等“出事”,要主动测:
- 执行
sudo augenrules --load加载规则; - 运行
sudo auditctl -l | grep shadow,确认两条规则都在列表中; - 切换普通用户(如
testuser),执行cat /etc/shadow 2>/dev/null; - 立即查日志:
sudo ausearch -k unauthorized_shadow_read -i | tail -3,应看到含auid=1001(非 0)、comm="cat"、exe="/usr/bin/cat"的完整条目。
三、实时盯控与初步响应
日常运维中,不需要翻原始日志文件。以下方法更高效:
- 查最近 5 分钟谁读了:
ausearch -k unauthorized_shadow_read --start 5 minutes ago -i | grep "comm="; - 持续观察新事件:
sudo tail -f /var/log/audit/audit.log | aureport -f -i | grep shadow; - 发现异常后,可用脚本自动提取 IP 和用户:
ausearch -k unauthorized_shadow_read -m SYSCALL -i --start recent | awk '/addr=/ {print $NF}' | sort -u,后续可对接iptables或fail2ban封禁。
四、避坑要点
常见失效原因不是规则写错,而是环境配置问题:
- 确保
systemctl status auditd显示 active (running); - 检查
auditctl -s | grep enabled,输出应为enabled 1; - 某些云镜像启用
ProtectSystem=strict,会导致/etc/audit/rules.d/下的规则被跳过,此时需改用auditctl -w ...临时添加并写入启动脚本; -
/etc/shadow是硬链接目标,规则中必须写其真实路径,不能用符号链接别名。

















