初めまして、社会人2年目のNishiokaです。
学生時代は化学畑に浸かっており、入社時はファイルとフォルダの違いもわかりませんでしたが、入社後クラウドの世界に魅せられ、周りの環境に恵まれた結果、最近AWS全冠を達成しました。
最近はよりAWS環境を触ることで知識→技術への昇華を目指しています。
会社で先輩社員がQittaをつかって情報発信をしており、それに触発され私も自身の成長日記として本ツールを利用しようかと思い、興味半分で登録してみました。細々と続けていけたらと思います。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
では、本題ですが今回はAWSマネジメントコンソールにログインした際、Amazon SNSに登録しているメールアドレス宛に通知を飛ばすシステムを作成しようと思います。
本システムを構築しようとしたきっかけは先ほどの先輩社員にユーザー管理に関するご相談をさせていただいたことがきっかけです。
私の中でやり方としては、
1.CloudTrail→EventBridge
2.CloudWatchのメトリクス→Lambda
の2択だったのですが、調べていくうちに「User Notification」をつかった3つ目の択が選択肢としてあがりました。
今回の記事では失敗例として、1.CloudTrail→EventBridgeをご紹介します。
学びのあった部分も多くあるので、是非ご覧にいただければと思います。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
1.CloudTrail→EventBridge(作成手順)
①Amazon SNSのトピックの作成
今回は「AdministratorAccess」権限を持つユーザーでログインした際に通知を作るので、このようなトピック名で設定する。
②サブスクリプションの作成
サブスクリプションとは、トピックに発行されたメッセージの受信者の登録のことです。
トピックARNに先ほど作成した「Administrator-login」のARNを入力し、プロトコルは今回はEメールを設定。
今回はデットレターキューの設定しないので、3回配信に失敗した場合は、メッセージが破棄されます。
サブスクリプションの設定が完了したあとに、通知先メールアドレスに対して、確認のメールが届きます。
以上でSNSの設定は終了です。
③EventBrigdeルールの設定
イベントバスは「default」、ルールタイプは「イベントパターンを持つルール」を選択します。
今回はカスタムパターンで作成するので、イベントソースを「その他」、イベントパターンに下記のJSONを記入しました。
{
"detail-type": [
"AWS Console Sign In via CloudTrail"
]
}
※懸念点
カスタムパターンではなく、パターンフォームで記述しようとした際、CloudTrailから選べるイベントタイプの中に、ConsoleLoginイベントのみをピックアップするものはありませんでした。
以上でEventBridgeの設定は終了です。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
私の頭の中ででは、これでマネジメントコンソールへログインした際に、CloudTrailの「ConsoleLogin」イベントがトリガーとして、メールが飛ぶはずだったのですが、結果として失敗でした。
その理由としましては、2021年11月にあったCloudTrailの仕様変更が原因のようです。
それまではログインのイベントはus-east-1リージョンで証跡をとられていましたが、下記の通り仕様の変更がありました。
https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/cloudtrail-event-reference-aws-console-sign-in-events.html
現在はIAMユーザーによるリージョンエンドポイントを介したログイン時は、不特定のリージョンでログイン処理が行われ、処理が実施されたリージョンにて証跡が記録されるようになったことで、EventBridgeでのマネジメントコンソールログインのイベント検出は難しくなりました。
私の場合はus-east-2でログイン処理が行われるようです。
悪意を持った誰かがログインしようとしたイベントなどはどこのリージョンに記録されるか知り得ることはできないため、この方法ではAWSのすべてのリージョンにEventBridgeのルールを記載する必要がありますが、それはスマートではありません。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
P.S
ちなみに余談ですが、クエリ文字列で「region」パラメータを付与することで、サインインするリージョンを明示的に指定できるようです。
https://<アカウントID>.signin.aws.amazon.com/console?region=<リージョンコード>
下図の通り、確かにリージョンの指定ができているようです。
デフォルトでマネジメントコンソールログイン画面にアクセスした際のURL
クエリ文字列で指定し、マネジメントコンソールログイン画面にアクセス際のURL
ConsoleLoginイベントにもしっかりとログが残っていました。
ただ、なぜかログイン通知メールは届きませんでした、懸念点の部分か、Jsonが間違っているかの2択かと思われますが、どちらにしろEventBrdgeの検知による実装は難しいことがわかったので、これ以上の原因追及はやめときます。わかる人がいたら教えてほしいです。
ちなみに下記のJsonでも試してみましたが、メール通知は失敗しました。
{
"detail-type": ["ConsoleLogin via CloudTrail"]
}
今回は失敗例でしたが、次回はUser Notificationでの実装を試みます。