Skip to content

📋 日志审计 ​

安全系统有个铁律:没被记录的入侵等于没发生。日志审计是安全的"黑匣子"——当你在修复入侵后做的第一件事,就是弄清楚到底发生了什么。而这一切都依赖于你事先配好的日志体系。

rsyslog:Linux 日志中枢 ​

rsyslog 是 Linux 默认的日志守护进程,负责收集、分类、转发各类系统日志。

基本概念:设施(Facility)与优先级(Priority) ​

Facility来源
auth, authpriv认证相关(登录、sudo)
cron计划任务
daemon后台守护进程
kern内核消息
mail邮件系统
user用户进程
local0~local7自定义应用使用
Priority(从高到低)含义
emerg系统不可用
alert需要立即处理
crit严重错误
err普通错误
warning警告
notice重要提示
info一般信息
debug调试信息

配置按设施分流 ​

编辑 /etc/rsyslog.d/50-custom.conf:

config
# 认证日志独立文件
auth,authpriv.*    /var/log/auth.log

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

# 内核日志
kern.*             /var/log/kern.log

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

# 所有 warning 以上级别的统一归拢
*.warn             /var/log/warning.log

# 所有 emerg 发到所有在线用户
*.emerg            :omusrmsg:*

# 远程转发(集中日志)
# 将所有日志转发到中心日志服务器
*.* @@192.168.1.100:514
bash
# 配置修改后重启
sudo systemctl restart rsyslog

日志转发

@192.168.1.100 使用 UDP,@@192.168.1.100 使用 TCP。生产环境推荐用 TCP(@@)保证日志不丢。

auditd:审计关键文件与操作 ​

rsyslog 记录系统消息,auditd 则精细审计谁、在什么时候、对什么文件、做了什么操作。

bash
sudo apt install auditd
sudo systemctl enable auditd --now

监控敏感文件 ​

在 /etc/audit/rules.d/monitor.rules 中写入:

config
# 监控 /etc/passwd 的一切写入操作(添加/删除用户会触发)
-w /etc/passwd -p wa -k identity_changes

# 监控 /etc/shadow
-w /etc/shadow -p wa -k identity_changes

# 监控 /etc/sudoers 和 /etc/sudoers.d
-w /etc/sudoers -p wa -k sudoers_changes
-w /etc/sudoers.d -p wa -k sudoers_changes

# 监控 /etc/ssh/sshd_config 的修改
-w /etc/ssh/sshd_config -p wa -k ssh_config_changes

# 监控 SUID 程序的执行
-a always,exit -F arch=b64 -S chmod -F a0=4000 -k suid_set

# 监控 sudo 使用
-a always,exit -F arch=b64 -S execve -F euid=0 -k sudo_exec

# 监控失败的认证
-a always,exit -F arch=b64 -S open -F path=/etc/shadow -F success=0 -k failed_auth

参数说明:

  • -w:watch 一个路径
  • -p wa:监控 write 和 attribute 变更
  • -k:给规则加标签,方便查询时过滤
bash
# 加载规则
sudo augenrules --load

# 查询审计日志(按标签过滤)
sudo ausearch -k identity_changes

# 实时跟踪审计事件
sudo ausearch -k sudo_exec -i | tail -20

# 查看某个用户的操作记录
sudo ausearch -ua <用户UID> -i

# 生成审计报告
sudo aureport --summary
sudo aureport --auth          # 认证事件报告
sudo aureport --file          # 文件访问报告
sudo aureport --executable    # 程序执行报告

日志轮转:logrotate ​

日志不轮转的话,/var/log 迟早把磁盘撑爆。

bash
# 系统日志轮转配置
cat /etc/logrotate.d/rsyslog

自定义应用日志轮转示例(/etc/logrotate.d/myapp):

