请求临时安全凭证 - AWS Identity and Access Management

请求临时安全凭证

要请求临时安全凭证,您可以在 AWS API 中使用 AWS Security Token Service (AWS STS) 操作。这些操作包括创建受信任用户,并为其提供可以控制 AWS 资源访问的临时安全凭证。有关 AWS STS 的更多信息,请参阅 IAM 临时安全凭证。要了解在担任角色以请求临时安全凭证时使用的各种方法,请参阅担任角色的方法

要调用 API 操作,您可以使用其中的一个 AWS SDK。这些开发工具包适用于各种不同的编程语言和环境,包括 Java、.NET、Python、Ruby、Android 和 iOS。这些开发工具包负责处理各种任务,如以加密方式对您的请求进行签名、在必要时重试请求以及处理错误响应。还可使用 AWS STS 查询 API(在 AWS Security Token Service API 参考中介绍)。最后,两个命令行工具支持 AWS STS 命令:AWS Command Line InterfaceAWS Tools for Windows PowerShell

AWS STS API 操作使用临时安全凭证(包括访问密钥对和会话令牌)创建新会话。访问密钥对由访问密钥 ID 和私有密钥组成。用户 (或用户所运行的应用程序) 可使用这些凭证访问您的资源。您可以使用 AWS STS API 操作以编程方式创建角色会话和传递会话策略及会话标签。生成的会话的权限是角色的基于身份的策略与会话策略的交集。有关会话策略的更多信息,请参阅会话策略。有关会话标签的更多信息,请参阅 在 AWS STS 中传递会话标签

注意

AWS STS API 操作返回的会话令牌大小不固定。我们强烈建议不要假设最大大小。典型的令牌大小小于 4096 字节,但可能会发生变化。

通过 AWS 区域使用 AWS STS

您可以将 AWS STS API 调用发送到全球终端节点或某个区域终端节点。如果您选择更靠近您的终端节点,则可减少延迟并改善 API 调用的性能。如果您不再能与原始终端节点进行通信,也可选择将调用定向到替代的区域终端节点。如果您使用某种 AWS SDK,请先使用该开发工具包的方法指定一个区域,然后再进行 API 调用。如果您正在手动构建 HTTP API 请求,则必须自行将请求定向到正确的终端节点。有关更多信息,请参阅区域和终端节点管理 AWS 区域中的 AWS STS 的 AWS STS 部分。

下面是让您可以用来获取临时凭证以用于您的 AWS 环境和应用程序的 API 操作。

请求通过自定义身份凭证代理程序进行跨账户委托和联合身份验证的凭证

AssumeRole API 操作对于允许现有 IAM 用户访问其没有访问权限的 AWS 资源很有用。例如,用户可能需要对其他 AWS 账户 中资源的访问权限。此外,可使用它来暂时获得特权访问权限 - 例如,提供多重身份验证 (MFA)。您必须使用活动凭证调用该 API。要了解谁可以调用此操作,请参阅 比较 AWS STS 凭证。有关更多信息,请参阅 创建向 IAM 用户委派权限的角色使用 MFA 保护 API 访问

要请求通过自定义身份凭证代理程序进行跨账户委托和联合身份验证的临时安全凭证
  1. 使用您的 AWS 安全凭证进行身份验证。必须使用有效的 AWS 安全凭证来进行此调用。

  2. 调用 AssumeRole 操作。

以下示例显示了使用 AssumeRole 的示例请求和响应。此示例请求将在指定的持续时间内担任 demo 角色,其中包含会话策略会话标签外部 ID源身份。生成的会话命名为 John-session

