auditdのログをrsyslogでリモートホストに転送しようとしたら、ちょっとログが流れるだけでSSHが出来なくなったりとrsyslogが詰まるせいで、auditdも詰まり、プロセスが起動できない状態になりました。
出力プラグインがメッセージを提供できない場合、メッセージはI先行のメッセージキューに保存されます。キューがいっぱいになると、いっぱいでなくなるまで入力がブロックされます。これにより、ブロックされたキューを使用して新しいメッセーがログに記録されることが回避されます。個別のアクションキューが存在しないため、SSH ロギングが阻止され、SSH アクセスが阻止されるなどの重大な問題が発生することがあります。したがって、ネットワークを介して転送される、またはデータベースに転送される出力専用アクションキューを使用することが推奨されます。
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も延々と続ける設定です。
$WorkDirectory /var/lib/rsyslog |
/etc/audisp/plugins.d/syslog.conf
active = yes
にする事でaudit logをrsyslogで流すようにします
active = yes |
/var/log/messagesにaudit logが流れてしまう
audit.logにlocal6を使っている場合、
/etc/rsyslog.conf
ではこんな感じの設定になると思います。
# auditd audit.log |
↑のフィルタに local6.none
を入れて、/etc/audisp/plugins.d/syslog.conf
にLOG_LOCAL6
を入れます。
active = yes |
あとは、rsyslogとauditdを再起動すればOKです。
参考
Redhatのページがとてもわかりやすいです。
- https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/s1-working_with_queues_in_rsyslog
- https://inaba-serverdesign.jp/blog/20130912/papertrail.html
- https://help.papertrailapp.com/kb/configuration/advanced-unix-logging-tips#rsyslog-not-transmitting-anything-or-logging-to-disk
- https://kiririmode.hatenablog.jp/entry/20180306/1520262000
- http://blog.plura.jp/?p=5268
- https://access.redhat.com/discussions/650853