はじめに
AWSマネジメントコンソールへユーザがサインインした際、ログインに関する情報をメールで通知する方法を紹介します。
構築時にいくつかの記事等を参考にしましたが、要件にアンマッチであったため試行錯誤した結果も併せて紹介します。
なお、構築当時はAWS User Notificationsサービスが無かったため、構築案には含まれていません。
AWS User Notificationsを使用したログイン通知については、別記事にて紹介させていただきます。(ただ、不採用案①と同様の問題がある認識です。)
実現したいこと
・IAMユーザー/ルートユーザーがAWSコンソールにログインした際、指定した宛先へメール通知したい
⇨メール通知に含めたい内容は以下
- ログイン時刻
- ログインユーザ
- ログインイベントに関するログ
◎採用案
いくつかの方法を試しましたが、最終的に構築した方法を最初に紹介します。
構成図
詳細
-
AWS CloudTrail:
- AWSコンソールログインログの収集 (全リージョン有効化)
-
Amazon CloudWatch:
- 各リージョンのログインログをAmazon CloudWatch Logs ロググループのログストリームに集約
- Amazon CloudWatch Logsサブスクリプションフィルターにより、Amazon CloudWatch Logsに出力されたログをLambdaに転送
-
AWS Lambda:
- ログを使用したメッセージを成形
- Amazon SNSへメッセージを連携
-
Amazon SNS:
- メッセージを対象者に配信
※具体的な実装方法については別記事にて紹介します。近日中にリンク追記予定です。
×不採用案①
構成図
詳細
-
AWS CloudTrail:
- AWSコンソールログインログの収集
-
Amazon EventBridge:
- ログインログを検出
- ログ内容をAmazon SNSへ連携
-
Amazon SNS:
- メッセージを対象者に配信
問題点:全てのログインログを検出できない
- 原因①:AWSコンソールへのログインイベントは不特定のリージョンで実施される。
(2021年11月のCloudTrail仕様変更による。詳細は以下公式ドキュメントを参照ください。)
⇨ログは不特定のリージョンに記録される。
- 原因②:EventBridgeは同一リージョン内のログ検出しか対応していない。
⇨不特定のリージョンに記録されるログを検知できない。
※不採用①の設定を全リージョンに構築することで実現可能ではありますが、実装負荷が高い+新規リージョン追加の度に追加実装が必要となります。
×不採用案②
構成図
詳細
-
AWS CloudTrail:
- AWSコンソールログインログの収集 (全リージョン有効化)
-
Amazon CloudWatch:
- 各リージョンのログインログをAmazon CloudWatch Logsロググループのログストリームに集約
- Amazon CloudWatch Logsメトリクスフィルターによりログを検知してAmazon SNSへ連携
-
Amazon SNS:
- メッセージを対象者に配信
問題点:即時通知できない
- 原因:Amazon CloudWatch Logsメトリクスフィルターを使用した場合は一定期間の集計結果に基づく通知となるため、即時通知できない。
まとめ・学び
- 一部のイベントは不特定リージョンで実行されるため、ログも不特定リージョンに記録される。
- サービスは日々アップデートされるため、公式ドキュメントにて最新情報のキャッチアップが必要。
- 検証は念入りに複数パターンで実施する(不採用案①でも運が悪ければ不具合に気づかない可能性がある...)
おわりに
- 具体的な実装方法についても紹介予定のため、興味があれば是非ご覧ください。
- 他にも不採用となった案があるため、機会があれば追記や別記事にて紹介したいと思います。
- 本記事の内容について誤り等あればご意見ください。