应无差别捕获所有读取行为并基于权限上下文判定非法性:启用auditd服务,写入持久化规则“-w /etc/shadow -p r -k shadow_read”,通过uid/euid/auid/comm等字段实时分析ausearch输出,结合lsof和inode校验防绕过。

要记录所有针对 /etc/shadow 的非法读取行为并实现实时审计,核心不是“过滤非法”,而是**无差别捕获所有读取行为**,再通过权限上下文(如 uid、euid、auid)判断是否合法——因为 Linux 内核不定义“非法”,只记录谁调用了 openat/read 等系统调用。真正可行的做法是:精准监控 + 正确解析 + 快速响应。
一、确保 auditd 服务就绪且规则持久化
非法读取往往发生在攻击早期,服务必须稳定运行:
- 确认已安装并启用:
sudo systemctl enable --now auditd - 检查状态:
sudo systemctl status auditd | grep "active (running)",若失败需查journalctl -u auditd - 永久规则不能只靠
auditctl -w临时添加,必须写入/etc/audit/rules.d/shadow.rules:
注意:-p r 即只监控读操作(非 rwxa),减少日志噪音;-k shadow_read 是后续过滤唯一高效入口,不可省略。
加载规则:sudo augenrules --load && sudo auditctl -l | grep shadow_read,应看到该规则;再执行 sudo auditctl -s | grep enabled 确认 enabled=1。
二、理解“非法读取”的判定逻辑
/etc/shadow 正常只允许 root(或具备 CAP_DAC_OVERRIDE 的进程)读取。所谓“非法”,指满足任一条件:
- 触发进程的
uid != 0且euid != 0(普通用户身份) - 调用者不是系统关键服务(如
login、sshd、su),而是cat、less、python等可疑命令 - 访问来自非预期终端(如 pts/2 而非系统登录会话)或异常时间(凌晨 3 点)
auditd 本身不标记“非法”,但日志中必含 uid=、euid=、auid=(原始登录用户)、comm=(命令名)、exe=(可执行文件路径)字段,这些就是判断依据。
三、实时捕获与快速定位读取行为
不用等日志堆积,用组合命令实现准实时响应:
- 监听最新匹配事件(推荐):
sudo ausearch -k shadow_read -m SYSCALL -i --start recent | grep -E "(uid=|euid=|comm=|exe=)" | tail -n 5 - 配合
tail -f持续滚动(适合调试):sudo tail -f /var/log/audit/audit.log | aureport -f -i | grep "/etc/shadow"(注意此法性能开销略高) - 若想秒级发现,可加时间锚点查最近 60 秒:
sudo ausearch -k shadow_read -m SYSCALL -i --start 60 seconds ago | aureport -f -i
关键看输出中的 success=yes(表示读取成功发生)和 uid=1001(非零即可疑);若出现 comm="sh" exe="/bin/bash" 且 uid=1001,基本可判定为非法尝试。
四、补充验证与防绕过要点
仅靠文件监控可能遗漏某些绕过方式,需交叉验证:
- 检查是否被软链接绕过:用
ls -li /etc/shadow确认真实 inode,规则中必须写该绝对路径,不能写别名 - 排查进程级读取:
sudo lsof /etc/shadow 2>/dev/null可即时看到当前哪个进程正打开它 - 验证 systemd 保护机制:若系统启用了
ProtectSystem=strict,/etc/audit/rules.d/下的规则可能被跳过,执行sudo ausearch -m CONFIG_CHANGE -ts recent查是否有加载失败提示 - 避免误报:正常系统操作(如
passwd修改密码)也会读/etc/shadow,但它以 root 身份执行,uid=0,不属于“非法”











