audit的規則配置稍微不當,就會短時間內產生大量日志,所以這個規則配置一定要當心。當audit日志寫滿后,可以看到如下場景:
-r-------- 1 root root 8388609 Mar 31 11:47 audit.log.997 -r-------- 1 root root 8388780 Mar 31 11:47 audit.log.998 -r-------- 1 root root 8388621 Mar 31 11:47 audit.log.999
然后在messages日志中有一大堆的warning
2018-03-31T12:12:02.881911+08:00|warning|kernel[-]|[74525.638569] audit: audit_backlog=8193 > audit_backlog_limit=8192 2018-03-31T12:12:02.881997+08:00|warning|kernel[-]|[74525.638571] audit: audit_lost=7035351 audit_rate_limit=0 audit_backlog_limit=8192 2018-03-31T12:12:02.882088+08:00|err|kernel[-]|[74525.638572] audit: backlog limit exceeded
之后可能還會影響rsyslog的正常工作。
auditd本身有日志切分的功能,auditd使用fprintf函數來記錄log,累計每次寫log的size,每次寫完后都會去檢查log的大小,當這個size達到用戶配置的max_log_file的大小時,就會shift_logs(這個是對於KEEP_LOGS這種模式而言的),新的達到切分值的日志命名為audit.log.1,之前的日志audit.log.(num+1)。
檢查日志時,隔幾次還會去查看一下磁盤空間是否充足,使用的函數是fstatfs,來獲取audit.log文件所在的mount分區的空間信息,當達到space_left的值或者admin_space_left,或者磁盤不足時就會執行相應的action。
那么既然auditd本身有log切分的功能,那如果和rsyslog一起使用,會出現什么問題呢?
對於使用syslog函數來記錄日志的話,日志的切分是很准確的,但是auditd是使用的fprintf來記錄的log,這樣的話,還能按照rsyslog中的配置來切分嗎?答案是可以的,我們可以這樣處理,在/etc/rsyslog.conf配置文件中,按照如下方式來配置:
$outchannel audit,/var/log/audit/audit.log.tmp,2097152,xx_log_dump.sh param1 param2
audit表示是outchannel的名稱(不是日志文件的名稱),/var/log/audit/audit.log.tmp是日志輸出的目的文件的名稱,即rsyslog要檢查大小的文件,2097152表示日志文件的大小閾值,xx_log_dump.sh表示日志文件到達閾值后執行的腳本,一般為轉儲腳本,參數和程序之間通過空格隔開。這樣配置后,rsyslog就會從/var/log/audit/audit.log文件中讀取日志,然后一條一條的以syslog的方式寫入到audit.log.tmp中,因為audit.log.tmp中加入了日期信息,所以audit.log.tmp會比audit.log文件稍大些,當audit.log.tmp達到2097152這個大小時,就把audit.log切分為audit.log.1並且轉儲處理。
但是要保證/etc/audit/auditd.conf中配置的max_log_file的值要大於/etc/rsyslog.conf配置的切分轉儲的值。否則audit要切分,rsyslog也過來切分,就亂了,要在audit切分前,rsyslog先完成切分和轉儲。