直接说重点:在CentOS系统中,/etc/passwd文件是用户账户信息的关键数据库,一旦被非法篡改,可能导致未授权访问、权限提升甚至系统完全沦陷。仅靠文件权限和常规日志不足以提供精准、可追溯的审计线索。因此,部署Linux Audit审计系统(auditd)并为其定制专门监控/etc/passwd文件变化的规则,是构建纵深防御体系不可或缺的一环。具体做法就是通过auditctl命令或编写永久规则文件,让系统内核直接捕获对该文件的所有读写和属性修改操作,并将详细记录归档至审计日志,供实时告警与事后取证分析。

为什么必须专门审计/etc/passwd文件?

/etc/passwd文件存储了所有用户的基本信息,包括用户名、UID、GID、家目录和登录shell。虽然密码现已通常保存在/etc/shadow中,但/etc/passwd的完整性依然至关重要。攻击者或恶意软件可能通过修改此文件来添加隐藏的后门账户、更改现有账户的UID以提升权限,或篡改shell路径来执行恶意程序。系统自带的日志(如/var/log/secure)可能记录登录事件,但无法详尽记录文件本身“被谁、在何时、如何修改”的完整上下文。Linux Audit审计框架则能从内核层面捕获这些细粒度事件,提供不可抵赖的审计轨迹。

Linux Audit (auditd) 核心组件与工作原理

Linux Audit是一个由内核子系统、用户空间守护进程(auditd)和工具集(auditctl, ausearch, aureport等)构成的完整框架。其核心在于:当规则被加载后,内核会监控指定的系统调用或文件路径,一旦匹配事件发生,内核立即生成审计记录,并发送给auditd守护进程。auditd将这些记录按照配置写入日志文件(默认为/var/log/audit/audit.log),并可以配置实时告警。这种机制确保了审计记录难以被普通用户篡改,因为记录生成先于任何用户空间进程。

配置审计规则:临时与永久方法

配置规则主要使用auditctl命令。要监控/etc/passwd的所有修改(包括内容写入和属性更改),最有效的规则是监控该文件的“写(w)”和“属性更改(a)”操作。你可以通过以下命令添加临时规则(重启失效):

auditctl -w /etc/passwd -p wa -k monitor_passwd

命令解析:-w 指定监控文件路径;-p 后跟权限标识:w=写入,a=属性(如时间戳、权限);-k 设置一个关键词(key),便于后续日志搜索。这条规则意味着任何对/etc/passwd的写入或属性修改尝试都会被记录,并打上“monitor_passwd”的标签。

为确保规则在重启后依然生效,必须将其写入永久配置文件。在CentOS/RHEL系统中,永久规则通常保存在/etc/audit/rules.d/audit.rules或/etc/audit/audit.rules中。建议在/etc/audit/rules.d/目录下创建独立规则文件,例如:

# 编辑或创建规则文件
vim /etc/audit/rules.d/passwd-monitor.rules

# 在文件中添加以下行
-w /etc/passwd -p wa -k monitor_passwd

保存后,需要重启auditd服务或使用augenrules命令重新加载规则:

systemctl restart auditd
# 或
augenrules --load

验证规则与解读审计日志

规则加载后,立即使用auditctl -l命令验证其是否生效:

auditctl -l
# 应输出类似:
-w /etc/passwd -p wa -k monitor_passwd

现在,我们可以进行一个测试:使用vipw或直接使用echo命令向/etc/passwd添加一个注释行(避免真实修改,仅触发事件):

echo "# Test audit log" >> /etc/passwd

随后,使用ausearch工具查询相关日志:

ausearch -k monitor_passwd --start recent

你将看到一条或多条详细的审计记录。一条典型的记录包含以下关键字段:

type=SYSCALL msg=audit(1740123456.789:123456): arch=c000003e syscall=2 success=yes exit=3 a0=7ffc12345678 a1=441 a2=1b6 a3=0 items=2 ppid=1234 pid=5678 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="bash" exe="/usr/bin/bash" key="monitor_passwd"
type=PATH msg=audit(1740123456.789:123456): item=1 name="/etc/passwd" inode=12345678 dev=fd:01 mode=0100644 ouid=0 ogid=0 rdev=00:00 nametype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0

