EventBridgeで受け取ったGuardDutyのイベントをKinesis Firehose経由でS3に保存してみた

タイトル通りにEventBridge -> Kinesis Firehose -> S3の流れでイベントを保存します。何にでも応用が効くはず。
2022.03.28

こんにちは、臼田です。

みなさん、イベント保存してますか?(挨拶

今日はタイトル通りのことをやってみようと思いついたのでやってみます。私の目的はGuardDutyのイベントですが、他のイベントでもEventBridgeで拾えさえすれば、みんなこの手法が適用できると思います。

何のためにやるの?

GuardDutyにはデフォルトでS3に出力するための機能があるので、そのままS3に保存するだけならこれを利用すれば済みます。

今回わざわざEventBridgeからイベントを拾うのは、複数の環境からEventBridgeを利用してイベントを集約しているからです。

もちろんS3イベントとかでS3に保存してから飛ばす方法などもありますが、私のユースケースにはマッチしないので今回検討していません。

やってみた

すっごく簡単に書くとこんな構成です。

以下の順序で環境を作成していきます。

  • イベント保存用S3バケット作成
  • イベント転送用Kinesis Firehose作成
  • イベント検出用EventRule作成

S3バケット作成

特に特筆すること無く普通にS3バケットを作成していきます。イベントを受け取るリージョンで作成しましょう。

ACL無効、ブロックパブリックアクセス有効、バージョニング無しで特に問題ないです。

Kinesis Firehose作成

配信ストリーム(あるいはDelivery streams)の作成をします。SourceはDirect  PUT、DestinationにAmazon S3を選択します。

その他のパラメータはどれくらいの量流れてくるかとかによりますが、GuardDutyのイベントの場合にはそこまでたくさん流れないのでデフォルトで大丈夫でしょう。

バッファーのインターバルを最小の60秒にして、保存するときの圧縮だけGZIPを選択します。これはログをすぐに見れるようにするのと、気持ち程度のデータ容量節約が目的です。

EventRuleの作成

EventBridgeページからRuleを作成していきます。最初にEvent Busを適切なものを選択します。自分のアカウントのGuardDutyイベントを受け取りたいならDefaultで問題ないです。

適当な名前とかを入れ、「イベントパターンを持つルール」で次に進みます。

イベントパターンを目的に合わせて設定します。今回はGuardDutyGuardDuty Findingを選びます。

ターゲットに「Firehose 配信ストリーム」を選び先程作成したFirehoseのDelivery streamsを選択します。

後は適当に設定しましょう。

イベントの保存確認

実際にイベントを発生させてS3に保存されるか確認します。

何でもいいですが、私は以下の方法でGuardDutyを検知させました。

しばらくしてGuardDutyで検知し、イベントが保存されることが確認できました。Firehoseにより年/月/日/時/のパスが切られてgzで保存されました。

(2022/03/30追記)ちなみに、保存されたgzをS3のマネジメントコンソールからダウンロードすると、拡張子はそのままでブラウザにより解凍されてしまうことがありますので注意しましょう。以下が参考になります(なりました)。

まとめ

EventBridgeで受け取ったGuardDutyのイベントをKinesis Firehose経由でS3に保存してみました。

そのままですが、簡単にできることがわかりましたね。

他のサービスのイベントとかにも応用できますのでやってみましょう。