Skip to content

GuardDuty 通知設計書


1. 目的・スコープ

目的

GuardDutyの組織統合に伴い、findingsの検知・通知基盤を整理し、 fd-security-tooling(Delegated Admin)への集約通知体制を構築する。

スコープ

  • GuardDutyのfindingsの通知設計
  • 通知の重複排除方針
  • 通知先Slackチャンネルの整理
  • 既存個別通知の移行方針

スコープ外

  • 通知メッセージのフォーマット設計(別途検討)
  • オンコール連携(PagerDuty等、全体で検討する必要があるため今後の検討課題)
  • 対応フロー定義(運用設計書の範囲)
  • Inspector、Config等の他サービスの通知設計(各導入時に追記)
  • セキュリティ通知の全体設計(Security Hub導入時にあらためて検討)

前提

  • GuardDuty組織統合設計書に従い、fd-security-toolingがDelegated Adminとなる
  • Datadogインテグレーションの基盤が利用可能

2. 現状と課題

現状

GuardDuty通知(既存 — 各アカウント個別):
  構成: EventBridge(severity >= 7)→ SNS → Amazon Q Developer(旧AWS Chatbot)→ Slack
  ※ 以降「Amazon Q Developer」と表記
  対象リージョン: 東京 + オレゴン(一部東京のみ)

  アカウント別状況:
    ・production:     GuardDuty + Access Analyzer + Macie(東京+オレゴン)
    ・staging:        GuardDuty + Access Analyzer + Macie(東京)
    ・infra-dev:      GuardDuty + Access Analyzer + Macie(東京+オレゴン+大阪)+ Route53ヘルスチェック
    ・amazon-connect: GuardDutyのみ(東京)
    ・develop:        Access Analyzer + Macieのみ(GuardDutyのSNSサブスクリプション空 → 通知されていない)
    ・integration:    GuardDutyのみ(東京)

課題

#課題影響
1各アカウントに個別通知が分散管理が煩雑、設定のばらつき
2developのGuardDuty通知が壊れているfindingsが通知されていない
3新規アカウントは個別に通知設定が必要設定漏れのリスク
4ctop系・cc-poc等は通知設定がないGuardDuty未導入(組織統合で解消予定)
5マルチリージョン有効化後の未対応リージョン一部リージョンのfindingsが通知されない
6通知先Slackチャンネルにノイズが多い重要な通知が埋もれる

3. 通知アーキテクチャ

全体構成

通知経路の使い分け

通知経路にEventBridge → SNS → Amazon Q Developer → Slackを採用した理由:
  ・リアルタイム性: EventBridgeはイベント発生から秒単位で検知・通知可能
    HIGH/CRITICALのfindings(マイニング、C&C通信、マルウェア等)は
    数分の遅延が被害拡大に直結するため、即時通知が必要
    (Datadog連携もEventBridge経由だが、Slack通知とは用途を分けて運用する)
  ・Delegated Admin集約: fd-security-toolingのEventBridgeに全アカウントのfindingsが自動集約
  ・既存実績: 各アカウントで同じ構成(EventBridge → SNS → Amazon Q Developer)が稼働済み
  ・コスト:
    EventBridge: AWSサービスイベントのルールマッチングは無料
    SNS: 最初の1,000件/月の通知は無料。超過しても$0.50/100万件
    Amazon Q Developer: 無料(Slackとの連携サービス)
    GuardDutyのfindings量ではコストはほぼ発生しない

