アクセスキーを悪用した AWS マネジメントコンソールへの不正アクセスの脅威とその対策についてまとめてみた

アクセスキーを悪用した AWS マネジメントコンソールへの不正アクセスの脅威とその対策についてまとめてみた

Clock Icon2025.03.04

こんにちは。テクニカルサポートチームのShiinaです。

はじめに

最近、永続的な AWS アクセスキーを悪用した新たな脅威が確認されています。
一時的なセキュリティ認証情報を生成し、AWS マネジメントコンソールへのアクセスを試みる手法が報告されており、適切な調査と対策が必要です。
CloudTrail を活用したイベント調査方法と、被害を最小限に抑えるための具体的な対策についてまとめてみました。

脅威について

Datadog のレポートによると、攻撃者が永続的なアクセスキーを悪用して一時的なセキュリティ認証情報を生成し、AWS マネジメントコンソールへアクセスする手法が確認されています。

A recent threat hunt uncovered an attack in which a threat actor used a long-lived AWS access key to access the AWS console.

To achieve this, they used the sts:getFederationToken API call to convert their CLI access to console access, before using signin:GetSigninToken to generate a link for signing in to the console. From there, an IAM role was created, named SupportAWS, along with an attached policy that allowed the role to be assumed from a threat actor-controlled account. The threat actor also attached the AdministratorAccess managed policy to the role, before creating a malicious IAM used named adminprod that could be used to persistently access AWS services, including SES.

https://securitylabs.datadoghq.com/articles/2024-q4-threat-roundup/#threat-actors-continue-to-target-amazon-ses

永続的なアクセスキーについて

永続的なアクセスキーは AWS のプログラムやサービスと連携するための長期的な認証情報です。
アクセスキー ID とシークレットアクセスキーを組み合わせて認証に使用します。
IAM ユーザーに紐づいているため、漏洩すると不正アクセスのリスクが高まります。

一時的なセキュリティ認証情報について

一時的なセキュリティ認証情報は AWS の STS(Security Token Service)を使用して発行される、一定期間のみ有効な認証情報です。
IAM ロールやフェデレーションアクセスを利用する際に生成され、GetFederationToken API を呼び出すことでも取得できます。
GetFederationToken リクエストの条件は次のとおりです。

  • 永続的なアクセスキーを使用している

  • sts:GetFederationToken アクションが許可されている
    IAM ポリシーで sts:GetFederationToken アクションの許可が必要です。
    AdministratorAccess、PowerUserAccess といった強いマネージドポリシーがアタッチされている場合は許可されます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:GetFederationToken",
      "Resource": "*"
    }
  ]
}

一時的なセキュリティ認証情報の注意点

一時的なセキュリティ認証情報は、以下の点に注意する必要があります。

認証情報の有効期限

一時的なセキュリティ認証情報は最大36時間有効です。
認証情報は期限が切れるまで利用可能なため、適切な管理が必要です。

アクセスキーを無効化しても、有効期限内であれば引き続き利用が可能

一時的なセキュリティ認証情報は、GetFederationToken を呼び出したアクセスキーを無効化しても、有効期限内であれば引き続き使用可能です。
そのため、アクセスキーが漏洩した場合、単に無効化するだけでは不十分なケースがあります。
アクセス権限を無効化する追加の対処が必要です。

調査方法

AWS マネジメントコンソールへ一時的なセキュリティ認証情報を利用した不正なアクセスや意図しないアクセスが発生していないかを調査するには、CloudTrail を活用できます。
アクセスが確認された場合、サインインしたユーザーの行動を調査できます。

1.一時的なセキュリティ認証情報を利用した AWS マネジメントコンソールのサイン調査

一時的なセキュリティ認証情報を利用して AWS マネジメントコンソールへサインインを試みた場合、次のイベントが CloudTrail に記録されます。

  • GetFederationToken
  • GetSigninToken

イベント名でフィルタし、CloudTrail ログを確認します。

コンソールを使用する
バージニア北部リージョンの CloudTrail コンソールにてルックアップ属性をイベント名に指定して検索を行います。
フィルタリングされたイベント履歴を確認し、意図しないアクティビティであるかどうかを調査します。
aa

