主题
📋 日志审计
安全系统有个铁律:没被记录的入侵等于没发生。日志审计是安全的"黑匣子"——当你在修复入侵后做的第一件事,就是弄清楚到底发生了什么。而这一切都依赖于你事先配好的日志体系。
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:514bash
# 配置修改后重启
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.confconfig
[Journal]
Storage=persistent # 持久化到磁盘
Compress=yes # 启用压缩
SystemMaxUse=1G # 最多占用 1G 磁盘
SystemMaxFileSize=100M # 单个日志文件最大 100M
MaxRetentionSec=2month # 最多保留 2 个月
ForwardToSyslog=yes # 同时转发给 rsyslogbash
# 应用配置
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:514config
# 在中心日志服务器上
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.shbash
# 配合 fail2ban 可扩展告警
# 在 /etc/fail2ban/action.d/sendmail-whois.conf 的基础上加钉钉/飞书 Webhook🧪 练习题
- 配置 rsyslog 将所有 auth 日志独立到
/var/log/auth.log,warning 以上集中到/var/log/important.log - 用 auditd 监控
/etc/passwd,创建和删除一个测试用户后,用ausearch查看审计记录 - 设置 journald 持久化和日志轮转,确保日志不会撑爆磁盘
日志和监控体系就位了,来看看怎么应对大流量攻击——DDoS 防护。
🎯 本章要点
- Facility 标识日志来源(auth=认证、cron=定时任务、kern=内核)。
- 通配符表示所有 facility,emerg 是优先级。
- 服务器被入侵后攻击者第一件事就是清理日志。
加载练习题中...