AWS CLIを使用したJumpアカウントでのスイッチロール後、非許可IPアドレスからの操作が可能になる理由と対策

AWS CLIを使用したJumpアカウントでのスイッチロール後、非許可IPアドレスからの操作が可能になる理由と対策

Clock Icon2024.11.18

困っていること

Jumpアカウントやスイッチロール先アカウントでIPアドレス制限を設定する場合、通常はJumpアカウントのIAMユーザーまたはスイッチロール先のIAMロールにIP制限を適用します。

しかし、許可されているIPアドレスからアクセスキーを使用してAWS CLIでスイッチロールを実行した後、非許可IPアドレスに変更しても、JumpアカウントのIAMユーザーまたはスイッチロール先のIAMロールでの操作が引き続き可能となってしまいます。

# JumpアカウントのIAMユーザーのアクセスキーを利用して、AssumeRoleを実行
$ aws sts assume-role \
    --role-arn arn:aws:iam::123456789012:role/test-user \
    --role-session-name test-session

$ export AWS_ACCESS_KEY_ID=<AssumeRoleで取得したAccessKeyId>
$ export AWS_SECRET_ACCESS_KEY=<AssumeRoleで取得したSecretAccessKey>
$ export AWS_SESSION_TOKEN=<AssumeRoleで取得したSessionToken>

# 非許可IPに変更後、リソースアカウント上で実行できてしまう
$ aws s3 ls

# jumpアカウントでも非許可IPで実行できてしまう
$ unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN
$ aws s3 ls

なぜIP制限されないのか、その理由と、非許可IPで操作できないようにしたいのですが、どのような対策が考えられますでしょうか?

原因

この問題の原因は、IAM ロールを使用するプロファイルを設定した際に、取得した一時認証情報がキャッシュされることにあります。
キャッシュされた認証情報は、その有効期間内は継続して使用されます。

AWS CLIは、コマンド実行のたびにIAMユーザーの権限に基づいてAssumeRoleを実行するのではなく、一度取得した一時認証情報が有効である限り、キャッシュに保存された認証情報を継続して使用します。

そのため、一時認証情報の取得後にユーザーが許可されていないIPアドレスに変更しても、新たにAssumeRoleは実行されず、AWS CLIコマンドは引き続き成功してしまいます。

解決方法

この問題に対する対処方法として、AWSドキュメントに記載されているように、キャッシュされた一時認証情報を削除することで、再度AssumeRoleを実行させることができます。

作業完了後、または定期的にキャッシュをクリアすることで、アクセス元IPアドレスが変更された際に、キャッシュを使用せず、AssumeRoleによる新しい一時認証情報の取得を強制することができます。

When you use a shared profile that specifies an AWS Identity and Access Management (IAM) role, the AWS CLI calls the AWS STS AssumeRole operation to retrieve temporary credentials. These credentials are then stored (in ~/.aws/cli/cache). Subsequent AWS CLI commands use the cached temporary credentials until they expire, and at that point the AWS CLI automatically refreshes the credentials.
日本語訳:共有プロファイルでAWS Identity and Access Management (IAM) ロールを指定して使用する場合、AWS CLIはAWS STS AssumeRole操作を呼び出して一時的な認証情報を取得します。これらの認証情報は、その後(~/.aws/cli/cacheに)保存されます。以降のAWS CLIコマンドは、この一時的な認証情報が有効期限切れになるまで、キャッシュされた認証情報を使用します。有効期限が切れた時点で、AWS CLIは自動的に認証情報を更新します。

https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html

この AWS CLI は、期限切れになるまで認証情報をキャッシュします。有効でなくなった、キャッシュされている認証情報の削除と更新を CLI に強制するには、次のいずれかのコマンドを実行します。
Linux、macOS、または Unix
rm -r ~/.aws/cli/cache
Windows
C:> del /s /q %UserProfile%.aws\cli\cache

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use_revoke-sessions.html

さらに、AWS CLIによるスイッチロールの代わりに、AWS マネジメントコンソールを利用することでもこの問題を回避できます。

マネジメントコンソールの場合

AWS CLIでAssumeRoleを実行した場合、取得した一時的な認証情報がローカルにキャッシュされます。一方、AWS マネジメントコンソールの場合は異なる動作をします。

AWS マネジメントコンソールを使用する場合、認証情報はローカルにキャッシュされません。
そのため、スイッチロール後に非許可IPアドレスに移動すると、即座にアクションが制限されます。これにより、IP制限が常に適切に適用されます。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.