【AWS】GuardDuty検知をEventBridge経由でメール通知する方法(CloudFormation対応)
AWSのセキュリティ監視サービス「GuardDuty」を有効化したら、異常検知を自動でメール通知できるようにしたいですよね。
本記事では、CloudFormation(Cfn)を活用してGuardDutyの検知内容をメールで受け取る仕組みを構築する方法を紹介します。
・GuardDutyをSNSに通知する仕組みをCloudFormationを使ってサクッとつくりたい!
記事の目次
構成要素
GuardDutyを有効化し、GuardDutyが「高」または「クリティカル」レベルの検知を行った場合に、SNS経由でメール通知を受け取ります。
構成には以下の3つのAWSサービスを使用します。
| サービス | 役割 |
|---|---|
| GuardDuty | アカウント内の異常な動きや攻撃を検知 |
| EventBridge | GuardDuty検知をトリガーに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 GuardDutyFindingRuleCloudFormationスタックの作成
Cfnのダッシュボードに移動し「スタックの作成>新しいリソースを使用(標準)」をクリック
スタックの作成では下記内容で「次へ」をクリック
スタックの詳細を指定ではスタック名を一意の名前を入力し、パラメーターにSNSのARNを入力してください。

スタックオプションの設定はデフォルトでOKですが「ロールバック中に新しく作成されたリソースを削除する」では「新しく作成されたリソースを削除する」にします。
確認して作成で問題なければ「送信」をクリック
画面が遷移して「CRETATE_IN_PROGRESS」であることを確認し「CREATE_COMPLETE」となるまで待機します。

無事作成できました。

動作確認(テスト)
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で構築しました。
一度設定しておけば、セキュリティイベントを自動でメール通知でき、運用効率が大幅に向上します。