例 示例请求
https://sts.amazonaws.com/ ?Version=2011-06-15 &Action=AssumeRole &RoleSessionName=John-session &RoleArn=arn:aws::iam::123456789012:role/demo &Policy=%7B%22Version%22%3A%222012-10-17%22%2C%22Statement%22%3A%5B%7B%22Sid%22%3A%20%22Stmt1%22%2C%22Effect%22%3A%20%22Allow%22%2C%22Action%22%3A%20%22s3%3A*%22%2C%22Resource%22%3A%20%22*%22%7D%5D%7D &DurationSeconds=1800 &Tags.member.1.Key=Project &Tags.member.1.Value=Pegasus &Tags.member.2.Key=Cost-Center &Tags.member.2.Value=12345 &ExternalId=123ABC &SourceIdentity=DevUser123 &AUTHPARAMS

在前面的示例中显示的策略值是以下策略的 URL 编码版本:

{"Version":"2012-10-17","Statement":[{"Sid":"Stmt1","Effect":"Allow","Action":"s3:*","Resource":"*"}]}

示例中的 AUTHPARAMS 参数是您的签名 的占位符。签名是您必须在 AWS HTTP API 请求中包含的身份验证信息。建议使用 AWS 开发工具包创建 API 请求,这样做的一个好处是开发工具包将为您处理请求签名。如果您必须手动创建并签署 API 请求,请参阅《Amazon Web Services 一般参考》中的 使用签名版本 4 签署 AWS 请求,以了解如何签署请求。

除了临时安全凭证之外,该响应还包括联合身份用户的 Amazon Resource Name (ARN) 和凭证的到期时间。

例 响应示例
<AssumeRoleResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/"> <AssumeRoleResult> <SourceIdentity>DevUser123</SourceIdentity> <Credentials> <SessionToken> AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQW LWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGd QrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU 9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz +scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA== </SessionToken> <SecretAccessKey> wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY </SecretAccessKey> <Expiration>2019-07-15T23:28:33.359Z</Expiration> <AccessKeyId>AKIAIOSFODNN7EXAMPLE</AccessKeyId> </Credentials> <AssumedRoleUser> <Arn>arn:aws:sts::123456789012:assumed-role/demo/John</Arn> <AssumedRoleId>ARO123EXAMPLE123:John</AssumedRoleId> </AssumedRoleUser> <PackedPolicySize>8</PackedPolicySize> </AssumeRoleResult> <ResponseMetadata> <RequestId>c6104cbe-af31-11e0-8154-cbc7ccf896c7</RequestId> </ResponseMetadata> </AssumeRoleResponse>
注意

AWS 转换会将传递的会话策略和会话标签压缩为具有单独限制的打包二进制格式。即使您的纯文本符合其他要求,您的请求也可能会由于此限制而失败。PackedPolicySize 响应元素指示您请求的策略和标签接近大小上限的程度,以百分比来表示。

通过 OIDC 提供商请求凭证

AssumeRoleWithWebIdentity API 操作为通过公共身份提供程序验证的联合身份用户返回一组临时安全凭证。公共身份提供程序示例包括 Login with Amazon、Facebook、Google 或任何 OpenID Connect (OIDC) 兼容身份提供程序。使用该操作意味着,您的用户不需要使用自己的 AWS 或 IAM 身份。有关更多信息,请参阅 OIDC 联合身份验证

注意

我们建议您使用 Amazon Cognito 和适用于移动开发的 AWS SDK 附带的 Amazon Cognito 凭证提供程序,而不是直接调用 AssumeRoleWithWebIdentity。有关更多信息,请参阅《Amplify 文档》中的使用 Amplify 进行身份验证

