GuardDutyで特定のイベントタイプのみ通知の例外としたい

2020.12.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは。大阪オフィスの林です。

GuardDutyをご利用中のユーザーで「特定のイベントタイプのみ通知の例外としたい」といった悩みをお持ちの方もいらっしゃるのではないでしょうか。本来、通知の例外は設けず、全てのイベントを通知するというのが、一般的なベストプラクティスなのかもしれませんが、通知されるイベントにノイズが入ってしまい、本来見逃してはいけないイベントを見逃してしまうといった事故が起きてしまっては本末転倒です。ワークロードに応じて通知の例外を設定するというのも一つの運用のケースとしてあるかと思いますので、本記事ではGuardDutyのイベントタイプに応じて通知の例外を設定する方法をご紹介したいと思います。

設定してみる

通知の例外設定はAmazon EventBridgeのイベントパターンで設定します。イベントパターンの設定でanything-butというコンテンツフィルタリングを使うことで例外の設定を行うことができます。イベントパターンを使用したコンテンツベースのフィルタリングの詳細はこちらを参照ください。

設定のパターン1

特定のイベントタイプを例外とする場合、anything-butに続けて例外とする特定のイベントタイプを指定します。GuardDutyのイベントタイプはこちらを参照ください。

{
  "detail-type":["GuardDuty Finding"],
  "source":["aws.guardduty"],
  "detail":{
    "severity":[{"numeric":[">=",0.0]}],
    "type":[{"anything-but":["Discovery:S3/BucketEnumeration.Unusual"]}]
  }
}

設定のパターン2

複数のイベントタイプを例外とする場合、カンマ区切りでイベントタイプを継ぎ足していきます。

{
  "detail-type":["GuardDuty Finding"],
  "source":["aws.guardduty"],
  "detail":{
    "severity":[{"numeric":[">=",0.0]}],
    "type":[{"anything-but":["Discovery:S3/BucketEnumeration.Unusual","Discovery:S3/MaliciousIPCaller.Custom"]}]
  }
}

確認してみる

確認については下記エントリで紹介したイベントパターンのテストコマンドを使って確認していきたいと思います。

例えばDiscovery:S3/BucketEnumeration.Unusualというイベントタイプを例外とする場合のテストをしてみます。サンプルイベントのイベントタイプはBackdoor:EC2/DenialOfService.Udpなので例外にマッチせず、trueが返ってきています。

aws events test-event-pattern \
--event-pattern "{\"detail-type\":[\"GuardDuty Finding\"],\"source\":[\"aws.guardduty\"],\"detail\":{\"severity\":[{\"numeric\":[\">=\",0.0]}],\"type\":[{\"anything-but\":[\"Discovery:S3/BucketEnumeration.Unusual\"]}]}}" \
--event "{\"id\":\"1\",\"source\":\"aws.guardduty\",\"detail-type\":\"GuardDuty Finding\",\"account\":\"xxxxx\",\"region\":\"ap-northeast-1\",\"time\":\"2020-12-01T00:00:00Z\",\"detail\":{\"severity\":8.0,\"type\":\"Backdoor:EC2/DenialOfService.Udp\"}}"
{
    "Result": true
}

次に、例外のイベントタイプとサンプルイベントのイベントタイプを同じDiscovery:S3/BucketEnumeration.Unusualにしてみます。例外とマッチするため、実行結果としてはfalseが返ってきています。

aws events test-event-pattern \
--event-pattern "{\"detail-type\":[\"GuardDuty Finding\"],\"source\":[\"aws.guardduty\"],\"detail\":{\"severity\":[{\"numeric\":[\">=\",0.0]}],\"type\":[{\"anything-but\":[\"Discovery:S3/BucketEnumeration.Unusual\"]}]}}" \
--event "{\"id\":\"1\",\"source\":\"aws.guardduty\",\"detail-type\":\"GuardDuty Finding\",\"account\":\"xxxxx\",\"region\":\"ap-northeast-1\",\"time\":\"2020-12-01T00:00:00Z\",\"detail\":{\"severity\":8.0,\"type\":\"Discovery:S3/BucketEnumeration.Unusual\"}}"
{
    "Result": false
}

注意点

イベントパターンの文字数にはクォーターが設定されており上限が2048文字となっています。現状上限の引き上げも出来ないようなので、文字数の制限には注意頂ければと思います。

まとめ

今回、GuardDutyのイベントに対して、通知の例外設定を入れてみましたが。GuardDuty以外でもイベントパターンを使っていれば汎用的に使える内容となっています。通知されるイベントにノイズが入ってしまい、運用が煩雑になっている方の参考になりましたら幸いです。

以上、大阪オフィスの林がお送りしました!