通知(EventBridge ルール① — Slack通知):
  ・対象: severity >= 7(HIGH/CRITICAL)
  ・経路: EventBridge → SNS → Amazon Q Developer → Slack(#squad-sre-noti-security)
  ・遅延: 秒単位
  ・リージョン: SCP許可リージョン(東京、バージニア、オレゴン、大阪)

調査用収集(EventBridge ルール② — Datadog):
  ・対象: 全severity(HIGH/CRITICAL/MEDIUM/LOW)
  ・経路: EventBridge → Datadog Forwarder Lambda → Datadog Log Management
  ・遅延: 秒単位(Lambda即時実行)
  ・リージョン: SCP許可リージョン(東京、バージニア、オレゴン、大阪)

  検知例(HIGH/CRITICAL — Slack即時通知 + Datadog収集):
    ・CryptoCurrency:EC2/BitcoinTool.B — EC2が暗号通貨マイニングに使われている
    ・Backdoor:EC2/C&CActivity.B — EC2がC&Cサーバーと通信している
    ・Trojan:EC2/DNSDataExfiltration — DNS経由のデータ窃取
    ・Execution:Runtime/MaliciousFileExecuted — マルウェアの実行検知
    ・PrivilegeEscalation:Runtime/RuncContainerEscape — コンテナからのエスケープ
    ・Execution:Runtime/ReverseShell — リバースシェルの実行
    ・PrivilegeEscalation:Runtime/ElevationToRoot — root権限への昇格
    ・Policy:IAMUser/RootCredentialUsage — ルートユーザーのAPI呼び出し

  検知例(MEDIUM — Datadog収集のみ、Slack通知なし):
    ・UnauthorizedAccess:EC2/SSHBruteForce — SSHブルートフォース試行(攻撃対象の場合)
    ・Recon:EC2/Portscan — ポートスキャンの検知
    ・UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration — EC2クレデンシャルの外部利用
    ・Impact:EC2/SuspiciousDomainRequest.Reputation — 不審なドメインへのリクエスト

  検知例(LOW — Datadog収集のみ、Slack通知なし):
    ・UnauthorizedAccess:EC2/SSHBruteForce — SSHブルートフォース試行(攻撃元が外部の場合)
    ・Recon:EC2/PortProbeUnprotectedPort — 保護されていないポートへのプローブ

調査・モニタリング(Datadog):
  ・EventBridge → Datadog Forwarder Lambda経由でfindingsをDatadog Log Managementに取り込む
    (通知目的ではない)
  ・用途: 調査連携(Bits AI、MCP)、APM/ログとの相関分析、傾向把握
  ・収集方式: EventBridge → Datadog Forwarder Lambda → Datadog Log Management
    (Slack通知と同じEventBridgeを利用するが、別ルールで全severityを対象とする)

Firehose方式を採用しない理由:
  ・バッチ配信による欠損・重複問題:
    Firehoseは短時間に発生した複数のfindingsを1つのバッチ(records配列)にまとめて配信する
    Datadog側ではPipelineで records.0.data のように特定インデックスしか指定できないため、
    2件目以降(records.1.data 等)はパースされず欠損する
    さらに、同一バッチがレコード数分のログとして重複保存される問題も確認された
  ・base64エンコード問題:
    Firehose HTTP Endpoint宛先ではレコードが自動的にbase64エンコードされるため、
    Datadog Logs Pipelineでのデコード設定が必要になる
    AP1サイトではbase64デコード用のDecoder Processorが利用できない可能性がある

Forwarder Lambdaのメリット:
  ・各findingが個別のログイベントとして送信される(バッチ問題なし)
  ・base64デコード不要(Lambdaが直接JSON処理)
  ・GuardDutyの属性が自動パースされる(Logs Pipeline設定不要)
  ・source, service, host, message, タグが自動設定される

リージョンについて:
  ・EventBridgeはリージョンごとのサービスのため、各リージョンにルール構築が必要
    全サポートリージョン(20以上)に作るのは管理コストが高いため、
    SCP許可リージョン(4リージョン)に限定する
  ・Datadog Forwarder Lambdaもリージョナルサービスのため、
    各リージョンにデプロイが必要(4リージョン分)
  ・結果として:
    SCP許可4リージョン → EventBridge(Slack通知 + Datadog収集)の両方でカバー
    その他リージョン → カバーなし
    (その他リージョンはSCPでリソース作成がブロックされているためリスク低い)

4. Slackチャンネル設計

チャンネル構成

チャンネル用途通知元
#squad-sre-noti-securityHIGH/CRITICALのGuardDuty findings通知(全環境)EventBridge(severity >= 7)→ Amazon Q Developer
・全環境(本番・非本番)を1チャンネルに集約
・severity >= 7(HIGH/CRITICAL)のみ通知
・MEDIUM/LOWはDatadogに全件収集されているため、Slack通知は不要
・通知メッセージのフォーマットカスタマイズ(EventBridge Input Transformer等)は今後のタスクとする

5. fd-security-tooling集約通知の構築

EventBridge設定(fd-security-tooling内、各リージョンに作成)

対象リージョン(SCP許可リージョン):
  ・ap-northeast-1(東京)
  ・us-east-1(バージニア)
  ・us-west-2(オレゴン)
  ・ap-northeast-3(大阪)

各リージョンに以下を作成:
  ・EventBridgeルール①: severity >= 7 → SNS(Slack通知用)
  ・EventBridgeルール②: 全severity → Datadog Forwarder Lambda(調査用)
  ・SNSトピック: GuardDuty findings通知用
  ・Datadog Forwarder Lambda: findingsをDatadog Log Managementに転送
    ※ fd-security-toolingには既存のForwarderがないため新規デプロイが必要
    ※ 既存モジュール(template_modules/common/platform/datadog_lambda_forwarder)を使用

EventBridgeイベントパターン:
  ルール①(Slack通知用 — severity >= 7):
    {
      "source": ["aws.guardduty"],
      "detail-type": ["GuardDuty Finding"],
      "detail": {
        "severity": [{ "numeric": [">=", 7] }]
      }
    }

  ルール②(Datadog収集用 — 全severity):
    {
      "source": ["aws.guardduty"],
      "detail-type": ["GuardDuty Finding"]
    }

Amazon Q Developer:
  ・1つのAmazon Q Developer設定で4リージョン分のSNSトピックを紐付け
  ・通知先: #squad-sre-noti-security

Delegated Adminの仕組み:
  ・組織統合後、fd-security-toolingのEventBridgeに
    全メンバーアカウントのfindingsが自動的に流れる
  ・AssumeRole不要、fd-security-tooling内で完結
  ・新規アカウント追加時も通知設定の追加が不要

Terraform管理

fd-security-tooling(Terraform):
  Slack通知用:
    ・aws_cloudwatch_event_rule — EventBridgeルール①(severity >= 7、4リージョン分)
    ・aws_cloudwatch_event_target — SNSターゲット
    ・aws_sns_topic — 通知用トピック(4リージョン分)
    ・aws_sns_topic_policy — Amazon Q Developer用ポリシー
    ・template_modules/options/chatbot モジュール — Amazon Q Developer(旧Chatbot)設定
      ※ CloudFormation Stack方式(既存の各アカウントと同じ実績ある方式)

  Datadog連携用:
    ・aws_cloudwatch_event_rule — EventBridgeルール②(全severity、4リージョン分)
    ・aws_cloudwatch_event_target — Datadog Forwarder Lambdaターゲット
    ・aws_lambda_permission — EventBridgeからLambda呼び出し権限
    ・aws_sqs_queue — DLQ(配信失敗時のデッドレターキュー、4リージョン分)
    ・Datadog Monitor — DLQメッセージ数のアラート(SQS ApproximateNumberOfMessagesVisible > 0)
    ・template_modules/common/platform/datadog_lambda_forwarder — Forwarder Lambda(4リージョン分)
      ※ CloudFormation Stackでデプロイ(Datadog公式テンプレート)
      ※ Datadog APIキーはSecrets Managerに格納(リージョンごとに作成)

  マルチリージョン対応:
    ・security-toolingのprovider.tfにリージョン別aliasを追加
      - aws.us_east_1(バージニア)
      - aws.us_west_2(オレゴン)
      - aws.ap_northeast_3(大阪)
      - デフォルトprovider(東京)
    ・EventBridge/SNSは各リージョンのproviderで作成
    ・Amazon Q Developer設定は1つで4リージョンのSNSを紐付け

  コードの配置:
    fastdoctor-template/common/security-tooling/guardduty-notification.tf
    fastdoctor-template/common/security-tooling/provider.tf(マルチリージョンalias追加)

6. Datadog GuardDutyインテグレーション

Datadogは通知目的ではなく、以下の調査・分析用途で導入する。

具体的なユースケース:
  1. Bits AIとの連携
     ・自然言語でfindingsを検索・分析
     ・例: 「過去7日間のHIGH severityのfindingsを要約して」

  2. MCP連携
     ・Claude CodeからDatadog経由でfindingsを直接参照
     ・コード修正と脅威分析を同時に実行

  3. APM/ログとの相関分析
     ・findingsとアプリケーションログを時系列で照合
     ・例: EC2のマルウェア検知とアプリケーションエラーログの相関

  4. 傾向分析
     ・finding種別の推移をグラフ化
     ・アカウント・リージョン別の統計

EventBridge通知との使い分け:
  ・即時通知 → EventBridge → SNS → Amazon Q Developer → Slack(秒単位)
  ・調査・分析 → EventBridge → Datadog Forwarder Lambda → Datadog Log Management(秒単位)

収集方式:
  ・EventBridge → Datadog Forwarder Lambda方式でfindingsをログとして取り込む
  ・Forwarder LambdaはDatadog公式が提供するCloudFormationテンプレートでデプロイ
    (各アカウントで既に稼働中の既存モジュールと同じ方式)
  ・Delegated Admin(fd-security-tooling)のEventBridgeには
    全メンバーアカウントのfindingsが自動集約されるため、
    fd-security-toolingにForwarderを配置するだけで全組織のfindingsを収集可能

構成:
  ・fd-security-toolingの各リージョンに以下を作成:
    - EventBridgeルール: source=aws.guardduty(全severity)
      ※ Slack通知用ルール(severity >= 7)とは別のルール
    - EventBridgeターゲット: Datadog Forwarder Lambda
    - aws_lambda_permission: EventBridgeからの呼び出し許可
  ・Datadog Forwarder Lambda:
    - CloudFormation Stackでデプロイ(Datadog公式テンプレート)
    - Datadog APIキーはSecrets Managerに格納
    - Datadogアカウント: FD - 本番のAPIキーを使用
  ・Datadog Forwarder Lambda のバージョン管理:
    - テンプレートURL(latest.yaml)でデプロイ。作成時のバージョンで固定
    - Datadog公式GitHubリリースノートでバージョン管理
    - 通常の運用ではバージョンアップ不要
    - Datadog公式GitHubリリースノートを定期確認し、セキュリティパッチや重要な変更がある場合に更新

  fd-security-toolingへの構築が必要:
    - Datadog Forwarder Lambda(4リージョン分、CloudFormation Stack)
    - Secrets Manager(Datadog APIキー、4リージョン分)
    - EventBridgeルール + ターゲット + Lambda権限(4リージョン分)
    ※ Datadog AWSインテグレーション(datadog-integration-role, datadog_integration_aws)は不要
    - Security Hub導入時にもEventBridgeルールを追加するだけでForwarder経由の収集を拡張可能
    - 各アカウント個別に構築する方式と比較して、fd-security-tooling1箇所で完結する

  エラーハンドリング:
    - EventBridge → Lambda失敗時はデフォルトで最大185回リトライ(24時間)
    - リトライ全失敗時のfinding欠損を防ぐため、DLQ(SQS)を設定する
    - DLQにメッセージが入った場合はDatadog Monitorで通知する
      (SQSメトリクス ApproximateNumberOfMessagesVisible > 0 で検知)
    - DLQに入ったイベントは手動で再処理、またはfd-log-archive S3エクスポートから復旧可能
    ※ 既存の各アカウント個別通知ではDLQ未設定だが、
      集約通知では全アカウントのfindingsが集中するためDLQを設定する

  注意事項:
    - Forwarder Lambdaの同時実行数: Datadogは最低10の予約同時実行数を推奨
    - Forwarder Lambdaはリージョナルサービスのため、各リージョンに個別デプロイが必要

7. Findingsの更新通知

GuardDutyのfindingsは解決(アーカイブ)されない限り、
設定した頻度でEventBridgeにイベントが再送される。

通知頻度の設定:
  ・FIFTEEN_MINUTES(15分ごと)
  ・ONE_HOUR(1時間ごと)← 既存設定
  ・SIX_HOURS(6時間ごと)← デフォルト
  ※ 初回検知は常にリアルタイム。上記は同一findingの更新通知の頻度
  ※ 既存設定のONE_HOURを引き継ぐ。必要に応じてFIFTEEN_MINUTESに短縮可能

対策:
  ・findingを確認したらアーカイブして再通知を止める(手動)
  ・サプレッションルールで既知のfindingsを自動アーカイブ(Delegated Adminから設定)
    例: 特定IPアドレスからのfinding、既知の誤検知パターン
  ・初期は手動アーカイブで運用し、繰り返し発生するものを
    サプレッションルールで自動化する

8. 既存個別通知の移行方針

移行手順:
  1. fd-security-toolingに集約通知を構築(EventBridge + Amazon Q Developer)
  2. Datadogインテグレーションを導入(調査・モニタリング用)
  3. 動作確認: 全アカウントのfindingsが集約通知されることを確認
  4. 並行稼働期間(1〜2週間): 既存個別通知と集約通知の両方で運用
  5. 集約通知に問題がなければ、既存の各アカウント個別通知を削除
     → EventBridgeルール、SNSトピック、Amazon Q Developer設定を各アカウントから削除
     → Terraform管理の場合はコード削除→apply

注意:
  ・developのGuardDuty通知は壊れているため修正不要(集約通知でカバー)
  ・既存通知の削除前に、集約通知で全アカウント分のfindingsが来ていることを必ず確認

移行リスクと対策:
  ・集約通知の設定ミス → 全アカウントの通知停止
    対策: 並行稼働期間(1〜2週間)で既存通知と比較検証
  ・リージョン漏れ → 一部リージョンのfindingsが通知されない
    対策: 4リージョン全てで動作確認を実施
  ・Slackチャンネル誤設定 → 通知が届かない
    対策: テストfindingsで#squad-sre-noti-securityに届くか確認

ロールバック手順:
  集約通知に問題が発覚した場合:
  1. 既存個別通知を維持(並行稼働中は削除しない)
  2. fd-security-toolingの集約通知を修正
  3. 動作確認後、再度移行を実施

動作確認チェックリスト:
  □ 4リージョン全てのEventBridgeルールが作成されている
  □ SNSトピックが4リージョン全てに存在する
  □ Amazon Q Developerに4つのSNSトピックが登録されている
  □ Slack #squad-sre-noti-securityに通知が届く
  □ テストfindingsで各リージョンから1件ずつ確認
  □ 全アカウント(production, staging, develop, infra-dev等)のfindingsが届く
  □ Datadogにfindingsが個別のログとして収集されている
  □ Datadogでseverity, accountId, region等の属性で検索・フィルタできる

9. 適用手順

Step 1: fd-security-toolingにDatadog Forwarder Lambdaをデプロイ
  → Datadog APIキーをSecrets Managerに格納(4リージョン分)
  → Forwarder LambdaをCloudFormation Stackでデプロイ(4リージョン分)
  → Terraform apply

Step 2: fd-security-toolingにEventBridge集約通知を構築
  → Terraform apply(4リージョン分のEventBridge + SNS + Amazon Q Developer)
  → Slack通知用: EventBridge(severity >= 7)→ SNS → Amazon Q Developer
  → Datadog用: EventBridge(全severity)→ Datadog Forwarder Lambda

Step 3: 動作確認
  → サンプルfindingsを生成して集約通知が来ることを確認
  → Datadogでもfindingsが個別のログとして収集されていることを確認
  → severity, accountId, region等の属性で検索・フィルタできることを確認

Step 4: 並行稼働(1〜2週間)
  → 既存個別通知と集約通知の両方で運用

Step 5: 既存個別通知の削除
  → 各アカウントのEventBridge/SNS/Amazon Q Developer設定を削除

10. 今後のタスク

優先度タスク概要時期
通知メッセージのフォーマット設計アカウント名、リソース、対応手順リンク等を見やすく整形集約通知構築後1ヶ月以内
サプレッションルール運用しながら誤検知パターンを特定し自動アーカイブ設定並行稼働期間中に開始
対応フロー定義通知受信後の対応手順、エスカレーション先の定義集約通知構築後2ヶ月以内
オンコール連携severity CRITICAL時のPagerDuty等によるオンコール呼び出し全体で検討
セキュリティ通知の全体設計Security Hub導入時にGuardDuty/Inspector/Config等の通知基盤をあらためて統合設計Security Hub導入時

参考ドキュメント