AWS Identity and Access Management (IAM) のベストプラクティスでは、AWSリソースにアクセスする際にはルートの資格情報を使用するのではなく、IAMユーザーまたはロールを使用することを推奨しています。このベストプラクティスに従う場合、どのようにルートアクティビティを監視し、ルートアクティビティが発生した場合どのようなアクションを取るのでしょうか?AWS CloudTrailとAmazon CloudWatchをご利用頂くことで対応することができます。このブログ記事では、ルートのアクセスキーを使用したAWSサービスAPIの呼び出しをCloudTrailとCloudWatchを使い検知・通知する設定方法についてご紹介します。
CloudTrailはサポートされているリージョンで多くのサービスのAPIアクティビティを記録するように設計されています。CloudWatchとの連携も簡単に実装できます。またAmazon Simple Notification Services (SNS)と連携も可能です。これらの3つのサービスを組み合わせることで、CloudTrailがルートアクセスキーを使ったアクティビティを検出すると、SNSを使い電子メールを送信しますように設定することができます。次の図は、この手順の設定方法になります。
最初のステップは、CloudTrailのログをCloudWatchに送信できるよう許可します。CloudTrailのコンソールから設定することができます。このステップでは、CloudTrailからログを受信するCloudWatch Logsのロググループを作成または選択します。
ステップ2〜4では、CloudWatchのコンソールからrootアカウントの使用状況を検出するフィルタを作成し、アラームをあげる閾値パラメータを設定、そしてアラーム通知を受信する電子メールアドレスを入力します。
ステップ5では、ルートでAWSアクションを実行することにより、アラームをテストします(例えば、Amazon EC2コンソールからのインスタンス起動)。そしてステップ6ではCloudTrailコンソールに戻り、APIのアクティビティ履歴機能を使いイベントを検索を行います。実際は、是正措置をとるか、さらに調査するためにこの情報を使用します。
まず初めに
今回は利用するリージョンでCloudTrailが有効(= "created a trail") であることを前提としています。手順に関しましては、CloudTrailのドキュメント(Creating a Trail)を参照してください。
1.CloudTrail-CloudWatch Logs連携の有効化
CloudTrail-CloudWatch連携を有効にするには、CloudTrailコンソールにアクセスし設定ページに移動します。
CloudWatch Logs(オプション)ボックスから、[設定]をクリックします。
[新規または既存のロググループ]に、CloudTrailからAPIアクティビティ のログファイルを受信するCloudWatch Logs ロググループの名前を入力します。
次のページで、CloudWatch Logs ロググループへのアクセス権をCloudTraiに与えるために[許可]をクリックします。
これでCloudTrail-CloudWatch Logsの連携手順は完了です。create-trail CLIコマンド、CreateTrailアクションを呼び出すことで、連携を有効にすることもできます。
2.メトリックフィルターの作成
CloudTrailにCloudWatch Logsへのアクセス許可を与えたので、次にCloudWatchコンソールからメトリックスフィルタを作成し、監視する条件を定義します。今回の場合は、フィルターを使いルートの直接の使用を検出します。
1.CloudWatchコンソールを開きます。
2.ナビゲーションウィンドウで、[ログ]をクリックします。
3.ロググループのリストから、CloudTrailログイベント用に作成したロググループのチェックボックスを選択します。
4.[メトリックスフィルタの作成]をクリックします。
5.ログメトリックフィルタの画面を定義するには、フィルタのパターンをクリックし次のように入力します。
{ $.userIdentity.type = "Root"&& $.userIdentity.invokedBy NOT EXISTS }
6.正確にフィルタを入力し、[メトリックスの割り当て]をクリックします。
3.メトリックの設定
次に、フィルタに名前を付け、メトリックを割り当てます。
1.[メトリックスフィルタの作成とメトリックスの割り当て]のスクリーン中、[フィルタの名前]にRootAccountUsageと入力します。
2.メトリックスの詳細から、[メトリック名前空間]にCloudTrailMetricsと入力します。
3.[メトリック名]には、RootAccountUsageCountと入力します。
4.[メトリック値]をクリックし、1を入力します。
注意:メトリック値が表示されない場合は、はじめに[メトリックスの詳細設定の表示]をクリックします。
5.設定が終了しましたら、[フィルタの作成]をクリックします。
4.アラームの作成
アラームが発火されるよう、アラームの閾値を設定しSNS通知が送信されるメールアドレスを登録します。
1.<ロググループ名>ページのフィルタで、フィルターの名前の隣の[アラームの作成]をクリックします。
2.アラームの作成ページから、以下のスクリーンショットに示す番号のフィールドに値を設定します。
注釈番号 | 値 |
---|---|
1 | Root Account Usage |
2 | >=1 |
3 | 1 |
4 | 5 分間 |
5 | 合計 |
6 | 選択した通知のリストボックス中の、[新しいリスト]をクリックします。電子メールのリストボックスが表示されますので、リストの一意のトピック名を入力します。 |
7 | メールリストボックスに、通知を受信したい電子メールアドレスを入力します。 (このアラームの作成確認ために、このアドレスにメールが送信されます。) |
要件に合うように値を変更できますが、5分以上という期間を考慮し、合計値を使用するのがいいと思います。もちろん要件に応じ、RootAccountUsageCountを1よりも大きくなるよう、2などに変更も可能です。
3.設定が終了しましたら、[アラームの設定]をクリックし、メールアドレスの確認を行います。
4.メールを受信し、[Confirm Subscription]をクリックします。確認のダイアログでは、緑矢印がメールアドレスの横に表示されます。これで設定終了のため、ダイアログを閉じます。
これで通知を受信する準備が終了し、アラームをテストできます。
5.アラームのテストとSNS通知の受信
アラームをテストするには、ルートアカウントでいくつかのアクティビティを実行します。私の場合は、Amazon EC2インスタンスを開始すると、以下の電子メールを受け取りました。
6.イベントの検索とアクション
通知から、私のルートアカウントのアクセスキーが米国東部(ノースバージニア州)リージョン(us-east-1)で使用されたことがわかります。イベントの詳細情報を取得するために、CloudTrail APIの履歴機能を使用します。
CloudTrailコンソールから、イベントが発生したリージョンに移動すると、下記スクリーンショットに示されているものを確認できます。
SNS通知を受信する数分前に、EC2のRunInstancesを呼び出すために私のrootアカウントキーが使用されたことが見て取れます。またそのイベントを展開することで、より多くのイベントを取得することができます。
CloudTrailのログから発信者のIPアドレスとアクセスキー(スクリーンショットではマスク)を確認でき、会社でのトラブル·チケットを切ることにより非アクティブ化、またはルートアクセス用のアクセスキーを削除することで潜在的行動に繋げることができます。
またAWS CLIおよびCloudTrail APIを使用しCloudTrail APIの活動履歴機能にアクセスすることができます。詳細については、Viewing CloudTrail Events with the AWS CLI and the CloudTrail API ReferenceとCloudTrail API Referenceをご確認ください。後者については、LookupEvents APIから始めることをお勧めします。
その他の情報
こちらにもアクセスキーを管理するため貴重な情報がいくつかあります:
より多くのメトリックフィルタの設定にご興味がある方は、Creating CloudWatch Alarms for CloudTrail Events: Examples.をご参照下さい。
また、一般的なセキュリティシナリオを簡単にアラーム設定するには、ダウンロード可能なCloudFormationテンプレートがご利用頂けます。こちらをご確認下さい。
フィードバックのお願い
CloudTrailチームは皆さんが監視したい特定のAPIおよび、APIアクティビティのご意見をお待ちしております。まだ文書化されていないフィルタ、アラーム設定がありましたら、CloudTrailフォーラムからご意見を聞かせ頂ければと思います。
-Tim (翻訳:酒徳 知明)