GuardDutyでルートアカウントの利用を検知する

AWSアカウントを作成すると、ユーザー名がメールアドレスのルートアカウントが作成されます。ルートアカウントは権限が強力なので、普段は利用せずに適切な権限のIAMユーザーの利用することが推奨されます。GuardDutyにはPolicy:IAMUser/RootCredentialUsageというイベントがあり、AWS API がルート認証情報を使用して呼び出されたことを検知できます。本当に呼び出せるのか、呼び出された場合にどのような調査ができるのかご紹介します。本検証はプライベートで利用しているAWSアカウントを利用しました。
2019.08.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWSアカウントを作成すると、ユーザー名がメールアドレスのルートアカウントが作成されます。ルートアカウントは権限が強力なので、普段は利用せずに適切な権限のIAMユーザーの利用することが推奨されます。GuardDutyにはPolicy:IAMUser/RootCredentialUsageというイベントがあり、AWS API がルート認証情報を使用して呼び出されたことを検知できます。本当に呼び出せるのか、呼び出された場合にどのような調査ができるのかご紹介します。本検証はプライベートで利用しているAWSアカウントを利用しました。

ルートアカウントでAWSコンソールに接続する

GuardDutyを有効にし、ルートアカウントでAWSコンソールに接続します。GuardDutyコンソールをみると、「Policy:IAMUser/RootCredentialUsage」が作成されたことがわかります。

イベントの詳細のActorから、IPアドレスを確認できます。東京オフィスからの接続のため、IPアドレスの国はJapanと判定されています。

GuardDutyで検知すると、CloudWatch Eventsが発火するため、SNSで通知したり、LambdaでSlackに通知できます。執筆時点でベータ版ですが、AWS Chatbotを使えば、Lambdaを作らなくてもSlackに通知できるようです。

CloudTrailログを確認する

ルートアカウントの利用が認められた場合、どのような操作が行われたのか確認したくなるかと思います。CloudTrailログをS3に出力している場合は、Athenaで解析できます。まずは、Athenaのテーブルを作成します。CloudTrailコンソール>イベント履歴>"Amazon Athena で高度なクエリを実行します"を選択します。

CloudTrailログを保存しているS3バケットを指定すると、テーブルが作成されます。

Athenaコンソールに移動し、以下のクエリを実行します。TableNameは作成されたテーブル名に置き換えてください。

SELECT *
FROM TableName
WHERE 
    userIdentity.type = 'Root' 
ORDER BY eventtime DESC

クエリ結果を確認します。Rootユーザーで、AWS ConfigやEC2を操作していることがわかります。

余談ですが、クエリを作成する際はCloudTrail レコードの内容CloudTrail userIdentity エレメントが参考になります。

まとめ

GuardDutyを有効化しておけば、ルートアカウントが利用された際に気が付けます。また、CloudTrailログをS3に出力しておけば、GuardDutyで検知した後にAthenaで調査できます。GuardDutyとCLoudTrailのログ出力を有効にし、ルートアカウントが不正に使われていないか確認しましょう。

参考