audit日志按时间进行压缩存储

最近搞等保的事情,在操作系统上安装了audit服务。但按照等保的要求,审计日志需要定时异地转储,所以查一下如何将audit服务的日志文件可以按时间来进行rotate。

在Redhat的kb上找到一篇:How to implement audit log rotation with compression based on time instead of size 的文章,下面就把文章内容中需要的部分抽取出来写下。

由于auditd并不支持按日期的rotate,所以这里需要先修改auditd的配置,取消auditd默认的rotate方式。这一步需要编辑 /etc/audit/auditd.conf文件,将配置中原有的的

max_log_file_action = ROTATE

修改为

max_log_file_action = ignore

修改完成后需要重启服务:

systemctl restart auditd

在进行这个变更后,auditd服务将不会自动rotate日志文件。此时在/etc/cron.daily目录下创建一个定时任务文件,例如audit_log,写入以下的脚本:

1
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
#!/bin/bash
export PATH=/sbin:/bin:/usr/sbin:/usr/bin

FORMAT="%F_%T" # Customize timestamp format as desired, per `man date`
# %F_%T will lead to files like: audit.log.2015-02-26_15:43:46
COMPRESS=gzip # Change to bzip2 or xz as desired
KEEP=5 # Number of compressed log files to keep
ROTATE_TIME=5 # Amount of time in seconds to wait for auditd to rotate its logs. Adjust this as necessary

rename_and_compress_old_logs() {
for file in $(find /var/log/audit/ -name 'audit.log.[0-9]'); do
timestamp=$(ls -l --time-style="+${FORMAT}" ${file} | awk '{print $6}')
newfile=${file%.[0-9]}.${timestamp}
# Optional: remove "-v" verbose flag from next 2 lines to hide output
mv -v ${file} ${newfile}
${COMPRESS} -v ${newfile}
done
}

delete_old_compressed_logs() {
# Optional: remove "-v" verbose flag to hide output
rm -v $(find /var/log/audit/ -regextype posix-extended -regex '.*audit\.log\..*(xz|gz|bz2)$' | sort -n | head -n -${KEEP})
}

rename_and_compress_old_logs
service auditd rotate
sleep $ROTATE_TIME
rename_and_compress_old_logs
delete_old_compressed_logs

然后把这个脚本设置为可执行文件:

chmod +x audit_log

随后就可以由cron服务每天调用一次,把日志文件按照rotate时间进行重命名然后压缩。

如果需要测试,只需要直接运行下/etc/cron.daily/audit_log命令就可以了。在前几次运行时,由于没有足够的历史日志,可能会报rm的错误,可以忽略,等过几天就好了。

坚持原创技术分享,您的支持将鼓励我继续创作!