如果不使用 Amazon Cognito,则可调用 AWS STS 的 AssumeRoleWithWebIdentity 操作。

  1. 调用 AssumeRoleWithWebIdentity 操作。

    这是一个未签名的调用,意味着您无需在发出请求之前对 AWS 安全凭证进行身份验证。

    注意

    AssumeRoleWithWebIdentity 的调用未签名 (加密)。因此,只有在通过受信任的中介传输请求时,才应包含可选的会话策略。在这种情况下,有人可能会修改策略以删除限制。

  2. 调用 AssumeRoleWithWebIdentity 时,AWS 将验证令牌的真实性。例如,根据提供商的不同,AWS 可能调用提供商并加入应用程序已传递的令牌。假定身份提供程序证实令牌有效,则 AWS 返回以下信息:

    • 一组临时安全凭证。这些证书由访问密钥 ID、秘密访问密钥和会话令牌组成。

    • 所担任角色的角色 ID 和 ARN。

    • 一个 SubjectFromWebIdentityToken 值,其中包含独一无二的用户 ID。

  3. 使用响应中返回的临时安全凭证进行 AWS API 调用。该过程与使用长期安全凭证进行 AWS API 调用相同。不同之处在于,您必须包含会话令牌,以便 AWS 验证临时安全凭证是否有效。

您的应用程序应缓存凭证。如上所述,默认情况下,凭证在 1 小时后到期。如果未使用 软件开发工具包中的 AmazonSTSCredentialsProviderAWS 操作,则由您和您的应用程序负责再次调用 AssumeRoleWithWebIdentity。在旧安全凭证到期之前,可以调用该操作以获取一组新的临时安全凭证。

通过 SAML 2.0 身份提供商请求凭证

AssumeRoleWithSAML API 操作为通过您的组织的现有身份系统验证的联合身份用户返回一组临时安全凭证。用户还必须使用 SAML 2.0(安全断言标记语言)将身份验证和授权信息传递给 AWS。对于将身份系统 (如 Windows Active Directory 或 OpenLDAP) 与可生成 SAML 断言的软件集成在一起的组织,该 API 操作是非常有用的。此类集成提供有关用户身份和权限 (如 Active Directory 联合身份验证服务或 Shibboleth) 的信息。有关更多信息,请参阅 SAML 2.0 联合身份验证

  1. 调用 AssumeRoleWithSAML 操作。

    这是一个未签名的调用,意味着您无需在发出请求之前对 AWS 安全凭证进行身份验证。

    注意

    AssumeRoleWithSAML 的调用未签名 (加密)。因此,只有在通过受信任的中介传输请求时,才应包含可选的会话策略。在这种情况下,有人可能会修改策略以删除限制。

  2. 调用 AssumeRoleWithSAML 时,AWS 将验证 SAML 断言的真实性。假定身份提供程序证实断言有效,则 AWS 向您返回以下信息:

    • 一组临时安全凭证。这些证书由访问密钥 ID、秘密访问密钥和会话令牌组成。

    • 所担任角色的角色 ID 和 ARN。

    • Audience 值,包含 SAML 断言的 Recipient 元素的 SubjectConfirmationData 属性值。

    • Issuer 值,包含 SAML 断言的 Issuer 元素值。

    • NameQualifier 元素,包含通过 Issuer 值、AWS 账户 ID 以及 SAML 提供商的易记名称生成的哈希值。与 Subject 元素相结合时,它们可以唯一地标识联合身份用户。

    • Subject 元素,包含 SAML 断言的 NameID 元素的 Subject 元素值。

    • SubjectType 元素,指示 Subject 元素的格式。值可以是 persistenttransient 或在您的 SAML 断言中使用的 FormatSubject 元素的完整 NameID URI。有关 NameID 元素的 Format 属性的信息,请参阅为身份验证响应配置 SAML 断言。

  3. 使用响应中返回的临时安全凭证进行 AWS API 调用。该过程与使用长期安全凭证进行 AWS API 调用相同。不同之处在于,您必须包含会话令牌,以便 AWS 验证临时安全凭证是否有效。

您的应用程序应缓存凭证。默认情况下,凭证在 1 小时后到期。如果未使用 软件开发工具包中的 AmazonSTSCredentialsProviderAWS 操作,则由您和您的应用程序负责再次调用 AssumeRoleWithSAML。在旧安全凭证到期之前,可以调用该操作以获取一组新的临时安全凭证。

通过自定义身份凭证代理程序请求凭证

