今回設定すること
今回はSNSとEventBridgeを使用し、SecurityHubを重要度で絞って通知する(Critical,High.Lowの中でHigh,Criticalのみ通知する、みたいなことです)ということを設定していきます。
まず、SNSはどのような状況になっているのか確認します。
ControlTowerを設定した際、デフォルトでSNSトピックが3つ作成されています。
(公式サイト:Compliance notifications by SNS in the audit account https://docs.aws.amazon.com/ja_jp/controltower/latest/userguide/receive-notifications.html)
①aws-controltower-AggregateSecurityNotifications
>このトピックは、サポートされている各 AWS リージョンに存在します。リージョン固有のトピックからコンプライアンス変更通知を受け取ります。さらに、ホームリージョンでは、ドリフト通知も受信します。(公式サイトより)
(トリガーは、aws-controltower-SecurityNotifications)
(ドリフト通知:公式サイトhttps://docs.aws.amazon.com/ja_jp/controltower/latest/userguide/governance-drift.html)
②aws-controltower-AllConfigNotifications
>AWS Config からコンプライアンス、コンプライアンス違反、および変更に関する通知を受け取ります。また、ログファイルの配信時に AWS CloudTrail から通知を受け取ります。(公式サイトより)
③aws-controltower-SecurityNotifications
>このトピックは、サポートされている AWS リージョンごとに存在します。そのリージョンの AWS Config からコンプライアンス、コンプライアンス違反、および変更の通知を受け取ります。すべての受信通知を aws-controltower-AggregateSecurityNotifications に転送します。(公式サイトより)
このトピックのサブスクライブ先として設定されているlambdaでは、受け取ったJSONを整形する役割を担っており、整形後①に通知します。
EventBridgeではこのトピックに通知をするよう設定していきます。
上記ではよく分からん・・・という場合はぜひ以下記事のSNSトピックの部分を見てみてください。
https://qiita.com/tonkatsu_oishi/items/82811c94ebdc6fe509f2#sns%E3%83%88%E3%83%94%E3%83%83%E3%82%AF
とても参考になりました。
イラスト付きで解説してくださっています。
【ポイント】
ここまでの流れを見て、「いやEventBridgeってコントロールで制限されてなかったっけ?」と思われた方もいらっしゃるのではないでしょうか。実は管理アカウントからAuditアカウントのControlTowerExecutionにスイッチロールしてEventBridgeを作成した場合、ControlTowerの予防コントロールによる変更の防止や検出コントロールによる変更の検出も行われないのです。(サポートより回答)
そのため、少し強引ですが設定自体は可能です。
サポートに問い合わせた際は、上記方法以外にLambda関数をサブスクライブしてその関数の処理内でフィルタリングする方法も案内していただきました。
素直にEventBridgeルールでフィルタリングする場合、ControlTowerによって作成された「AWSControlTowerManagedRule」や「aws-controltower-ConfigComplianceChangeEventRule」等の編集はSCPによって防止されるそうです。
以下サイトを参考にさせていただき、作成を行いました。
https://dev.classmethod.jp/articles/workaround-to-execute-actions-denied-by-ct-scp/
まずはSNSの設定
はじめにSNS通知の設定をしていきます。
Auditアカウントにログインし、Amazon SNSのサービスページに遷移します。
遷移後、左のサイドバーから【トピック】を押下すると以下のページが表示されます。
ここではControlTower作成時に自動作成された、3つのトピックを確認することができます。
一番上のトピック(aws-controltower-AggregateSecurityNotifications)を押下すると、以下画面になります。
サブスクリプションを作成(=作成したトピックをどこに届けるか、というエンドポイントを設定)していきます。右下の【サブスクリプションを作成】を押下します。
トピックARNは入力されているので、プロトコルを選択していきます。今回はEメールとし、何か通知される際はメールに飛ぶように設定します。
エンドポイントは記載の通り、通知先のメールアドレスを指定します。
その他オプションは設定せず、下にスクロールし【サブスクリプションの作成】を押下します。
すると以下画面になり、サブスクリプションが作成されました!
先ほどのaws-controltower-AggregateSecurityNotificationsのトピックページに戻ると、サブスクリプション欄に今追加したサブスクライブ先が追加されています。
今回はEメールを設定していますが、まだ認証をしていないので「保留中の確認」となっています。
設定したメールアドレスのメールBOXを確認しに行くと、このようなメールが来ています。
URLを押下すると、以下のような画面に遷移し、認証が完了します。
先ほどのサブスクリプション項目が「保留中の確認」→「確認済み」となっていることが確認できます。
SNSはリージョンごとにサブスクライブ先を設定する必要があり、また、認証もリージョンごとに行う必要があります。(今回の場合4リージョン設定しているので、4リージョンで設定したあと認証メールは4通来る、という感じです。)(認証メール内にリージョン名が書かれているので、そこで見分けが可能です)
結構ぽちぽち仕事になります。
EventBridgeを設定する
先ほど引用させていただいたクラスメソッドさんの記事と併せて作成していきます。
まずは管理アカウントにログインし、ロールの切り替えを押下します。
スイッチロールの画面に移るので、スイッチしたいアカウントID(今回はAudit)とAWSControlTowerExecutionロールを設定し、【スイッチロール】を押下します。
右上に設定したロールとアカウントIDが表示されることを確認して、スイッチロールは完了です。
ではEventBridgeのサービスページに移動し、設定していきます。
【ルールを作成】を押下します。
ルールの詳細を定義する画面に遷移します。
名前、説明は任意のものを設定し、イベントパスはデフォルト、ルールタイプは【イベントパターンを持つルール】を設定します。
設定したら、【次へ】を押下します。
イベントパターンを構築ページに移動するため、【その他】を押下します。
サンプルオプションは【独自のサンプルイベント】を押下します。
サンプルイベントは空で先に進みます。
作成のメソッドでは、【カスタムパターン(JSONエディタ)】を押下します。
イベントパターンの部分でHIGH,CRITICALのみ通知するようフィルターをかけています。
記載が終了したら、【次へ】を押下します。
次にターゲットを選択します。
ターゲットタイプを【AWSのサービス】、ターゲットを選択では【SNSトピック】、トピックは【aws-controltower-SecurityNotifications】を選択し、【次へ】を押下します。追加設定は特に行いません。
次にタグ設定画面に遷移しますが、ここは何も設定せず【次へ】を押下します。
最後に確認を行います。ミスがないことを確認して、【ルールの作成】を押下します。
ルールの一覧画面に遷移し、画面上部にルールを正常に作成した旨が表示されていたら成功です。
設定したルール名を押下し、中身を確認してみます。
設定どおりになっていることを確認したら、通知設定は完了です!
まさか抜け道があるとは・・・という気持ちですが、ベストプラクティスでないことは自己責任で行ってくださいね。