AWSマネジードサービスだけを使ってAWSコンソールのログインアラートを実装しよう
はじめに
西藤です。
AWSを利用する際にはAWSアカウントを開設して、コンソールにログインすることでAWS各サービスを利用できます。このブログをご覧になっている方も、そのようにしてなんらかの形でAWSに触れている方も多くいると思います。
さて、その際にはアカウントのセキュリティ対策をどのようにされていますか?
もし、セキュリティ対策を怠るとAWSアカウントに不正にアクセス、過剰なリソースを作成・使用されて、後になって高額なAWS利用料の請求が来るという事態になりかねません。
対策方法の代表的な例では
- 権限が強いアカウントのrootユーザーは日常的な操作に使わない
- コンソールにログインするユーザーにはMFAを設定する
- CloudTrailを有効化しておき、不正なアクティビティを検出できるようにする
などがありますが、今回は3つ目のCloudTrailを利用しつつ
- コンソールログインが行われたらそのタイミングで通知をする
という仕組みを簡易的に実装する方法をご紹介いたします。
- AWSの各サービスへの理解はあるが設定を行うまでの余裕がない(手っ取り早く設定したい)
という方へ、プログラム開発なしで「ログインが行われた時には必ず通知が来る。仮に不正ログインされたとしてもすぐに気がつける」という安心を得られるためのレシピ紹介としてご参考にいただければと思います。
構成概略
今回構成する内容としては次のようなサービス構成です。
前提としては以下の設定があらかじめ必要です。
- AWS CloudTrailの有効化
これによりAWSアカウント内における各APIの呼び出しを検出できるようにします。
- Amazon SNSの通知先登録
これによりマネジメントコンソールへのログインが検出された時にメール通知を送れるようになります。
通知を受け取りたいメールアドレスを追加したトピックを作成しておいてください。
CloudWatch Eventsでの設定
以上の設定を行った上で、今回のポイントとなるCloudWatch Eventsでの設定を見ていきます。
イベントソース
ここでは「どのイベントが検出されたら後続のアクションを実施するのか」を選択しています。
サービス名:「AWSコンソールのサインイン」
イベントタイプ:「サインインイベント」
という選択をすることで、AWSコンソールにサインインしたのを起点に後述するAmazon SNSを使った通知を呼び出せます。
ターゲット
次に、「イベントソース」でイベントが検出されたら「何を対象にどのようなアクションを実施するのか」を決めていきます。
今回は、Amazon SNSを介してメール通知を行いたいので、対象となるAWSリソースとして「SNSトピック」を選択
そして「トピック」としてはあらかじめAmazon SNSで通知をしたいメールアドレスが登録されているものを選択します。
そして、Amazon SNSでメールを飛ばすために文言を整形したいので、「入力の設定」欄に「インプットトランスフォーマー」を選択します。
入力欄が2つありますが、前者が「検出されたイベントの値を使えるよう取得」するための欄で、後者が「取得した値を用いて通知したいメッセージ文言の内容」つまりメール文面そのものを形成する欄です。
内容としては以下の通り、コピーしてご利用ください。
{"detailType":"$.detail-type","responseElements":"$.detail.responseElements","sourceIPAddress":"$.detail.sourceIPAddress","userArn":"$.detail.userIdentity.arn","userAgent":"$.detail.userAgent","id":"$.id","time":"$.time","userType":"$.detail.userIdentity.type","additionalEventData":"$.detail.additionalEventData"}
"AWSコンソールのサインインイベントが発生しました。 DetailType:<detailType> ID:<id> Time:<time > User-type:<userType> User-arn:<userArn> sourceIPAddress:<sourceIPAddress> userAgent:<userAgent> responseElements:<responseElements> additionalEventData:<additionalEventData> "
以上の設定でCloudWatch Eventルールを作成します。
実施結果
では、以上の設定を行った上でAWSマネジメントコンソールにログインしたらどうなるでしょうか?
ログインを行った直後に届いたメールが次のような形です。
このうちの一部をピックアップすると
Time
→ログインが行われた時刻User
→どのユーザーでサインインが行われたのかsourceIPAddress
→どのIPアドレスからサインインが行われたのか
などを知ることができます。
コンソール画面を開いたらほぼリアルタイムにメールが届くので「ちゃんと検出しているな」ということが分かりますし、もしコンソール画面を開いておらず覚えのないタイミングにメールが来た場合は該当のユーザーの無効化など速やかな対応をとることができます。
(私の場合、携帯電話を含む3つのメールアドレスを登録しているので、どれかいずれかのメールサービスにトラブルがあっても、他で受け取れる体制をとっています。)
まとめ
以上、CloudTrailとCloudWatch Eventsルール、そしてAmazon SNSを活用したAWSコンソールのログイン通知の実装でした。
メール本文の体裁は改善の余地があるかと思いますが、ニーズに合わせて修正しながら、AWSのマネージドサービスだけでさくっと実装できるログインアラートとして参考になれば幸いです。