GetFederationToken API 操作为联合身份用户返回一组临时安全凭证。该 API 不同于 AssumeRole,其默认有效期大大增加 (12 小时而不是 1 小时)。此外,您还可以使用 DurationSeconds 参数指定临时安全凭证保持有效的持续时间。生成的凭证在指定的时间段内有效,介于 900 秒(15 分钟)到 129600 秒(36 小时)之间。较长的有效期有助于减少调用 AWS 的次数,因为您不需要经常获取新凭证。

  1. 使用您的特定 IAM 用户的 AWS 安全凭证进行身份验证。必须使用有效的 AWS 安全凭证来进行此调用。

  2. 调用 GetFederationToken 操作。

GetFederationToken 调用将返回临时安全凭证,其中包括会话令牌、访问密钥、私有密钥和到期时间。如果要在组织内管理权限 (例如,使用代理应用程序分配权限),则可使用 GetFederationToken

以下示例显示了使用 GetFederationToken 的示例请求和响应。此示例请求使用会话策略 ARN 和会话标签,在指定的持续时间内联合调用用户的身份。生成的会话命名为 Jane-session

例 示例请求
https://sts.amazonaws.com/ ?Version=2011-06-15 &Action=GetFederationToken &Name=Jane-session &PolicyArns.member.1.arn==arn%3Aaws%3Aiam%3A%3A123456789012%3Apolicy%2FRole1policy &DurationSeconds=1800 &Tags.member.1.Key=Project &Tags.member.1.Value=Pegasus &Tags.member.2.Key=Cost-Center &Tags.member.2.Value=12345 &AUTHPARAMS

上述示例中显示的策略 ARN 包含以下 URL 编码的 ARN:

arn:aws:iam::123456789012:policy/Role1policy

还要注意,该示例中的 &AUTHPARAMS 参数用作身份验证信息的占位符。这是签名,您必须将其包括在 AWS HTTP API 请求中。建议使用 AWS 开发工具包创建 API 请求,这样做的一个好处是开发工具包将为您处理请求签名。如果您必须手动创建并签署 API 请求,请访问《Amazon Web Services 一般参考》中的 使用签名版本 4 签署 AWS 请求,以了解如何签署请求。

除了临时安全凭证之外,该响应还包括联合身份用户的 Amazon Resource Name (ARN) 和凭证的到期时间。

例 响应示例
<GetFederationTokenResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/"> <GetFederationTokenResult> <Credentials> <SessionToken> AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQW LWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGd QrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU 9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz +scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCEXAMPLE== </SessionToken> <SecretAccessKey> wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY </SecretAccessKey> <Expiration>2019-04-15T23:28:33.359Z</Expiration> <AccessKeyId>AKIAIOSFODNN7EXAMPLE;</AccessKeyId> </Credentials> <FederatedUser> <Arn>arn:aws:sts::123456789012:federated-user/Jean</Arn> <FederatedUserId>123456789012:Jean</FederatedUserId> </FederatedUser> <PackedPolicySize>4</PackedPolicySize> </GetFederationTokenResult> <ResponseMetadata> <RequestId>c6104cbe-af31-11e0-8154-cbc7ccf896c7</RequestId> </ResponseMetadata> </GetFederationTokenResponse>
注意

AWS 转换会将传递的会话策略和会话标签压缩为具有单独限制的打包二进制格式。即使您的纯文本符合其他要求,您的请求也可能会由于此限制而失败。PackedPolicySize 响应元素指示您请求的策略和标签接近大小上限的程度,以百分比来表示。

AWS 建议您在资源级别授予权限(例如,将基于资源的策略附加到 Amazon S3 存储桶),则可省略 Policy 参数。但是,如果不加入针对联合身份用户的策略,则临时安全凭证将不授予任何权限。在这种情况下,您必须 使用资源策略为联合身份用户授予您的 AWS 资源的访问权限。

例如,假设您的 AWS 账户 号码为 111122223333,且您拥有希望允许 Susan 访问的 Amazon S3 存储桶。Susan 的临时安全凭证不包括该存储桶的策略。在这种情况下,您需要确保该存储桶的策略具有与 Susan 的 ARN (如 arn:aws:sts::111122223333:federated-user/Susan) 匹配的 ARN。

