rsyslogで処理が詰まらないようにする

  • このエントリーをはてなブックマークに追加

auditdのログをrsyslogでリモートホストに転送しようとしたら、ちょっとログが流れるだけでSSHが出来なくなったりとrsyslogが詰まるせいで、auditdも詰まり、プロセスが起動できない状態になりました。

出力プラグインがメッセージを提供できない場合、メッセージはI先行のメッセージキューに保存されます。キューがいっぱいになると、いっぱいでなくなるまで入力がブロックされます。これにより、ブロックされたキューを使用して新しいメッセーがログに記録されることが回避されます。個別のアクションキューが存在しないため、SSH ロギングが阻止され、SSH アクセスが阻止されるなどの重大な問題が発生することがあります。したがって、ネットワークを介して転送される、またはデータベースに転送される出力専用アクションキューを使用することが推奨されます。

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/s1-working_with_queues_in_rsyslog

auditd自体の設定は何を記録したいかによるので、この記事では設定は省略して、rsyslogで処理が詰まらなくなる設定を紹介します。

Redhatのページによると、Mainキューで一度全てのログを受けて、ルール毎にActionキューに配置されて、出力されます。各キューにはワーカースレッドがあります。デフォルトの設定は、MainキューがFixedArray queue(10000), ActionキューがDirect queuesです。

/etc/rsyslog.conf

こんな感じに設定しました。
基本はインメモリーのキューを使います。
Mainのキューのサイズを10万に設定。Disk補助も使います。インメモリキューのサイズが5万を超えるとDiskを使い始めます。(Diskは遅いので差分の5万はメッセージバースト用です)。サイズが2万に下がるとDiskを使うのをやめます。

Actionも基本的には同じ戦略です。1桁少なくしています。こちらは確実に保存(転送)をしたいので、shutdown時にはDiskに書き出すようにして、Retryも延々と続ける設定です。

/etc/rsyslog.conf
$WorkDirectory /var/lib/rsyslog
$MainMsgQueueType LinkedList
$MainMsgQueueSize 100000
$MainMsgQueueHighWatermark 50000
$MainMsgQueueLowWatermark 20000
$MainMsgQueueSaveOnShutdown on
$MainMsgQueueFilename main_msg_pool
$MainMsgQueueMaxFileSize 10485760

$ActionQueueType LinkedList
$ActionQueueSize 10000
$ActionQueueHighWatermark 5000
$ActionQueueLowWatermark 2000
$ActionQueueFileName remote_spool
$ActionQueueMaxFileSize 10485760
$ActionQueueMaxDiskSpace 1g
$ActionQueueSaveOnShutdown on
$ActionResumeRetryCount -1

/etc/audisp/plugins.d/syslog.conf

active = yesにする事でaudit logをrsyslogで流すようにします

/etc/audisp/plugins.d/syslog.conf
active = yes
direction = out
path = builtin_syslog
type = builtin
args = LOG_INFO
format = string

/var/log/messagesにaudit logが流れてしまう

audit.logにlocal6を使っている場合、

/etc/rsyslog.conf ではこんな感じの設定になると思います。

/etc/rsyslog.conf
# auditd audit.log
$ModLoad imfile
$InputFileName /var/log/audit/audit.log
$InputFileTag tag_audit_log:
$InputFileStateFile audit_log
$InputFileSeverity info
$InputFileFacility local6
$InputRunFileMonitor

$template audit,"%timegenerated%,%syslogtag%,%hostname%,%msg%\n"
local6.* @@myhost.internal:514;audit
:syslogtag,contains,"tag_audit_log:" ~

# フィルタに local6.none を入れる
*.info;mail.none;authpriv.none;cron.none;local6.none /var/log/messages

↑のフィルタに local6.none を入れて、
/etc/audisp/plugins.d/syslog.confLOG_LOCAL6を入れます。

/etc/audisp/plugins.d/syslog.conf
active = yes
direction = out
path = builtin_syslog
type = builtin
args = LOG_INFO LOG_LOCAL6
format = string

あとは、rsyslogとauditdを再起動すればOKです。

参考

Redhatのページがとてもわかりやすいです。