解读核心信息:type=SYSCALL显示了系统调用事件,其中“pid=5678”是进行操作的进程ID,“comm=“bash””是命令名,“uid=0”表示操作者用户ID(0为root),而“auid=1000”是审计用户ID(即原始登录用户的UID,这是追踪溯源的关键,即使通过sudo提权,auid也保持不变)。type=PATH部分则确认了被操作的文件路径就是/etc/passwd。这些信息共同构成了一个完整的证据链。

进阶规则与场景优化

基础规则已足够强大,但根据安全需求,你可以进行更精细化的配置:

1. 分离监控读写与属性变更:如果你只关心文件内容是否被改写,可以仅监控写入(-p w)。但建议保留-p wa,因为攻击者可能通过修改文件时间戳(touch命令)来掩盖行踪,这属于属性变更。

2. 监控特定系统调用:除了监控文件路径,你还可以直接监控与文件修改相关的系统调用,如openat和write,但路径监控更直观且易于管理。

3. 排除特定进程或用户:审计规则非常灵活。例如,如果你使用自动化工具(如Ansible)来管理用户,其修改可能会产生大量日志。你可以通过添加过滤器来排除特定UID或进程。但这需谨慎,避免遗漏真实攻击。更佳实践是保留所有日志,但通过日志分析工具对已知的合法操作进行过滤告警。

构建自动化告警与日志分析

记录日志只是第一步,实现实时告警和定期分析才能发挥其价值。你可以结合以下工具:

1. 实时告警:配置auditd的插件audispd,将日志实时转发到syslog(如rsyslog),并设置规则触发邮件或即时消息告警。例如,在/etc/audit/plugins.d/下配置syslog插件,然后在rsyslog规则中匹配关键词“key=“monitor_passwd””并执行告警脚本。

2. 定期报告:使用aureport工具生成人类可读的报告。例如,每周运行 aureport -k --summary 来查看所有关键词触发的审计事件汇总,快速发现异常。

3. 集成SIEM系统:在企业环境中,应将/var/log/audit/audit.log通过代理(如Filebeat、Fluentd)收集到中央SIEM(安全信息与事件管理)平台。在SIEM中,你可以创建复杂的关联规则,例如:“如果非工作时间段内出现/etc/passwd修改,且操作者来自非常用IP,则触发严重警报”。

安全配置的注意事项与最佳实践

1. 审计日志自身的安全:确保/var/log/audit/目录权限严格(通常为0700),日志文件权限为0600,仅允许root读写。考虑将审计日志写入独立分区或只读挂载的网络存储,防止攻击者删除或篡改日志。

2. 性能考量:在高I/O负载的服务器上,审计所有事件可能影响性能。但针对关键文件如/etc/passwd、/etc/shadow、/etc/sudoers等的监控,其开销微乎其微,安全收益远大于性能损耗。

3. 规则测试与维护:每次修改规则后,务必在测试环境验证,确保不会产生海量无关日志或遗漏关键事件。定期审查现有规则的有效性,并与系统变更管理流程结合。

4. 纵深防御:审计规则是检测手段,必须与预防措施结合。例如,使用文件完整性管理(FIM)工具(如AIDE、Tripwire)定期校验/etc/passwd的哈希值,并结合严格的sudo权限控制和网络防火墙,构建预防、检测、响应一体的安全闭环。

总结:将被动记录转化为主动防御

为CentOS系统的/etc/passwd文件配置audit审计规则,绝非简单的日志记录任务。它本质上是为系统核心资产安装了一个全天候、内核级别的监控探头。通过精准的规则定义、严谨的日志解读以及与之配套的告警与分析流程,你能够将潜在的用户账户篡改攻击从“事后发现”转变为“事中响应”,甚至通过行为异常分析预警攻击前置阶段。在当今威胁环境下,这种基于主机的细粒度审计能力,已成为满足合规要求(如等保2.0、GDPR)和提升实际安全运营水平的关键基石。立即部署并优化你的审计规则,让它成为你服务器安全防线中沉默而忠诚的哨兵。