首页 / 帮助文档 / Ubuntu系统安全审计,使用auditd追踪文件变更

Ubuntu系统安全审计,使用auditd追踪文件变更

服务器上某个配置文件突然变了,服务异常却找不到原因;或者需要向审计人员证明,哪些文件在特定时间段内被谁修改过。这些问题本质上都指向同一个需求:文件完整性监控和变更追踪。在Ubuntu系统上,最直接、最可靠的方案就是部署Linux审计守护进程auditd,通过配置规则来精确记录文件的所有访问和修改行为。

auditd是什么以及为什么用它

auditd是Linux内核自带的审计框架的用户态组件,它负责接收内核审计子系统发来的事件,并写入日志文件。与inotify这类文件监控工具不同,auditd工作在内核层面,几乎不依赖用户态轮询,性能开销可控,且能捕获到更底层的事件,包括系统调用层面的操作。更重要的是,auditd的日志包含丰富的上下文信息:用户身份、进程ID、父进程ID、时间戳、操作结果等,这些信息对于安全审计和事后溯源至关重要。

安装和启用auditd服务

在Ubuntu上,auditd通常不会默认安装。执行以下命令完成安装并启动服务:

sudo apt update
sudo apt install auditd audispd-plugins
sudo systemctl enable auditd
sudo systemctl start auditd

安装完成后,可以通过sudo auditctl -s查看当前审计子系统的状态,确认服务正在运行。如果输出中包含enabled 1,说明内核审计已开启。日志默认写入/var/log/audit/audit.log,这个文件会持续增长,后续需要配置轮转策略。

理解auditd规则体系

auditd的规则分为两类:控制规则和文件系统规则。控制规则用于调整审计系统本身的行为,比如设置缓冲区大小、失败时的处理策略。文件系统规则就是我们用来追踪文件变更的核心工具,它通过-w参数指定要监控的路径,并附加权限过滤条件。

一条典型的文件监控规则长这样:

-w /etc/ssh/sshd_config -p wa -k sshd_config_changes

这里-w指定监控路径,-p wa表示监控写入(write)和属性变更(attribute change)两种操作,-k是自定义的键名,用于在日志中标记和过滤事件。权限参数还可以是r(读取)、x(执行)、a(属性变更)。如果不指定-p,默认监控所有访问类型。

实战:部署关键目录和文件的监控规则

安全审计讲究覆盖面和优先级。对于Ubuntu服务器,建议至少监控以下路径:

# 系统账户数据库
-w /etc/passwd -p wa -k identity_changes
-w /etc/shadow -p wa -k identity_changes
-w /etc/group -p wa -k identity_changes

# SSH配置
-w /etc/ssh/sshd_config -p wa -k sshd_config_changes

# sudoers配置
-w /etc/sudoers -p wa -k sudoers_changes
-w /etc/sudoers.d/ -p wa -k sudoers_changes

# 系统服务单元文件
-w /etc/systemd/system/ -p wa -k service_unit_changes
-w /lib/systemd/system/ -p wa -k service_unit_changes

# 定时任务
-w /etc/crontab -p wa -k cron_changes
-w /var/spool/cron/crontabs/ -p wa -k cron_changes

将上述规则写入/etc/audit/rules.d/file-monitor.rules文件,然后执行sudo augenrules --load使其生效。使用sudo auditctl -l可以列出当前加载的所有规则,确认配置无误。

让规则永久生效

直接通过auditctl命令添加的规则在重启后会丢失。正确的做法是将规则文件放在/etc/audit/rules.d/目录下,文件名以.rules结尾。然后重启auditd服务或执行augenrules --load,它会合并该目录下所有规则文件并加载。Ubuntu的auditd服务默认会调用augenrules来加载规则,所以只要规则文件正确放置,重启后依然有效。

查询和分析审计日志

日志积累到一定程度后,需要高效地检索特定事件。auditd提供了两个核心工具:ausearchaureport

使用ausearch按键名过滤事件:

sudo ausearch -k sshd_config_changes

这会列出所有标记为sshd_config_changes的事件,输出中包含时间戳、用户、进程、操作类型和文件路径。如果想查看最近10分钟内的所有文件写入事件:

sudo ausearch -ts recent -p w

aureport则适合生成汇总报告。例如,查看按文件路径统计的访问频率:

sudo aureport -f --summary

要生成特定时间段的用户活动报告:

sudo aureport -u -ts 09:00 -te 18:00

这些命令组合起来,可以快速定位异常行为。比如发现/etc/passwd被修改,通过ausearch -f /etc/passwd -i-i表示将UID解析为用户名)就能看到是哪个用户通过哪个进程在什么时间做的修改。

配置日志轮转防止磁盘写满

在生产环境中,审计日志的增长速度可能很快。Ubuntu默认安装了logrotate来管理auditd日志,配置文件位于/etc/logrotate.d/auditd。可以根据磁盘容量和合规要求调整保留策略,例如保留12周的日志:

/var/log/audit/audit.log {
    weekly
    rotate 12
    compress
    delaycompress
    missingok
    notifempty
    postrotate
        /usr/lib/auditd/auditd-restart.sh > /dev/null 2>&1 || true
    endscript
}

同时建议监控/var/log/audit/目录的磁盘使用率,设置告警阈值,避免因日志爆满导致服务中断。

auditd与其他安全组件的联动

auditd的强大之处还在于它可以作为数据源集成到更广泛的安全体系中。如果环境中部署了入侵检测系统,可以将auditd日志转发过去进行实时分析。通过安装audispd-plugins包,可以获得audisp-remote插件,将审计事件实时发送到远程日志服务器。配置/etc/audit/plugins.d/au-remote.conf,指定远程服务器的地址和端口,就能实现集中化的审计日志管理。这对于需要满足等保或其他合规要求的场景尤其重要。

性能考量与最佳实践

虽然auditd在内核层面运行,效率很高,但无节制地添加规则仍可能带来性能影响。最佳实践是:只监控必要的文件和目录,避免对整个高读写频率的目录(如数据库数据目录)设置监控;善用-p参数精确限定操作类型,比如对日志文件只需监控写入和属性变更,无需监控读取;定期审查规则,移除不再需要的监控项。通过sudo auditctl -l查看规则数量,保持规则集精简有效。

另一个容易被忽视的细节是审计日志的时钟同步。确保服务器使用NTP服务保持时间准确,否则审计事件的时间戳不可信,会严重影响溯源的可信度。Ubuntu可以使用timedatectlchrony来管理时间同步。

总结

Ubuntu系统上的文件变更追踪,auditd提供了一个内核级、可审计、可追溯的成熟方案。从安装部署、规则编写、日志查询到轮转配置,整个流程清晰可控。关键在于根据实际安全需求,合理设计监控规则,避免过度监控,同时建立日志分析和告警机制,让审计数据真正发挥安全价值,而不是躺在磁盘上的一堆记录。