// 安全研究 · 2026-06-28

Linux 系统日志记录体系:从内核到 SIEM 的完整架构

一、概述:为什么日志是系统的“黑匣子”

在 Linux 系统中,日志是运维和安全工作的核心基础设施。无论是排查故障、追踪安全事件,还是满足合规审计要求,日志都是不可替代的第一手资料。现代 Linux 的日志体系并非单一组件,而是一个分层协作的生态系统,涉及内核、用户空间守护进程、配置文件、存储管理和分析工具等多个层次。

本文将系统性地介绍 Linux 日志体系的完整架构,涵盖传统 syslog 协议、systemd-journald、rsyslog、auditd 安全审计、日志轮转(logrotate)以及现代集中化日志架构。


二、整体架构:五层日志体系

graph TB
    subgraph KERNEL["内核层"]
        K1["内核消息 kmsg"]
        K2["auditd 内核钩子"]
        K3["系统调用审计"]
    end

    subgraph SERVICES["系统服务层"]
        S1["systemd-journald<br/>结构化二进制日志"]
        S2["rsyslog<br/>传统文本日志"]
        S3["syslog-ng<br/>高级日志路由"]
        S4["auditd<br/>安全审计守护进程"]
    end

    subgraph APPS["应用层"]
        A1["stdout/stderr<br/>systemd 服务"]
        A2["syslog() API<br/>传统应用"]
        A3["直接文件写入<br/>应用自定义日志"]
    end

    subgraph STORAGE["存储层"]
        ST1["/var/log/journal/<br/>journald 二进制存储"]
        ST2["/var/log/messages<br/>/var/log/secure<br/>rsyslog 文本文件"]
        ST3["/var/log/audit/<br/>auditd 审计日志"]
    end

    subgraph ANALYSIS["分析与收集层"]
        AL1["journalctl 查询"]
        AL2["grep/awk/tail 分析"]
        AL3["ELK / Loki / Grafana"]
        AL4["SIEM / 安全分析"]
    end

    K1 --> S1
    K2 --> S4
    K3 --> S4
    A1 --> S1
    A2 --> S1
    A3 --> ST2
    S1 --> S2
    S1 --> ST1
    S2 --> ST2
    S3 --> ST2
    S4 --> ST3
    ST1 --> AL1
    ST2 --> AL2
    ST2 --> AL3
    ST3 --> AL4

三、核心组件详解

3.1 Syslog 协议:日志世界的“通用语言”

Syslog 是 Unix/Linux 世界的事实标准日志协议,由 RFC 5424 定义。它通过两个维度对日志进行分类:

Facility(设施/来源)

Facility 编号 说明
kern 0 内核消息
user 1 用户级程序
mail 2 邮件系统
daemon 3 系统守护进程
auth 4 认证/授权消息
syslog 5 syslog 守护进程自身
lpr 6 打印机子系统
news 7 新闻子系统
uucp 8 UUCP 子系统
cron 9 定时任务
authpriv 10 私有认证信息
ftp 11 FTP 守护进程
ntp 12 NTP 子系统
local0 ~ local7 16~23 用户自定义设施

Priority(优先级/严重级别)

级别 数值 名称 说明
0 Emergency 紧急 系统不可用
1 Alert 警报 必须立即处理
2 Critical 严重 严重情况
3 Error 错误 一般错误
4 Warning 警告 潜在问题
5 Notice 注意 正常但重要的事件
6 Info 信息 一般信息
7 Debug 调试 调试信息

Priority 值计算公式:PRI = Facility × 8 + Severity。例如,内核的 Emergency 消息优先级为 0×8+0=0,用户程序的 Notice 消息为 1×8+5=13。


3.2 systemd-journald:现代 Linux 的日志中枢

systemd-journald 是 systemd 套件中的日志组件,自 systemd 成为主流 init 系统后,它已成为大多数 Linux 发行版的默认日志收集器。

核心特性

  • 二进制格式:日志以结构化二进制形式存储在 /var/log/journal/(持久化)或 /run/log/journal/(运行时),无法直接用 cat 读取
  • 丰富元数据:每条日志附带 PID、UID、GID、_COMM(命令名)、_UNIT(systemd 单元名)、_BOOT_ID(启动标识)等字段
  • 启动早期日志:能捕获 initrd 和内核启动阶段的日志,这是传统 syslog 无法做到的
  • 自动轮转:内置存储管理,自动压缩和清理旧日志
  • 单一查询入口:通过 journalctl 命令统一查询

常用 journalctl 命令

# 查看所有日志
journalctl

# 查看特定服务日志
journalctl -u nginx.service

# 查看内核日志
journalctl -k

# 实时跟踪
journalctl -f

# 查看上次启动的日志
journalctl -b -1