AWS CLI を利用する
AWS CloudShell など、AWS CLI と jq コマンドが利用可能な環境で、以下のサンプルコマンドを実行します。
出力されたイベント履歴を確認し、意図しないアクティビティであるかどうかを調査します。

aws cloudtrail lookup-events --lookup-attributes AttributeKey=EventName,AttributeValue=GetFederationToken \
  --region us-east-1 \
  --output json | jq -r '
    .Events[] |
    {Time: .EventTime, Event: .EventName, User: .Username, IP: (.CloudTrailEvent | fromjson | .sourceIPAddress)}
  '
aws cloudtrail lookup-events --lookup-attributes AttributeKey=EventName,AttributeValue=GetSigninToken \
  --region us-east-1 \
  --output json | jq -r '
    .Events[] |
    {Time: .EventTime, Event: .EventName, User: .Username, IP: (.CloudTrailEvent | fromjson | .sourceIPAddress)}
  '

出力結果例

{
  "Time": "2025-02-27T16:32:18+09:00",
  "Event": "GetFederationToken",
  "User": "readuser",
  "IP": "XXX.XX.XXX.XXX"
}

{
  "Time": "2025-02-27T16:32:19+09:00",
  "Event": "GetSigninToken",
  "User": "ExampleUser",
  "IP": "XXX.XX.XXX.XXX"
}

2.サインインしたユーザーの行動を調査

ユーザー名を基に、サインインしたユーザーの行動を調査できます。
GetFederationToken ではリクエストパラメータとして任意のユーザー名を設定できます。
そのため、取得した一時的なセキュリティ認証情報を使用して GetSigninToken を実行したユーザー名を基に調査する必要があります。
なお、GetFederationToken を実行したユーザー名は、アクセスキーを作成した IAM ユーザー名となるため注意が必要です。
bb

コンソールを使用する
各リージョンの CloudTrail コンソールにてルックアップ属性をユーザー名に指定して検索を行います。
フィルタリングされたイベント履歴を確認し、どのようなアクションが行われているか調査します。
すべてのリージョンで調査することを推奨します。
cc

AWS CLI を利用する
AWS CloudShell など、AWS CLI と jq コマンドが利用可能な環境で、以下のサンプルコマンドを実行します。
出力されたイベント履歴を確認し、どのようなアクションが行われているか調査します。
--region パラメータを指定してすべてのリージョンで調査することを推奨します。

aws cloudtrail lookup-events --lookup-attributes AttributeKey=Username,AttributeValue=ExampleUser \
    --query 'Events[*].[EventName, EventTime]' \
    --region ap-northeast-1 \
    --output table

出力結果例

---------------------------------------------------------------------------
|                              LookupEvents                               |
+-------------------------------------------+-----------------------------+
|  DescribeVpcEndpoints                     |  2025-02-27T17:48:39+09:00  |
|  DescribeEgressOnlyInternetGateways       |  2025-02-27T17:48:39+09:00  |
|  DescribeVpcAttribute                     |  2025-02-27T17:48:39+09:00  |
|  DescribeRouteTables                      |  2025-02-27T17:48:39+09:00  |
|  DescribeNatGateways                      |  2025-02-27T17:48:39+09:00  |
|  DescribeSubnets                          |  2025-02-27T17:48:39+09:00  |
+-------------------------------------------+-----------------------------+

対処方法

海外の IP アドレスなど、不審なアクセスが確認された場合、アクセスキーが漏洩している可能性があります。

1.アクセスキーの削除

まず、漏洩の可能性があるアクセスキーを削除します。
GetFederationToken を実行した IAM ユーザーのアクセスキーを無効化、削除します。
※再有効化できてしまうため、アクセスキーは削除を実施しましょう。
アプリケーションを中断せずにアクセスキーを更新するには新しいキーを作成し、ローテーションを行なってからアクセスキーを無効化、削除を実施してください。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id-credentials-access-keys-update.html#rotating_access_keys_cli

444

