WazuhでRule ID 204 "Agent event queue is flooded" が発生した際にどんなイベントが多いのかを確認する方法、あるいは視野の話
Wazuhでは各サーバにあるWazuh agent(実体はossec-agentd)(以下、エージェント)からイベントを受け取ってそのイベントを解析して様々な検知をしてくれます。
なぜ唐突にWazuhなのかについて、詳しくはこことかここをご覧ください。
ところがエージェントが取り扱うイベントが多いと "Agent event queue is flooded" つまり、バッファ溢れを起こしてしまいます。
バッファ溢れに関しては、Wazuhも公式ドキュメントにそのしくみと詳細な対策方法を書いてくれています
そして、上記にある各種設定を調整してもバッファ溢れが発生する場合は、そもそもエージェントが取り扱うイベントが多すぎるということになります。
設定では厳しいので、エージェントが受け取っているイベントの見直しが必要になるのですが、エージェントが受け取っているイベントはログファイルだったりファイル更新イベントだったり多岐に渡っているので、何のイベントが多いのか特定は容易ではありません。
エージェントがどんなイベントを受け取っているのかを確認する方法
- まず https://github.com/wazuh/wazuh からソースコードをcloneします
- https://github.com/wazuh/wazuh/blob/5ebeae15e201b9e9f8d7be2216f0ebd6fc2aa98c/src/client-agent/buffer.c#L64 に
mdebug2("Send messages to buffer: %s", msg);
を差し込んておきます - ビルドします
- ビルドには対象環境と同じDockerfileなどを用意すると良いです
- srcディレクトリ内で
make deps
->make TARGET=agent
- 対象環境のwazuh-agentを止めます
systemctl stop wazuh-agent.service
- ビルドした ossec-agentd を差し替えます
/var/ossec/etc/local_internal_options.conf
にagent.debug=2
を追記します。- wazuh-agentを起動します
systemctl start wazuh-agent.service
/var/ossec/logs/ossec.log
で受け取っているイベント確認します
はい、ただのprintデバッグですね
利用しているOSSをソフトウェアとみるかソースコードとみるか
OSSをOsSとみるかOSsとみるか。程度の話。
— k1LoW (@k1LoW) 2019年2月14日
OSSにも大小いろいろあるけれど、それをソフトウェアではなくソースコードとみることができる範囲が大きい人ほど困った時の打ち手が多い。
エージェントのバッファ溢れはprintデバッグのあと解決に到るまではすぐだったのですが、実は、恥ずかしながら、そのただのprintデバッグにいきつくまでに非常に長い時間がかかってしまっています。
そして、(確認する方法3のforkリポジトリのURLからわかるように) @pyama86 から「ビルドできるよ」としれっと示唆してもらって、初めて、やっと、printデバッグにいきつくわけです。
PHPのアプリケーションなら確実に最初にprintデバッグしてるはずなのにです。
振り返ってみると、今回私は Wazuh を「オープンなソフトウェア(OsS)」と見ていて、ソースコードがあるのに関わらず読むとか追記するという頭に最初からなっていなかったように思えました。
これを「オープンなソースコード(OSs)」と見ていたら、イベントのバッファを定義している変数なり構造体なりをコードから探すでしょうし、必要な情報を出力するようにするくらいはしたはずです。
MySQLやPostgreSQLはOsSと見ています。Serverless FrameworkやtcpdumpはOSsと見ていたなという経験があります。同じOSSなのに、自分の中での取り扱いが違うみたいです。
おそらくですが、自分のなかにOsSとみるかOSsとみるかの境目があるんだと思います。
@pyama86 はそれを「視野」と言っていました。
その視野は決して1次元で考えられるものではないでしょうし、人それぞれの過去の経験によるものなんだと思うのですが、その視野をできるかぎり「OSSをソースコードとみるほう」に寄せていったほうがエンジニアとして成長できるし、意識しないと広がらないな...と感じたできごとでした。