深色模式
安全审计日志:关键操作留痕与集中留存
摘要:审计的核心是"谁、在何时、从哪、做了什么、结果如何"。本文给出 Linux auditd 的规则模板、日志集中转发、留存与查询方法,并说明为什么本地日志不足以满足审计要求。
适用环境
bash
cat /etc/os-release
systemctl is-active auditd rsyslog
command -v ausearch aureport && ausearch --help 2>&1 | head -3
df -h /var/log1
2
3
4
2
3
4
操作步骤
1. 明确要覆盖的事件类型
必须留痕的六类:登录/登出、账号与权限变更、sudo 提权、关键配置变更、服务启停、日志本身被改动。
2. 写 auditd 规则
bash
cat >/etc/audit/rules.d/90-security.rules <<'EOF'
# 身份与凭据
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/group -p wa -k identity
-w /etc/sudoers -p wa -k sudoers
-w /etc/sudoers.d/ -p wa -k sudoers
-w /etc/security/ -p wa -k security_policy
# SSH 与远程接入
-w /etc/ssh/sshd_config -p wa -k sshd_config
-w /etc/ssh/sshd_config.d/ -p wa -k sshd_config
# 审计与日志自身
-w /etc/audit/ -p wa -k audit_config
-w /etc/rsyslog.conf -p wa -k syslog_config
-w /var/log/ -p wa -k log_tamper
# 计划任务与启动项
-w /etc/crontab -p wa -k cron
-w /etc/cron.d/ -p wa -k cron
-w /var/spool/cron/ -p wa -k cron
# 提权与内核模块
-a always,exit -F arch=b64 -S setuid -S setgid -S setreuid -S setregid -k priv_esc
-a always,exit -F arch=b64 -S init_module -S finit_module -k kernel_module
# 文件删除(防止抹证据)
-a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -F dir=/var/log -k log_delete
EOF
augenrules --load
auditctl -l | wc -l1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
规则太宽会拖慢系统并撑爆磁盘
-w / -p wa 这种写法绝不可取。只监控关键目录,并配合 -F 过滤。
3. 配置留存与容量
bash
cat >/etc/audit/auditd.conf <<'EOF'
local_events = yes
write_logs = yes
log_file = /var/log/audit/audit.log
log_group = adm
log_format = ENRICHED
flush = INCREMENTAL_ASYNC
freq = 50
max_log_file = 200
num_logs = 20
max_log_file_action = ROTATE
space_left = 2000
space_left_action = SYSLOG
admin_space_left = 500
admin_space_left_action = SUSPEND
disk_full_action = SUSPEND
disk_error_action = SUSPEND
EOF
service auditd restart # auditd 需用 service 方式重启,systemctl restart 通常会报错
systemctl is-active auditd1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
修改规则文件后用 augenrules --load 即可,无需重启服务。
4. sudo 会话记录
bash
cat >/etc/sudoers.d/99-audit <<'EOF'
Defaults logfile="/var/log/sudo.log"
Defaults log_input, log_output
Defaults iolog_dir="/var/log/sudo-io/%{user}/%{command}"
Defaults log_year
Defaults loglinelen=0
EOF
visudo -c && mkdir -p /var/log/sudo-io && chmod 700 /var/log/sudo-io1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
5. 集中转发:本地日志不可信
bash
# rsyslog 转发到日志中心
cat >/etc/rsyslog.d/60-forward.conf <<'EOF'
*.* @@logcenter.internal:514
$ActionQueueFileName fwdRule
$ActionQueueMaxDiskSpace 1g
$ActionQueueSaveOnShutdown on
$ActionQueueType LinkedList
$ActionResumeRetryCount -1
EOF
systemctl restart rsyslog1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
明文 syslog 会被篡改或伪造
内网也应启用 TLS 传输(rsyslog 的 gtls 驱动或走 Kafka/Vector 等带认证的管道)。
6. 保证时钟一致
bash
systemctl enable --now chronyd
chronyc sources
timedatectl1
2
3
2
3
时间不准会让跨主机日志关联彻底失效。
7. 定期出审计报告
bash
aureport --auth | tail -20
aureport --user --start this-week
ausearch -k identity --start today
ausearch -k log_tamper --start this-month | aureport -f -i1
2
3
4
2
3
4
验证
bash
auditctl -s | grep -E 'enabled|failure'
auditctl -l | wc -l # 规则数 > 0
# 触发一条规则
touch /tmp/t && mv /tmp/t /etc/cron.d/should-alert && rm -f /etc/cron.d/should-alert
ausearch -k cron --start recent | tail -5
# 集中端确认收到
logger -p auth.info "audit drill $(date +%s)" && \
ssh logcenter 'grep "audit drill" /var/log/remote/*/$(hostname).log | tail -1'1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
判定标准:规则已加载且开机自动加载;关键操作可在集中端检索到;留存周期达标。
常见坑
日志只存本地,被入侵后一并删除
必须实时转发到独立日志中心,且日志中心对本机只开放写入。
auditd 规则没持久化
只用 auditctl -w 是临时的。必须写进 /etc/audit/rules.d/*.rules 并 augenrules --load。
磁盘被审计日志撑爆导致服务异常
配好 max_log_file/num_logs/space_left_action,并监控 /var/log 使用率。
审计规则过宽引发性能问题
高频写目录(如应用日志)不要进 audit 规则。用 -F 限定路径与系统调用。
没覆盖"日志被删"这件事本身
对 /var/log 加 unlink/rename 监控,否则抹日志不会被发现。