CLIでロールのセッション期間を設定するとはまりやすいポイント

こんにちは!ハンと申します。今回が初のブログになりますが、どうぞよろしくお願いします!

さて、今回はAWS CLIでIAMロールを引き受ける(AssumeRole)際に、セッションの有効期間を設定するとアクセス拒否(AccessDenied)が発生することがあります。本投稿では、その原因と解決策について解説します。

背景:AWS CLIでIAMロールを引き受ける

AWS CLIでIAMロールを引き受ける場合は、通常は下記のようなコマンドを実行します。

aws sts assume-role --role-arn arn:aws:iam::123456789012:role/MyRole --role-session-name botocore-session-1234567890 

このコマンドを実行すると、一時的なセキュリティ認証情報が発行され、ロールの権限を使用して、AWSリソースにアクセスできます。

デフォルトではセッションの有効期間は1時間(3600秒)ですが、duration-secondsオプションを指定することで、最大12時間(43200秒)まで延長できます。

aws sts assume-role --role-arn arn:aws:iam::123456789012:role/MyRole --role-session-name botocore-session-1234567890 --duration-seconds 43200 

しかし、このコマンドを実行すると、アクセス拒否(AccessDenied)のエラーが発生することがあります。

はまったこと:ロールのセッション期間を設定するとアクセス拒否が発生する

ロールのセッション期間を延長しようとしたら、下記のようなエラーメッセージが出ることがあります。

An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::111111111111:user/MyUser is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::123456789012:role/MyRole 

原因:MFA(多要素認証)が必須のロールにはtoken-codeオプションが必要

IAMロールの設定により、ロールを引き受ける時にMFA(多要素認証)が必須になっている場合があります。

MFAが有効な場合は、token-codeオプションを指定しないとsts:AssumeRoleの権限が拒否されてしまいます。

解決策:token-codeオプションを指定する

アクセス拒否を解消し、長時間のセッションを確保するには、MFAのワンタイムパスコードを取得し、token-codeオプションを指定してコマンドを実行する必要があります。

1.MFAデバイスのシリアル番号を確認する

まず、IAMユーザーのMFAデバイスのarnを確認します。

aws iam list-mfa-devices --user-name MyUser

出力例:

{
    "MFADevices": [
        {
            "UserName": "MyUser",
            "SerialNumber": "arn:aws:iam::111111111111:mfa/MyAuthenticator",
            "EnableDate": "2025-01-01T09:07:44+00:00"
        }
    ]
}

このSerialNumberをメモしておきます。

2.MFAのワンタイムパスコードを取得する

MFAデバイスの6桁のワンタイムパスコードを確認します。

3.token-codeオプションを指定してロールを引き受ける

取得したMFAのワンタイムパスコードをtoken-codeオプションに指定し、aws sts assume-roleを実行します。

注意:MFAのパスコードの有効期間がかなり短いため、期限が切れる前に急いで実行する必要があります。

aws sts assume-role \
--role-arn arn:aws:iam::123456789012:role/MyRole \
--role-session-name botocore-session-1234567890 \
--duration-seconds 43200 \
--serial-number arn:aws:iam::111111111111:mfa/MyAuthenticator \
--token-code 123456

出力例:

{
    "Credentials": {
        "AccessKeyId": "AAAAAAAA7ZG6OQVOSALE",
        "SecretAccessKey": "IIIIIIIIIrRFFMpibD86sbSLIs6Qz8ZdKlr2haLv",
        "SessionToken": "IQoJb3JpZ2luX2VjjjjjjjjjLW5vcnRoZWFzdC0xIkcwRQIgLG3QiKxA3Y8X+Hy8bgws3ieuXeCzrA9CEtERmIAwsC8CIQCYpcIgVS1LBtxEzaEwDsrlOZbGS9j8eXjDGCeLznO77iqpAggnEAAaDDY1MTcwNjc0NzMyNCIMWBMTUU+9jY1ZP4U4KoYCphdakJJvURtsXk1J5jLFh9RfNzASRJj+0214nBI/g2jbb53WQonDoMmupXkOQO0g4askNOZ0CfJmG3zDeCjJviB7VsBn9EILosbUU4ztXTyOF6ZGlffdKFAaJmNtXfna3ynjekiFagtPu79gCg5yCS8M3OKwgNB46ayuQxAr74adWXTJNKZatynIP/MRUrsqnOFF5yVnhZzVbfHaS1bKQrBjp5kg+HOJrr1DQwvST+ifzdGErpjeUQifDxNxI3k9fBtIMlNHe0igeseBLQTn08m5YwkCsYa3ESEpnjfOq+/Cit6EFqVz9N35PpVN2ztfu5sfKKP1RCl7TklNFgROz4USEnjspzCF14a9BjqdAU9NPc5JTPvkE2Lw58HGKEoIuVr3xyxDRN6FUKjm/gwpKU2T/AUaDKaQwVPR+O7yRDb1m24etGbx5OTRMnRDnfXoNrvNonlyI3X1b7Fsx5CnbYGtQDN6RatcOyEKeVOUvule+xRDFnEivz7bHYN1WvzcpBnbFrlCZhbJNB6WPB9bQFisQ4riB9I1p1g7fjLLlvVodIsbi2Ul/eyJ9QY=",
        "Expiration": "2025-02-04T17:54:13+00:00"
    },
    "AssumedRoleUser": {
        "AssumedRoleId": "AROAZPPF7ZG6HIPEAANTH:botocore-session-1234567890",
        "Arn": "arn:aws:sts::123456789012:assumed-role/MyRole/botocore-session-1234567890"
    }
}

設定したセッション期間を出力のExpirationから確認できます。Expirationは現在の認証情報の有効期限が切れる日時を示します。

まとめ

AWS CLIでロールのセッション期間を設定すると、MFA(多要素認証)が有効な場合、アクセス拒否(AccessDenied)が発生することがあるので、注意が必要です。MFAデバイスのワンタイムパスコードを取得し、token-codeオプションを指定し、ロールを引き受けます。

AWSのセキュリティ設定は細かいですが、意図しないアクセス拒否にあったら、IAMロールのMFAやポリシーをチェックするのが重要ですね。「IAMロールの引き受けが拒否された!」と困っている方は、ぜひ試してみてください。

投稿者プロフィール

ハン
ハン
中国出身。AWSの構築・運用を経験し、一人前のエンジニアを目指しています。学びと挑戦を楽しみながら前進中!好きなことはお寿司や天ぷらを食べまくること、そして気ままな散歩です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です