Amazon EventBridgeで実現するマルチアカウントイベントの集約管理

記事タイトルとURLをコピーする

カスタマーサクセス部の山﨑です。

EventBridgeを用いてマルチアカウントでイベントの集約管理を行う方法について検証してみました

今回の構成

今回の構成

  • アカウントAのSecurity Hubのイベントを、アカウントAのEventBridgeで受信する
  • アカウントAのEventBridgeから、イベント集約用アカウントのEventBridgeへ受信したイベントを転送する
  • イベント集約用アカウントのEventBridgeのルールでターゲットをSNSに指定する
  • SNSではEメールをサブスクリプションとして設定し、イベント内容を整形してユーザーへメール送信する

EventBridgeの概要については以下のブログをご覧ください。

blog.serverworks.co.jp

いざ実装

イベント集約用アカウント

1. EventBridgeでカスタムイベントバスを作成する

「イベント集約用アカウントで取り扱うイベントを受信するイベントバス」と「他アカウントから転送されてきたイベントを取り扱うイベントバス」をそれぞれ分けて管理できるようにカスタムイベントバスを作成します。今回は「receiver-bus」という命名で作成しました。

作成時に表示される「リソースベースのポリシー」には転送元AWSアカウント(アカウントA)からのイベント送信を許可するポリシーを定義します。

{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "AllowAccountToPutEvents",
    "Effect": "Allow",
    "Principal": {
      "AWS": "arn:aws:iam::[送信元のAWSアカウントID]:root"
    },
    "Action": "events:PutEvents",
    "Resource": "arn:aws:events:ap-northeast-1:[イベント集約用AWSアカウントID]:event-bus/receiver-bus"
  }]
}

2. カスタムイベントバスでルールを作成する

イベントバスに先ほど作成した「receiver-bus」を指定して、ルールを作成します。

▼イベントパターン

イベントパターンとして今回はSecurity Hubの検出結果のうち、GuardDutyに関する検出結果のみを抽出します。

{
  "source": ["aws.securityhub"],
  "detail-type": ["Security Hub Findings - Imported"],
  "detail": {
    "findings": {
      "Severity": {
        "Label": ["CRITICAL", "HIGH"]
      },
      "RecordState": ["ACTIVE"],
      "Workflow": {
        "Status": ["NEW", "NOTIFIED"]
      },
      "ProductFields": {
        "aws/securityhub/ProductName": ["GuardDuty"]
      }
    }
  }
}
▼ターゲット

SNSトピックには予めサブスクリプションとしてEメールを認証しておいた上で、ターゲットはSNSトピックを選択します。

また、追加設定で「入力トランスフォーマー」を指定します。入力トランスフォーマーについては以下のブログも合わせてご覧ください

blog.serverworks.co.jp

▼入力パス

入力パスに関しては以下の設定をします。

{
  "Account": "$.account",
  "Description": "$.detail.findings[0].Description",
  "Id": "$.detail.findings[0].Id",
  "Label": "$.detail.findings[0].Severity.Label",
  "Service": "$.detail.findings[0].ProductFields.aws/securityhub/ProductName",
  "Time": "$.time"
}
▼入力テンプレート

入力テンプレートに関しては以下の設定をします。

"Security Hubが重要度 <Label> の異常を検知しました"
"Account ID : <Account> "
"発生時間 : <Time> "
"検知製品 : <Service>"
"検出内容 : <Description> "
"検索ID : <Id> "
"Security Hubのコンソール画面の左メニュータグより「検出結果」を選択します。検索ウィンドウで「ID」を選択し、検索IDの値を入力して検索してください。"

アカウントA

1. defaultイベントバスでルールを作成する

AWSアカウント上でAWS サービスがイベントを発行すると、常にアカウントのdefaultイベントバスにイベントが送信されるため、アカウントAはイベント集約用アカウントとは異なり、defaultイベントバスでルールを作成します。

▼イベントパターン

イベントパターンとして今回はSecurity Hubの検出結果を抽出します。

{
  "source": ["aws.securityhub"],
  "detail-type": ["Security Hub Findings - Imported"],
  "detail": {
    "findings": {
      "Severity": {
        "Label": ["CRITICAL", "HIGH"]
      }
    }
  }
}
▼ターゲット

以下のキャプチャ画像のように設定を行ないます。ターゲットとしてのイベントバスには「集約用AWSアカウントで作成したカスタムイベントバスのARN」を入力します。

通知内容の確認

アカウントA(送信側)のGuardDutyでサンプルイベントを生成すると、無事にメール通知がやってきました!

まとめ

ということで、今回はEventBridgeを用いてマルチアカウントでイベントの集約管理を行う方法について検証してみました。マルチアカウント環境で、イベント集約用アカウントを作ったりする時は便利そうです。

山﨑 翔平 (Shohei Yamasaki) 記事一覧はコチラ

2019/12〜2023/2までクラウドインテグレーション部でお客様のAWS導入支援を行っていました。現在はIE(インターナルエデュケーション)課にて採用周りのお手伝いや新卒/中途オンボーディングの業務をしています。2023 Japan AWS Top Engineers/2023 Japan AWS Ambassadors