# 按时间范围查询
journalctl --since "2024-01-01 00:00:00" --until "2024-01-02 00:00:00"

# 按优先级过滤
journalctl -p err

# 查看特定进程
journalctl _PID=1234

# 查看特定用户
journalctl _UID=1000

journald 配置

配置文件位于 /etc/systemd/journald.conf:

[Journal]
Storage=persistent          # persistent/auto/volatile/none
SystemMaxUse=500M           # 最大占用空间
SystemMaxFileSize=100M      # 单个日志文件上限
MaxRetentionSec=1month      # 最大保留时间
Compress=yes                # 启用压缩
ForwardToSyslog=yes         # 转发到 syslog
ForwardToWall=yes           # 转发到控制台

3.3 rsyslog:传统但强大的日志处理器

rsyslog 是 sysklogd 的继任者,是绝大多数 Linux 发行版的默认 syslog 守护进程。它负责将日志从 journald 接收后,按照规则分类、格式化并写入 /var/log/ 下的各个文件。

日志数据流

sequenceDiagram
    participant App as 应用程序
    participant Journal as systemd-journald
    participant Rsyslog as rsyslog
    participant LogFile as /var/log/*.log
    participant Rotate as logrotate
    participant Remote as 远程日志服务器

    App->>Journal: stdout/stderr / syslog()
    Journal->>Journal: 结构化存储<br/>带元数据(PID, UID, 时间戳)
    Journal->>Rsyslog: 通过 /run/systemd/journal/syslog 转发
    Rsyslog->>Rsyslog: 过滤/分类/格式化
    Rsyslog->>LogFile: 写入文本日志文件
    Note over LogFile: messages, secure, cron, maillog...
    Rotate->>LogFile: 定期轮转/压缩/删除
    Rsyslog->>Remote: TCP/UDP/TLS 转发

rsyslog 配置

主配置文件 /etc/rsyslog.conf 和 /etc/rsyslog.d/*.conf:

# 基本语法:selector action
# selector = facility.priority
# action = 文件路径/远程主机/数据库等

# 将所有 info 级别及以上日志写入 messages
*.info;mail.none;authpriv.none;cron.none    /var/log/messages

# 认证日志
authpriv.*                                  /var/log/secure

# 邮件日志
mail.*                                      -/var/log/maillog

# cron 日志
cron.*                                      /var/log/cron

# 紧急消息广播给所有用户
*.emerg                                     :omusrmsg:*

# 远程日志转发(TCP 加密)
*.*                                         action(type="omfwd" target="log.example.com" port="514" protocol="tcp" StreamDriver="gtls" StreamDriverMode="1")

/var/log 目录标准结构

根据 FHS(Filesystem Hierarchy Standard),/var/log 是系统可变日志文件的标准存放位置。

文件/目录 发行版 内容
/var/log/messages RHEL/CentOS/Fedora 一般系统日志
/var/log/syslog Debian/Ubuntu 一般系统日志
/var/log/secure RHEL 认证、安全相关
/var/log/auth.log Debian 认证、sudo、SSH
/var/log/kern.log 通用 内核消息
/var/log/cron 通用 定时任务日志
/var/log/maillog RHEL 邮件系统日志
/var/log/mail.log Debian 邮件系统日志
/var/log/dmesg 通用 硬件/内核启动信息
/var/log/boot.log 通用 启动过程日志
/var/log/audit/ 通用 auditd 审计日志
/var/log/journal/ systemd journald 二进制存储

3.4 journald vs rsyslog:互补而非竞争

flowchart LR
    subgraph J["systemd-journald"]
        J1["二进制格式"]
        J2["结构化元数据<br/>PID, UID, _COMM, _UNIT"]
        J3["journalctl 查询"]
        J4["自动轮转/压缩"]
        J5["启动早期日志<br/>initrd, kmsg"]
    end

    subgraph R["rsyslog"]
        R1["纯文本格式"]
        R2["标准 syslog 字段<br/>facility, priority"]
        R3["grep/awk/less 分析"]
        R4["logrotate 外部管理"]
        R5["网络转发<br/>TCP/UDP/TLS/RELP"]
        R6["数据库/消息队列<br/>输出"]
    end

    J -->|"互补共存"| R
    R -->|"imjournal 读取"| J
特性 journald rsyslog
格式 结构化二进制 纯文本
查询 journalctl grep/awk/tail
元数据 丰富(PID、UID、UNIT 等) 标准 syslog 字段
启动日志 支持 initrd/kmsg 不支持早期启动
网络转发 有限 强大(TCP/UDP/TLS/RELP)
外部集成 依赖 syslog 转发 直接支持数据库、消息队列
轮转管理 内置自动管理 依赖 logrotate
企业场景 单机排查 集中化日志架构

最佳实践:两者共存,journald 负责收集和本地快速查询,rsyslog 负责持久化文本归档和网络转发。


3.5 auditd:内核级安全审计框架

auditd 是 Linux 内核提供的安全审计子系统,与 syslog 不同,它专注于**追踪“谁做了什么”**而非“发生了什么”。它通过内核钩子拦截系统调用,记录安全相关事件。

graph TB
    subgraph KERNEL_AUDIT["内核审计子系统"]
        KA1["系统调用拦截<br/>execve, open, connect..."]
        KA2["文件系统监控<br/>inotify + 审计规则"]
        KA3["SELinux / AppArmor<br/>策略事件"]
    end

    subgraph USER_SPACE["用户空间"]
        US1["auditd 守护进程"]
        US2["auditctl 规则管理"]
        US3["ausearch 日志搜索"]
        US4["aureport 报告生成"]
        US5["audispd 插件分发"]
    end

    subgraph RULES["审计规则"]
        R1["/etc/audit/audit.rules"]
        R2["/etc/audit/rules.d/*.rules"]
    end

    subgraph OUTPUT["输出目标"]
        O1["/var/log/audit/audit.log"]
        O2["远程 auditd"]
        O3["SIEM / Elasticsearch"]
    end

    KA1 --> US1
    KA2 --> US1
    KA3 --> US1
    R1 --> US2
    R2 --> US2
    US2 --> US1
    US1 --> O1
    US1 --> US5
    US5 --> O2
    US5 --> O3
    US3 --> O1
    US4 --> O1

auditd 核心工具

工具 功能
auditd 审计守护进程,写入日志
auditctl 动态管理审计规则
ausearch 搜索审计日志
aureport 生成审计报告
augenrules 从规则目录生成规则文件

审计规则示例

# 监控 /etc/passwd 的所有访问
auditctl -a always,exit -F arch=b64 -F path=/etc/passwd -F perm=rwxa

# 监控 /etc/security 目录
auditctl -a always,exit -F arch=b64 -F dir=/etc/security

# 监控所有用户的命令执行(execve)
auditctl -a always,exit -F arch=b64 -S execve -C uid!=euid

# 查看当前规则
auditctl -l

# 删除所有规则
auditctl -D

持久化规则写入 /etc/audit/rules.d/:

# /etc/audit/rules.d/custom.rules
-a always,exit -F arch=b64 -F path=/etc/passwd -F perm=rwxa
-a always,exit -F arch=b32 -F path=/etc/passwd -F perm=rwxa
-w /etc/shadow -p wa -k identity_changes
-w /sbin/insmod -p x -k module_insertion

日志分析

# 搜索特定关键字的审计事件
ausearch -k identity_changes

# 生成登录报告
aureport --login --summary

# 生成文件访问报告
aureport --file --summary

# 查看用户活动
aureport --user -i

注意:auditd 日志可能非常庞大,一条规则就能在几分钟内淹没日志。生产环境部署前必须充分测试。


3.6 logrotate:日志轮转与生命周期管理

logrotate 是 Linux 系统中管理日志文件生命周期的标准工具,防止日志文件无限增长撑爆磁盘。

配置示例

# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily                    # 每天轮转
    missingok                # 文件不存在不报错
    rotate 14                # 保留 14 个备份
    compress                 # 压缩旧日志
    delaycompress            # 延迟压缩(最近一个周期不压缩)
    notifempty               # 空文件不轮转
    create 0640 www-data adm # 创建新文件权限
    sharedscripts            # 共享 postrotate 脚本
    postrotate
        /bin/kill -USR1 $(cat /var/run/nginx.pid 2>/dev/null) 2>/dev/null || true
    endscript
}

常用配置指令

指令 说明
daily/weekly/monthly 轮转周期
rotate N 保留 N 个备份
compress 用 gzip 压缩
delaycompress 延迟一个周期压缩
missingok 日志不存在不报错
notifempty 空文件不轮转
create mode owner group 创建新日志文件的权限
dateext 用日期作为后缀
maxsize 达到指定大小即轮转
su user group 以特定用户权限运行

测试与调试

# 测试配置(不实际执行)
logrotate -d /etc/logrotate.conf

# 强制轮转特定配置
logrotate -vf /etc/logrotate.d/nginx

# 查看状态文件
cat /var/lib/logrotate/status

四、日志体系协同工作流程

sequenceDiagram
    participant App as 应用程序
    participant Journal as systemd-journald
    participant Rsyslog as rsyslog
    participant LogFile as /var/log/*.log
    participant Rotate as logrotate
    participant Remote as 远程日志服务器

    App->>Journal: stdout/stderr / syslog()
    Journal->>Journal: 结构化存储<br/>带元数据(PID, UID, 时间戳)
    Journal->>Rsyslog: 通过 /run/systemd/journal/syslog 转发
    Rsyslog->>Rsyslog: 过滤/分类/格式化
    Rsyslog->>LogFile: 写入文本日志文件
    Note over LogFile: messages, secure, cron, maillog...
    Rotate->>LogFile: 定期轮转/压缩/删除
    Rsyslog->>Remote: TCP/UDP/TLS 转发
  1. 应用程序通过 stdout/stderr(systemd 服务)或 syslog() API 输出日志
  2. journald 收集所有日志,以结构化二进制格式存储,附带丰富元数据
  3. journald 通过 Unix domain socket 将日志转发给 rsyslog
  4. rsyslog 根据 /etc/rsyslog.conf 规则,将日志分类写入 /var/log/ 下的文本文件
  5. logrotate 定期轮转、压缩、清理旧日志,防止磁盘耗尽
  6. rsyslog 可选地将日志转发到远程日志服务器或 SIEM

五、现代集中化日志架构

在大型基础设施中,单机日志管理已无法满足需求,需要集中化日志收集、存储和分析。

graph TB
    subgraph NODES["日志产生节点"]
        N1["服务器 A<br/>journald + rsyslog"]
        N2["服务器 B<br/>容器日志"]
        N3["服务器 C<br/>应用日志"]
        N4["网络设备<br/>syslog"]
    end

    subgraph COLLECTORS["日志收集层"]
        C1["Fluentd / Fluent Bit"]
        C2["Vector"]
        C3["Promtail"]
        C4["Filebeat / Auditbeat"]
    end

    subgraph STORAGE_CENTRAL["集中存储"]
        S1["Elasticsearch<br/>全文索引"]
        S2["Loki<br/>标签索引 + Grafana"]
        S3["ClickHouse<br/>列式存储"]
        S4["S3 / 对象存储<br/>长期归档"]
    end

    subgraph VISUALIZATION["可视化与分析"]
        V1["Kibana"]
        V2["Grafana"]
        V3["自定义 Dashboard"]
    end

    N1 --> C1
    N2 --> C2
    N3 --> C3
    N4 --> C4
    C1 --> S1
    C2 --> S2
    C3 --> S2
    C4 --> S1
    S1 --> V1
    S2 --> V2
    S3 --> V2
    S4 --> V3

主流技术栈对比

方案 收集器 存储 可视化 特点
ELK Stack Filebeat/Logstash Elasticsearch Kibana 全文检索强,生态成熟
PLG Stack Promtail Loki Grafana 标签索引,与 Prometheus 生态集成
ClickHouse Vector/Fluentd ClickHouse Grafana 列式存储,分析性能高
云原生 Fluent Bit S3/CloudWatch 云厂商工具 托管服务,免运维

六、安全最佳实践

6.1 日志文件权限

敏感日志(如认证日志)应严格限制访问权限:

# 认证日志
chmod 600 /var/log/secure
chown root:root /var/log/secure

# 审计日志
chmod 600 /var/log/audit/audit.log
chown root:root /var/log/audit/audit.log

6.2 日志完整性保护

使用 auditd 或 aide 监控日志文件本身,防止篡改:

# 监控日志目录
auditctl -w /var/log/ -p wa -k log_integrity

6.3 远程日志与防篡改

将日志实时转发到远程只读服务器,即使本地被入侵,日志仍然安全:

# rsyslog 配置:加密转发
*.* action(type="omfwd"
    target="log-server.example.com"
    port="6514"
    protocol="tcp"
    StreamDriver="gtls"
    StreamDriverMode="1"
    StreamDriverAuthMode="anon"
)

6.4 日志保留策略

根据合规要求设置保留期限:

日志类型 建议保留期 法规参考
系统日志 30-90 天 内部策略
认证日志 1 年 PCI DSS
审计日志 1-7 年 等保 2.0 / HIPAA
安全事件 永久 SOC 2

七、总结

Linux 的日志体系是一个分层协作、新旧共存的复杂系统:

  • journald 作为现代收集器,提供结构化、带元数据的快速查询能力
  • rsyslog 作为传统处理器,负责文本持久化和网络转发
  • auditd 作为安全审计层,在内核层面追踪关键操作
  • logrotate 作为生命周期管理器,防止日志失控
  • 集中化架构(ELK/PLG)将单机日志扩展为企业级可观测性平台

理解这些组件如何协同工作,是 Linux 运维和安全工作的基本功。在实际环境中,建议根据规模选择合适的架构:单机场景以 journald + rsyslog + logrotate 为主,企业场景则需要引入集中化收集和分析平台。


参考资源

原文 https://blog.csdn.net/2301_79518550/article/details/162393057