在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服务器都把这套配置作为标准基线纳入部署流程。