config
/var/log/myapp/*.log {
    daily                   # 每天轮转
    rotate 30               # 保留 30 份
    missingok               # 日志不存在也不报错
    notifempty              # 空文件不轮转
    compress                # 压缩旧日志
    delaycompress           # 最新一份不压缩
    copytruncate            # 复制后清空(不重命名,进程无需重启)
    dateext                 # 用日期后缀
    maxsize 100M            # 超过 100M 强制轮转(即使没到 daily)
    create 640 appuser appgroup
    postrotate
        /bin/kill -HUP $(cat /var/run/myapp.pid 2>/dev/null) 2>/dev/null || true
    endscript
}

copytruncate vs create

copytruncate 适合那些不支持 SIGHUP 重开日志的进程。create 需要进程支持信号重载。二选一。

journald 持久化配置 ​

systemd 的 journald 默认把日志存在 /run/log/journal,重启就丢。生产环境必须开启持久化:

bash
# 编辑配置
sudo vim /etc/systemd/journald.conf
config
[Journal]
Storage=persistent         # 持久化到磁盘
Compress=yes               # 启用压缩
SystemMaxUse=1G            # 最多占用 1G 磁盘
SystemMaxFileSize=100M     # 单个日志文件最大 100M
MaxRetentionSec=2month     # 最多保留 2 个月
ForwardToSyslog=yes        # 同时转发给 rsyslog
bash
# 应用配置
sudo systemctl restart systemd-journald

# 常用 journalctl 命令
journalctl -u ssh --since "1 hour ago"    # 最近一小时 SSH 日志
journalctl -u nginx -f                     # 实时跟踪 nginx 日志
journalctl -p err -b                       # 当前启动以来的所有错误
journalctl _UID=1000                       # 特定用户产生的日志
journalctl --disk-usage                    # 查看日志占用

集中日志方案简介 ​

当服务器超过 3 台时,逐台登录看日志变得不现实。集中日志是必经之路。

方案特点适合场景
ELK(Elasticsearch+Logstash+Kibana)功能最强,资源消耗大大型企业
Graylog比 ELK 轻量,Web 界面友好中型团队
Loki + Grafana轻量级,和 Prometheus 搭配好中小团队
rsyslog 中继零额外组件,纯 Linux 自带最小化方案

最小化方案(rsyslog 中继):

config
# 在所有节点上配置
*.* @@192.168.1.100:514
config
# 在中心日志服务器上
module(load="imtcp")
input(type="imtcp" port="514")

# 按来源 IP 分文件
$template RemoteLogs,"/var/log/remote/%FROMHOST-IP%/%$YEAR%-%$MONTH%-%$DAY%.log"
*.* ?RemoteLogs

实战:监控 sudo 使用和敏感文件访问 ​

目标:记录所有 sudo 操作,并在有人读取 /etc/shadow 时告警。

监控 sudo ​

auditd 规则已包含 sudo_exec,直接查询:

bash
# 查看最近的 sudo 使用
sudo ausearch -k sudo_exec -i --start today | less

# 生成 sudo 使用日报
sudo ausearch -k sudo_exec -i --start today --format csv > /tmp/sudo_usage.csv

监控敏感文件访问并告警 ​

bash
# 创建实时监控脚本
cat > /usr/local/bin/audit-alert.sh <<'SCRIPT'
#!/bin/bash
# 监听审计事件,敏感操作触发告警
# 前提:auditd 服务已在运行(systemctl start auditd)

tail -f /var/log/audit/audit.log | while read line; do
    if echo "$line" | grep -q "identity_changes"; then
        logger -p auth.alert "⚠ 用户身份文件被修改!详情: $line"
    fi
    if echo "$line" | grep -q "failed_auth"; then
        logger -p auth.warn "⚠ 尝试访问 /etc/shadow 失败!详情: $line"
    fi
done
SCRIPT

chmod +x /usr/local/bin/audit-alert.sh
bash
# 配合 fail2ban 可扩展告警
# 在 /etc/fail2ban/action.d/sendmail-whois.conf 的基础上加钉钉/飞书 Webhook

🧪 练习题 ​

  1. 配置 rsyslog 将所有 auth 日志独立到 /var/log/auth.log,warning 以上集中到 /var/log/important.log
  2. 用 auditd 监控 /etc/passwd,创建和删除一个测试用户后,用 ausearch 查看审计记录
  3. 设置 journald 持久化和日志轮转,确保日志不会撑爆磁盘

日志和监控体系就位了,来看看怎么应对大流量攻击——DDoS 防护。


🎯 本章要点 ​

  • Facility 标识日志来源(auth=认证、cron=定时任务、kern=内核)。
    • 通配符表示所有 facility,emerg 是优先级。
  • 服务器被入侵后攻击者第一件事就是清理日志。
加载练习题中...