在Ubuntu系统中,passwd文件是用户账户安全的核心,任何对它的非授权修改都可能意味着系统被入侵。要监控passwd修改并实现事件溯源,最直接有效的方案就是启用Linux自带的auditd审计守护进程,针对/etc/passwd、/etc/shadow、/etc/group等关键文件设置系统调用监控规则,一旦有人执行了passwd命令或直接编辑这些文件,auditd会立即记录下操作的用户、时间、进程ID、具体行为等完整信息,事后通过ausearch或aureport工具可以精准还原攻击链路。
为什么必须监控passwd相关文件
/etc/passwd存储了所有用户的基本信息,/etc/shadow存放加密密码,/etc/group记录用户组归属。攻击者一旦获得权限,最常见的操作就是添加后门账户、修改root密码、提升普通用户权限。传统的日志系统(如syslog)只能记录"有人执行了passwd命令",但无法回答"谁在什么时间用什么进程改了哪一行"。auditd基于内核层的系统调用拦截,能捕获到比应用层日志更底层、更完整的操作细节,这是它不可替代的核心价值。
第一步:安装和启动auditd服务
Ubuntu默认已经预装了auditd,但需要确认服务状态并设置开机自启:
sudo apt update sudo apt install auditd audispd-plugins -y sudo systemctl enable auditd sudo systemctl start auditd sudo systemctl status auditd
执行后看到"active (running)"就说明服务正常运行。如果是最小化安装的Ubuntu Server,可能需要手动安装auditd包。
第二步:配置auditd监控规则——核心操作
auditd的规则文件位于/etc/audit/rules.d/目录下。建议新建一个独立的规则文件,比如/etc/audit/rules.d/passwd_monitor.rules,避免和默认规则混在一起难以维护。
sudo nano /etc/audit/rules.d/passwd_monitor.rules
写入以下规则内容:
# 监控/etc/passwd文件的所有写入和属性修改 -w /etc/passwd -p wa -k passwd_changes # 监控/etc/shadow文件的所有写入和属性修改 -w /etc/shadow -p wa -k passwd_changes # 监控/etc/group文件的所有写入和属性修改 -w /etc/group -p wa -k passwd_changes # 监控/etc/gshadow文件 -w /etc/gshadow -p wa -k passwd_changes # 监控passwd命令本身的执行 -w /usr/bin/passwd -p x -k passwd_exec # 监控chage命令(修改密码过期策略) -w /usr/bin/chage -p x -k passwd_exec # 监控usermod命令(修改用户属性) -w /usr/bin/usermod -p x -k passwd_exec # 监控useradd和userdel命令 -w /usr/sbin/useradd -p x -k passwd_exec -w /usr/sbin/userdel -p x -k passwd_exec # 监控groupadd和groupdel命令 -w /usr/sbin/groupadd -p x -k passwd_exec -w /usr/sbin/groupdel -p x -k passwd_exec
规则中各参数含义:-w指定监控路径,-p指定监控的系统调用权限(w=写、a=属性变更、x=执行),-k是自定义关键字标签方便后续检索。设置完规则后必须重新加载:
sudo augenrules --load
或者直接重启auditd服务:
sudo service auditd restart
第三步:验证规则是否生效
用ausearch命令检查规则是否已加载:
sudo ausearch -k passwd_changes
如果刚配置完还没有事件触发,结果为空是正常的。可以手动测试一下,执行一个passwd修改操作:
sudo passwd testuser
然后再查询:
sudo ausearch -k passwd_changes -ts recent
你会看到类似这样的输出,包含完整的时间戳、用户UID、进程PID、系统调用类型等信息。
第四步:事件溯源——如何从日志中还原攻击链
auditd真正强大的地方在于事后分析。当你发现系统异常时,可以按以下步骤溯源:
1. 按时间范围查询:使用-ts参数指定起止时间,比如查询最近24小时的passwd相关事件:
sudo ausearch -k passwd_changes -ts today
2. 按用户过滤:用-ui参数指定UID,比如查看UID为1001的用户做了什么:
sudo ausearch -k passwd_changes -ui 1001
3. 按进程过滤:用-p参数查看某个进程的行为:
sudo ausearch -k passwd_changes -p passwd
4. 生成汇总报告:用aureport生成可读性更强的统计报表:
sudo aureport -k passwd_changes --summary sudo aureport -k passwd_exec --summary
这些报告会告诉你哪个用户在什么时间执行了什么操作,操作是否成功(通过exit code判断),甚至能看到修改前后的文件内容差异(如果开启了详细日志模式)。
第五步:进阶配置——开启详细日志和防篡改
默认情况下auditd只记录基本信息。要实现更深度的溯源,需要修改/etc/audit/auditd.conf:
sudo nano /etc/audit/auditd.conf
关键参数设置:
log_file = /var/log/audit/audit.log log_format = ENRICHED max_log_file = 100 num_logs = 5 max_log_file_action = ROTATE space_left = 75 space_left_action = SYSLOG action_mail_acct = root admin_space_left = 50 admin_space_left_action = HALT
其中log_format设为ENRICHED会记录更多上下文信息。max_log_file_action设为ROTATE会自动轮转日志防止磁盘写满。admin_space_left_action设为HALT意味着当审计日志所在分区剩余空间低于50MB时系统会自动停机,防止攻击者删除日志后继续操作。
另外,建议将审计日志实时转发到远程日志服务器,防止本地日志被篡改:
sudo nano /etc/audisp/plugins.d/syslog.conf
active = yes direction = out path = /usr/sbin/audisp-syslog type = builtin args = LOG_LOCAL6 format = string
然后在rsyslog配置中将LOCAL6转发到远程:
sudo nano /etc/rsyslog.d/audit.conf
local6.* @@remote-log-server:514
第六步:定期审计和告警自动化
光有日志不够,还需要主动发现异常。可以写一个简单的bash脚本配合cron定时检查:
#!/bin/bash
ALERT_FILE="/tmp/passwd_alert.txt"
# 检查最近1小时内是否有非root用户修改passwd
RECENT=$(sudo ausearch -k passwd_changes -ts recent -ui 0 2>/dev/null | wc -l)
if [ "$RECENT" -gt 0 ]; then
echo "警告:非root用户在最近1小时内修改了passwd相关文件" > $ALERT_FILE
echo "详细记录:" >> $ALERT_FILE
sudo ausearch -k passwd_changes -ts recent -ui 0 >> $ALERT_FILE
# 这里可以加入邮件发送或企业微信通知
fi
设置cron每小时执行一次:
sudo crontab -e 0 * * * * /usr/local/bin/check_passwd_audit.sh
第七步:常见问题和避坑指南
1. 规则写错导致auditd启动失败:一定要用augenrules --load来加载,不要直接编辑/etc/audit/audit.rules,那个文件是自动生成的。
2. 日志量过大影响性能:如果系统用户操作频繁,可以把-p wa改成只监控-p w(只监控写操作),或者用-F排除某些低风险操作。但对于安全监控场景,建议保留完整规则,性能损耗在可接受范围内。
3. 审计日志被攻击者删除:这就是为什么要设置远程转发和磁盘空间监控。同时/var/log/audit/目录建议设置不可变属性:
sudo chattr +i /var/log/audit/
4. 容器环境中的特殊处理:如果Ubuntu跑在Docker或LXC容器里,需要在宿主机层面配置auditd,因为容器内的auditd无法监控宿主机文件系统的变更。
总结:auditd是Ubuntu安全体系的最后一道防线
很多运维人员只关注防火墙和入侵检测,却忽略了操作系统层面的审计能力。auditd不需要额外安装复杂的安全软件,它是Linux内核自带的能力,零成本、高可靠。针对passwd文件的监控规则只需要十几行配置,却能在事后提供完整的操作溯源链——谁、什么时间、用什么进程、改了什么内容、结果如何,全部一目了然。对于等保合规、安全审计、事件响应来说,这是最基础也是最关键的一步。建议所有生产环境的Ubuntu服务器都把这套配置作为标准基线纳入部署流程。
