当我使用 AWS CLI 代入 IAM 角色时,该如何解决 AWS STS 错误“security token included in the request is expired”(请求中包含的安全令牌已过期)?
我尝试使用 AWS 命令行界面 (AWS CLI) 代入 AWS Identity and Access Management (IAM) 角色。我收到“security token included in the request is expired”(请求中包含的安全令牌已过期)错误。
简短描述
IAM 用户的临时安全凭证是使用 AWS Security Token Service (AWS STS) 服务请求的。默认情况下,使用 AssumeRole API 操作创建的临时凭证有效期为一小时。临时凭证到期后,将无法重复使用。有关详细信息,请参阅 IAM 中的临时安全凭证。
解决方法
根据您的用例使用以下故障排除步骤。
**注意:**如果在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,确保您使用的是最新版本的 AWS CLI。
确保您的临时安全凭证请求可以到达 AWS 端点
为角色建立凭证需要访问密钥 ID、秘密访问密钥和会话令牌。发送的请求必须在请求上的时间戳后的五分钟内到达 AWS 端点,否则请求将被拒绝。有关详细信息,请参阅为何对请求进行签名。
使用配置文件代入 IAM 角色
命名配置文件是设置和凭证的集合,您可以将其应用于 AWS CLI 命令,以验证是否使用了正确的凭证。
以下 AWS CLI 命令使用默认配置文件凭证:
aws s3 ls
此示例命令使用的是在 .config 文件中配置的 **project1 ** 配置文件凭证:
aws s3 ls --profile project1
使用过期凭证的示例输出:
"An error occurred (ExpiredToken) when calling the ListBuckets operation: The provided token has expired."
这些配置文件在您的 .aws 文件夹中定义,该文件夹包含 .credentials 和 .config 文件。
对于 Linux/macOS,配置文件位于 ~/.aws/config,对于 Windows,配置文件位于 C:\Users\%USERPROFILE%\.aws\config。对于 Linux/macOS,凭证文件位于 ~/.aws/credentials,对于 Windows,凭证文件位于 C:\Users\%USERPROFILE%\.aws\credentials。
要检查您的默认配置文件凭证,请运行以下命令:
aws configure list --profile default
示例输出:
Name Value Type Location ---- ----- ---- -------- profile default manual —profile access_key TGN7 shared-credentials-file secret_key SbXb shared-credentials-file region us-east-1 config-file ~/.aws/config
要确认为配置文件 project1 使用了相同的凭证,请运行以下命令:
aws configure list --profile project1
示例输出:
Name Value Type Location ---- ----- ---- -------- profile project1 manual —profile access_key QN2X config-file secret_key LPYI config-file region eu-west-1 config-file ~/.aws/config
在示例输出中,请注意,可能会为默认配置文件和 project1 配置文件配置了不同的凭证。
您可以使用以下格式在 .aws/config 文件中创建配置文件:
[profile project1] region = eu-west-1 aws_access_key_id = <access-Key-for-an-IAM-role> aws_secret_access_key = <secret-access-Key-for-an-IAM-role> aws_session_token = <session-token>
这些凭证会在您运行 AWS STS assume-role 命令时提供给您,如下所示:
aws sts assume-role --role-arn arn:aws:iam::<account-number>:role/Prod-Role --role-session-name environment-prod
示例输出:
{ "AssumedRoleUser": { "AssumedRoleId": "AROAXXXXXXXXXXXX:environment-prod", "Arn": "arn:aws:sts::<account-number>:assumed-role/Prod-Role/environment-prod" }, "Credentials": { "SecretAccessKey": "<secret-access-Key-for-an-IAM-role>, "SessionToken": "<session-token>", "Expiration": "2020-03-31T17:17:53Z", "AccessKeyId": "<access-Key-for-an-IAM-role>" }
**注意:**您可以针对您的用例使用 DurationSeconds 参数延长 IAM 角色临时凭证的最大会话到期时间。
然后,新的 assume-role API 调用会检索一组新的有效凭证。在 API 调用之后,必须使用新的临时凭证手动更新 ~/.aws/config 文件。
您无需在每次会话到期时都更新配置文件。在 ~/.aws/config 或 ~/.aws/credentials 文件中定义 IAM 角色的配置文件以及代入该角色的用户,如下所示:
[profile project1] role_arn = <arn-of-IAM-role> source_profile = user1 region = <region>
请注意,user1 是在 ~/.aws/credentials 文件中定义的,如下所示:
[user1] aws_access_key_id=AKIAIOSFODNN7EXAMPLE aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
定义 source_profile 意味着您不必在 ~/.aws/config 或 ~/.aws/credentials 文件中更新临时凭证。
以下 AWS CLI 命令列出了 Amazon Simple Storage Service (Amazon S3) 存储桶,其中包含位于 ~/.aws/credentials 文件的 user1 的凭证。
aws s3 ls --profile project1
如果您使用包含 source_profile 元素的 AWS CLI,则 API 调用 assume-role 会将凭证放入 .aws/cli/cache 文件中。过期凭证会在 .aws/cli/cache 文件中自动更新。如果您收到有关凭证过期的错误,则可以使用以下命令清除缓存:
Linux/macOS:
$ rm -r ~/.aws/cli/cache
Windows:
C:\> del /s /q %UserProfile%\.aws\cli\cache
AWS CLI 在缓存中创建新的凭证。
创建环境变量以代入 IAM 角色并验证访问权限
您可以使用 IAM 角色凭证创建三个环境变量来代入 IAM 角色,如下所示:
Linux/macOS:
export AWS_ACCESS_KEY_ID=RoleAccessKeyID export AWS_SECRET_ACCESS_KEY=RoleSecretKey export AWS_SESSION_TOKEN=RoleSessionToken
Windows:
C:\> setx AWS_ACCESS_KEY_ID RoleAccessKeyID C:\> setx AWS_SECRET_ACCESS_KEY RoleSecretKey C:\> setx AWS_SESSION_TOKEN RoleSessionToken
要验证您是否代入了正确的 IAM 角色,请运行以下命令:
aws sts get-caller-identity
get-caller-identity 命令显示用于对请求进行身份验证的 IAM 身份的相关信息。有关详细信息,请参阅如何使用 AWS CLI 代入 IAM 角色?
环境变量将保存临时缓存的凭证,即使它们过期且不会自动更新。使用以下命令检查是否设置了凭证环境变量:
Linux/macOS:
$ printenv | grep AWS
Windows:
C:\>set AWS
您可以使用以下命令删除过期的环境变量:
Linux/macOS:
$ unset AWS_ACCESS_KEY_ID $ unset AWS_SECRET_ACCESS_KEY $ unset AWS_SESSION_TOKEN
Windows:
C:\>set AWS_ACCESS_KEY_ID= C:\>set AWS_SECRET_ACCESS_KEY= C:\>set AWS_SESSION_TOKEN=
现在,您可以再次使用 assume-role API 调用来获取新的有效凭证并再次设置环境变量。
重要事项:****.aws/credentials 和 .aws/config 文件包含您的 IAM 实体的凭证详细信息。管理您的凭证时,请确保遵循 IAM 中的安全最佳实践。
相关信息
相关内容
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 5 个月前