3. Linux日志体系与审计机制

Linux 的日志与审计并不是单一机制,而是由多个组件分工协作形成的体系。syslog 定义了日志协议与消息格式,rsyslog 负责接收、过滤、转发和落盘,journald 负责收集内核与用户态的结构化日志,auditd 则在内核审计子系统的支持下记录安全相关事件。理解这四者的定位与协作关系,是后续做日志审计与异常检测的基础。

一、四个组件的定位与协作关系

syslog 是一套协议规范,规定了日志消息的优先级(facility 与 severity)和传输方式。rsyslog 是 syslog 协议的主流实现,支持 TCP/UDP、RELP、TLS 传输,并可通过规则将不同来源的日志写入不同文件或转发到远端。journald 是 systemd 的日志组件,以二进制格式存储日志,支持结构化字段和索引查询,可通过 journalctl 按单元、优先级、时间等条件检索。auditd 是用户态审计守护进程,配合内核 audit 子系统,按规则记录系统调用、文件访问、用户认证等安全事件。

四者的数据流关系可以用下图表示:应用和内核产生日志,分别进入 journald 和 rsyslog;auditd 从内核审计子系统获取事件;rsyslog 可以接收 journald 转发的日志,也可以将本地日志转发到远端日志服务器。

数据源 应用程序 syslog() / stderr 内核 printk / audit systemd 服务 stdout / stderr 采集与处理 journald 二进制存储 · 结构化字段 journalctl 查询 rsyslog 规则过滤 · 多目标输出 TCP/UDP/TLS 转发 auditd 内核审计子系统 规则匹配 · 安全事件 转发 存储与输出 /var/log/messages 常规系统日志 /var/log/secure 认证与安全日志 /var/log/audit/ audit.log 审计日志 远端日志服务器 集中存储与关联分析 关键协作点: • journald 可通过 ForwardToSyslog=yes 将日志转发给 rsyslog,实现统一落盘与远端转发 • auditd 日志独立于 syslog 体系,需通过 ausearch / aureport 工具检索,也可配置 audisp-remote 转发 • rsyslog 的规则引擎可按 facility、severity、程序名、消息内容做过滤,决定写入哪个文件或转发到何处

二、rsyslog 配置与日志格式

rsyslog 的主配置文件通常位于 /etc/rsyslog.conf,额外规则放在 /etc/rsyslog.d/ 目录下。一条典型的规则由选择器和动作组成,选择器格式为 facility.severity,动作可以是写入文件、转发到远端或执行程序。

# /etc/rsyslog.d/50-default.conf 示例
# 认证相关日志写入 secure 文件
authpriv.*                      /var/log/secure

# 所有 info 及以上级别日志写入 messages,排除 mail 和 authpriv
*.info;mail.none;authpriv.none  /var/log/messages

# 将本机所有日志转发到远端日志服务器(TCP 514)
*.* @@192.168.1.100:514

# 按程序名过滤:只记录 sshd 的日志
:programname, isequal, "sshd"   /var/log/sshd.log

rsyslog 日志的典型格式为:时间戳 主机名 程序名[PID]: 消息内容。例如:

Mar 15 10:23:45 web01 sshd[12345]: Accepted password for admin from 192.168.1.50 port 52341 ssh2

其中 Mar 15 10:23:45 是时间戳,web01 是主机名,sshd[12345] 是程序名和进程号,后面是具体消息。审计时重点关注认证失败、权限提升、服务启停等模式。

三、journald 配置与查询

journald 的配置文件为 /etc/systemd/journald.conf。常用参数包括 Storage(volatile、persistent、auto)、SystemMaxUse(日志最大占用空间)、ForwardToSyslog(是否转发给 rsyslog)。

# /etc/systemd/journald.conf 关键配置
[Journal]
Storage=persistent
SystemMaxUse=2G
SystemMaxFileSize=200M
ForwardToSyslog=yes
MaxRetentionSec=1month

查询时使用 journalctl,支持按单元、优先级、时间、字段过滤:

# 查看 sshd 服务最近 1 小时的日志
journalctl -u sshd --since "1 hour ago"

# 查看优先级为 err 及以上的日志
journalctl -p err -b

# 按结构化字段查询:查看所有失败的服务
journalctl _SYSTEMD_UNIT=sshd.service _PID=12345

# 输出为 JSON 格式,便于程序解析
journalctl -u sshd -o json-pretty --since today

journald 的日志以二进制存储,不能直接用文本工具读取,但 journalctl 提供了丰富的过滤和输出格式选项。审计场景中,常用 -o json 输出结构化数据,再交给分析程序处理。

四、auditd 审计规则与关键事件类型

auditd 的规则通过 auditctl 命令动态添加,或写入 /etc/audit/rules.d/audit.rules 持久化。规则分为控制规则、文件系统规则和系统调用规则。常用语法包括 -w 监控文件路径、-p 指定权限(r/w/x/a)、-k 设置关键字便于检索。

# 监控 /etc/passwd 的写入和属性变更
-w /etc/passwd -p wa -k passwd_change

# 监控 /etc/shadow 的读取和写入
-w /etc/shadow -p rwa -k shadow_access

# 监控 execve 系统调用,记录所有程序执行
-a always,exit -F arch=b64 -S execve -k exec_trace

# 监控特权命令使用
-a always,exit -F arch=b64 -S execve -F path=/usr/bin/sudo -k sudo_use

# 监控失败的登录尝试
-w /var/log/faillog -p wa -k login_fail

auditd 记录的事件类型包括:SYSCALL(系统调用)、PATH(文件路径访问)、EXECVE(程序执行)、USER_AUTH(用户认证)、USER_ACCT(账户操作)、LOGIN(登录事件)、CONFIG_CHANGE(审计配置变更)等。每条审计记录包含时间戳、事件类型、进程信息、用户 ID、系统调用号、返回值等字段。

检索审计日志使用 ausearch 和 aureport:

# 按关键字检索
ausearch -k passwd_change

# 按事件类型检索
ausearch -m USER_AUTH --start today

# 生成审计摘要报告
aureport --summary
aureport -au --failed   # 失败的认证事件

五、审计规则设计要点

设计审计规则时,应优先覆盖以下关键事件类型:身份认证(登录成功/失败、sudo 使用)、权限变更(用户/组修改、文件权限变更)、敏感文件访问(/etc/passwd、/etc/shadow、SSH 密钥)、程序执行(尤其是提权工具和网络工具)、审计配置变更(防止规则被篡改)。规则不宜过宽,否则日志量过大影响性能;也不宜过窄,否则遗漏关键事件。建议先用 auditctl -l 查看当前规则,再根据实际业务逐步调整。

实践提示:在测试环境添加审计规则后,可用 auditctl -s 查看审计子系统状态,确认 enabled 为 1、lost 为 0。若 lost 持续增长,说明日志产生速度超过处理能力,需要调整规则或增大缓冲区。
注意:auditd 规则修改后需重启服务或重新加载规则才能生效。使用 augenrules --load 可从 /etc/audit/rules.d/ 重新生成并加载规则。生产环境中修改审计规则前应先在测试环境验证,避免规则冲突导致审计失效。