为不受信任的环境中的用户请求凭证

GetSessionToken API 操作向现有 IAM 用户返回一组临时安全凭证。此 API 对提高安全性非常有用,例如在已针对 IAM 用户启用 MFA 的情况下提出 AWS 请求。由于凭证是临时的,因此,在 IAM 用户通过不太安全的环境访问您的资源时,它们提供了增强的安全性。不太安全的环境示例包括移动设备或 Web 浏览器。

  1. 使用您的特定 IAM 用户的 AWS 安全凭证进行身份验证。必须使用有效的 AWS 安全凭证来进行此调用。

  2. 调用 GetSessionToken 操作。

  3. GetSessionToken 将返回临时安全凭证,其中包括会话令牌、访问密钥 ID 和秘密访问密钥。

默认情况下,IAM 用户的临时安全凭证的有效期最长为 12 小时。但是,您可以使用 DurationSeconds 参数请求短至 15 分钟或长达 36 小时的持续时间。出于安全考虑,AWS 账户根用户的令牌有效期仅为一小时。

以下示例显示了使用 GetSessionToken 的示例请求和响应。响应也包括了临时安全凭证的过期时间。

例 示例请求
https://sts.amazonaws.com/ ?Version=2011-06-15 &Action=GetSessionToken &DurationSeconds=1800 &AUTHPARAMS

示例中的 AUTHPARAMS 参数是您的签名 的占位符。签名是您必须在 AWS HTTP API 请求中包含的身份验证信息。建议使用 AWS 开发工具包创建 API 请求,这样做的一个好处是开发工具包将为您处理请求签名。如果您必须手动创建并签署 API 请求,请访问《Amazon Web Services 一般参考》中的 使用签名版本 4 签署 AWS 请求,以了解如何签署请求。

例 响应示例
<GetSessionTokenResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/"> <GetSessionTokenResult> <Credentials> <SessionToken> AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/L To6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3z rkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtp Z3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE </SessionToken> <SecretAccessKey> wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY </SecretAccessKey> <Expiration>2011-07-11T19:55:29.611Z</Expiration> <AccessKeyId>AKIAIOSFODNN7EXAMPLE</AccessKeyId> </Credentials> </GetSessionTokenResult> <ResponseMetadata> <RequestId>58c5dbae-abef-11e0-8cfe-09039844ac7d</RequestId> </ResponseMetadata> </GetSessionTokenResponse>

(可选)GetSessionToken 请求可能包括 SerialNumberTokenCode 值以进行 AWS Multi-Factor Authentication (MFA) 验证。如果提供的值有效,AWS STS 将提供包含 MFA 身份验证状态的临时安全凭证。然后,可以使用临时安全凭证访问受 MFA 保护的 API 操作或 AWS 网站,但前提是 MFA 身份验证有效。

下例展示一个 GetSessionToken 请求,其中包括 MFA 验证代码和设备序列号。

https://sts.amazonaws.com/ ?Version=2011-06-15 &Action=GetSessionToken &DurationSeconds=7200 &SerialNumber=YourMFADeviceSerialNumber &TokenCode=123456 &AUTHPARAMS
注意

对 AWS STS 的调用可能针对的是全局端点,也可能针对的是激活您的 AWS 账户 的任何区域终端节点。有关更多信息,请参阅区域和终端节点的 AWS STS 部分

示例中的 AUTHPARAMS 参数是您的签名 的占位符。签名是您必须在 AWS HTTP API 请求中包含的身份验证信息。建议使用 AWS 开发工具包创建 API 请求,这样做的一个好处是开发工具包将为您处理请求签名。如果您必须手动创建并签署 API 请求,请参阅《Amazon Web Services 一般参考》中的 使用签名版本 4 签署 AWS 请求,以了解如何签署请求。