2.一時的なセキュリティ認証情報のアクセス権限の無効化

一時的なセキュリティ認証情報は、期限が切れるまで有効ですが、アクセス許可はリクエストの実行に使用されるたびに評価されます。
そのため、すべてのアクセス許可を明示的に拒否するポリシーを適用することで、意図しない一時的なセキュリティ認証情報の利用に対する対処が可能です。

例として、次のようなフェデレーションユーザーを PrincipalArn 条件とした、インラインポリシーを GetFederationToken を実行した IAM ユーザに適用することでリクエストをすべて拒否できます。
条件をフェデレーションユーザとしているため、アプリケーションからのアクセスに影響を与えることなく対応できます。

ポリシーサンプル

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "ArnEquals": {
                    "aws:PrincipalArn": "arn:aws:sts::*:federated-user/*"
                }
            }
        }
    ]
}

実際に確認してみます。
ポリシーを IAM ユーザーにアタッチします。
readuser-IAM-Global-02-28-2025_05_56_PM

一時的なセキュリティ認証情報を利用して AWS マネジメントコンソールにサインインしていたフェデレーションユーザーによる AWS のリクエストはエラーメッセージが表示され、失敗するようになりました。
ポリシー追加後のコンソール画面-png-3600×1948--02-28-2025_05_58_PM

脅威への対策

GetFederationToken による一時的なセキュリティ認証情報を利用した AWS マネジメントコンソールのアクセスを防ぐためには、以下の対策が考えられます。

GetFederationToken 使用を制限する

セキュリティを強化するために、sts:GetFederationToken の使用を制限する方法があります。
最小権限の原則に基づき、通常の運用で GetFederationToken が不要な IAM ユーザーには、このアクションを許可しないことが推奨されますが、IAM ポリシーを使用して GetFederationToken の実行を明示的に拒否することで、意図しない使用を防ぐことができます。
以下の IAM ポリシーを適用することで、IAM ユーザーに対して GetFederationToken の使用を禁止できます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "sts:GetFederationToken"
            ],
            "Resource": "*"
        }
    ]
}

IP アドレスでアクセスを制限する

特定の IP アドレスやネットワーク範囲からのみアクセスを許可することで、不正アクセスのリスクを低減できます。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_examples_aws_deny-ip.html

MFA を強制する

アクセスキーに加えて、多要素認証を要求することで、不正アクセスのリスクを低減できます。
MFA を強制する IAM ポリシーの例は下記の記事を参照してください。
https://dev.classmethod.jp/articles/forced_mfa/

IAM ロールを利用する

アクセスキーは長期間有効な認証情報であるため、可能な限り使用を避けることが推奨されます。
アプリケーションが AWS サービスへアクセスする場合には IAM ロールを利用することでより安全に認証管理が行えます。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles.html

CloudTrail ログを監視する

CloudWatch Logs や CloudWatch アラームと連携し、GetFederationToken などの特定 API 呼び出しが検出された際にアラートを発行する仕組みを構築することで、迅速な対応が可能になります。
https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/cloudwatch-alarms-for-cloudtrail.html

GuardDuty を活用する

GuardDuty を使用すると、不審な API 呼び出しや異常なアクティビティを検出できる可能性があります。
攻撃の兆候を早期に把握できます。
https://docs.aws.amazon.com/ja_jp/guardduty/latest/ug/guardduty_finding-types-iam.html

まとめ

アクセスキーを悪用し、AWS マネジメントコンソールにアクセスする脅威が報告されています。
不審なアクティビティが確認された場合は、アクセスキーの削除や無効化に加え、拒否ポリシーの適用など、迅速な対処が重要です。
最小権限の原則を適用し、脅威検出を強化するとともに、アクセスキーの管理はこれまで以上に慎重に行いましょう。

参考

https://docs.aws.amazon.com/ja_jp/STS/latest/APIReference/API_GetFederationToken.html
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_temp_control-access_disable-perms.html#deny-access-with-resource-based
https://docs.datadoghq.com/security/default_rules/aws-cloudtrail-federation-token-generation/

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.