使用AWS re:Post即您表示您同意 AWS re:Post 使用条款

当我使用 AWS CLI 代入 IAM 角色时,该如何解决 AWS STS 错误“security token included in the request is expired”(请求中包含的安全令牌已过期)?

3 分钟阅读
0

我尝试使用 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 中的安全最佳实践

相关信息

请求临时安全凭证

如何解决在 Amazon EC2 上运行 Java 应用程序时出现的“The security token included in the request is expired”(请求中包含的安全令牌已过期)错误?

AWS 官方
AWS 官方已更新 1 个月前