【AWS】GuardDuty検知をEventBridge経由でメール通知する方法(CloudFormation対応)

GuardDutyアイキャッチ

AWSのセキュリティ監視サービス「GuardDuty」を有効化したら、異常検知を自動でメール通知できるようにしたいですよね。
本記事では、CloudFormation(Cfn)を活用してGuardDutyの検知内容をメールで受け取る仕組みを構築する方法を紹介します。

・GuardDutyをSNSに通知する仕組みをCloudFormationを使ってサクッとつくりたい!

構成要素

GuardDutyを有効化し、GuardDutyが「高」または「クリティカル」レベルの検知を行った場合に、SNS経由でメール通知を受け取ります。
構成には以下の3つのAWSサービスを使用します。

サービス役割
GuardDutyアカウント内の異常な動きや攻撃を検知
EventBridgeGuardDuty検知をトリガーにSNSへ通知
SNS通知メールを配信

今回の構築方針

  • 重要度が「高」または「クリティカル(Severity 7以上)」の検知のみ通知対象
  • CloudFormationテンプレートを使用してEventBridgeルールを自動作成
  • SNSを利用してメール配信

前提条件

以下がすでに準備済みであることを前提とします。

  • SNSトピックが作成済み
  • GuardDutyが有効化済み

GuardDuty有効化とSNS連携の設定方法は別記事を参考にしてください。

SNSの設定

まず、EventBridgeがSNSに通知を送信できるようにSNSのアクセスポリシーを修正します。

SNSダッシュボードに移動し今回使用したいSNSトピックを選択します。

編集をクリック

「アクセスポリシー – オプション」をクリックしSNSのアクセスポリシーに下記を追加してください。

,
{
  "Sid": "AllowEventBridgePublish",
  "Effect": "Allow",
  "Principal": {
    "Service": "events.amazonaws.com"
  },
  "Action": "SNS:Publish",
  "Resource": "<YOUR_SNS_TOPIC_ARN>",
  "Condition": {
    "StringEquals": {
      "AWS:SourceAccount": "<GuardDutyイベントをはっこうするAWSアカウントID>"
    }
  }
}

✅ ポイント

  • 先頭の「,」を忘れるとJSONエラーになるので注意!
  • この設定により、EventBridgeがSNSにPublishできるようになります。

最後に、SNSトピックのARNをコピーしておきます。
後ほどCloudFormationのパラメータに入力します。

EventBridgeルールの作成(CloudFormation)

次に、GuardDutyの検知を受けてSNSに通知するEventBridgeルールを作成します。
以下のYAMLを任意のファイル名(例:guardduty-eventbridge.yml)で保存します。

AWSTemplateFormatVersion: "2010-09-09"
Description: "EventBridge rule for GuardDuty findings with severity >=7, sending notification to a specified SNS topic."

# SNS Topicはビルド時に手動入力
Parameters:
  SnsTopicArn:
    Type: String
    Description: "ARN of the SNS topic to which notifications will be sent"

Resources:
  # GuardDutyFindingRuleリソースの設定
  GuardDutyFindingRule:
    Type: AWS::Events::Rule
    Properties:
      # EventBridgeのGuardDutyを検知するルール名
      Name: "GuardDutyFindingRule"
      Description: "Trigger on GuardDuty findings with high severity and notify SNS."
      EventPattern:
        source:
          - "aws.guardduty"
        detail-type:
          - "GuardDuty Finding"
        # 今回は「重要」のものだけ検知する設定
        detail:
          severity:
            - 7
            - 8
            - 9
            - 10
      # EventBridgeの通知先
      Targets:
        - Arn: !Ref SnsTopicArn
          Id: "SendToSNS"
          # 入力トランスフォーマー
          InputTransformer:
            # 入力パス(EventBridgeから値を受け取る)
            InputPathsMap:
              description: "$.detail.description"
              id: "$.detail.id"
              region: "$.region"
              severity: "$.detail.severity"
              title: "$.detail.title"
              type: "$.detail.type"
              account: "$.account"   
            # メール送信時のフォーマット
            InputTemplate: |
              "GuardDuty Finding!"
              "- Account ID: <account>"
              "- Severity: <severity>"
              "- Type: <type>"
              "- Title: <title>"
              "- Description: <description>"
              "- Region: <region>"
              "- Finding ID: <id>"

Outputs:
  EventRuleName:
    Description: "Name of the created EventBridge rule"
    Value: !Ref GuardDutyFindingRule

CloudFormationスタックの作成

Cfnのダッシュボードに移動し「スタックの作成>新しいリソースを使用(標準)」をクリック

スタックの作成では下記内容で「次へ」をクリック

スタックの詳細を指定ではスタック名を一意の名前を入力し、パラメーターにSNSのARNを入力してください。

スタックの詳細を指定画面

スタックオプションの設定はデフォルトでOKですが「ロールバック中に新しく作成されたリソースを削除する」では「新しく作成されたリソースを削除する」にします。

確認して作成で問題なければ「送信」をクリック
画面が遷移して「CRETATE_IN_PROGRESS」であることを確認し「CREATE_COMPLETE」となるまで待機します。

作成待機画面1

無事作成できました。

スタック作成画面

動作確認(テスト)

GuardDutyが異常を検知すると、EventBridgeを経由してSNSに通知されます。
異常の出力は下記コマンドを参考にしてください。

aws guardduty create-sample-findings --detector-id <あなたのDetector ID> --finding-types 'CryptoCurrency:EC2/BitcoinTool.B!DNS'

下記のような形でメールが来ます。

✅ 補足

  • InputTemplate部分でカスタムメッセージを自由に変更可能です。
  • CloudWatch LogsやLambdaなど別の通知方法に拡張も可能です。

まとめ

本記事では、GuardDutyの高重要度検知をEventBridge経由でSNS通知する仕組みをCloudFormationで構築しました。
一度設定しておけば、セキュリティイベントを自動でメール通知でき、運用効率が大幅に向上します。

📘関連リンク