IAM 和 AWS STS 条件上下文密钥 - AWS Identity and Access Management

IAM 和 AWS STS 条件上下文密钥

您可以在 JSON 策略中使用 Condition 元素来测试所有 AWS 请求的请求上下文中所包含键的值。这些键提供有关请求本身或请求所引用资源的信息。在允许用户请求的操作之前,您可以检查这些键是否具有指定值。这样,您就可以精细控制 JSON 策略语句何时与传入的请求匹配或不匹配。有关如何在 JSON 策略中使用 Condition 元素的信息,请参阅IAM JSON 策略元素:Condition

本主题介绍了由 IAM 服务定义和提供的键(带 iam: 前缀)以及由 AWS Security Token Service (AWS STS) 服务定义和提供的键(带 sts: 前缀)。其他几个 AWS 服务也提供与该服务定义的操作和资源相关的服务特定键。有关更多信息,请参阅 AWS 服务的操作、资源和条件键。支持条件键的服务的文档通常包含附加信息。例如,有关可在 Amazon S3 资源的策略中使用的密钥信息,请参阅 Amazon Simple Storage Service 用户指南中的 Amazon S3 策略密钥

IAM 的可用键

可以在控制对 IAM 资源的访问的策略中使用以下条件键:

iam:AssociatedResourceArn

ARN 运算符结合使用。

指定此角色在目标服务上关联的资源的 ARN。资源通常属于主体将角色传递到的服务。有时,资源可能属于第三个服务。例如,您可以将角色传递给他们在 Amazon EC2 实例上使用的 Amazon EC2 Auto Scaling。在这种情况下,条件将匹配 Amazon EC2 实例的 ARN。

此条件键仅适用于策略中的 PassRole 操作。无法使用它来限制任何其他操作。

在策略中使用此条件键可允许实体传递角色,但前提是角色与指定资源相关联。您可以使用通配符 (*) 允许对特定类型的资源执行操作,而无需限制区域或资源 ID。例如,您可以允许 IAM 用户或角色将任何角色传递给 Amazon EC2 服务,以便用于 us-east-1us-west-1 区域中的实例。不允许将 IAM 用户或角色传递给其他服务。此外,它不允许 Amazon EC2 将角色用于其他区域中的实例。

{ "Effect": "Allow", "Action": "iam:PassRole", "Resource": "*", "Condition": { "StringEquals": {"iam:PassedToService": "ec2.amazonaws.com"}, "ArnLike": { "iam:AssociatedResourceARN": [ "arn:aws:ec2:us-east-1:111122223333:instance/*", "arn:aws:ec2:us-west-1:111122223333:instance/*" ] } } }
注意

支持 iam:PassedToService 的 AWS 服务也支持此条件键。

iam:AWSServiceName

字符串运算符结合使用。

指定此角色将附加到的 AWS 服务。

在此示例中,如果服务名称为 access-analyzer.amazonaws.com,您将允许实体创建与服务关联的角色。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "iam:CreateServiceLinkedRole", "Resource": "*", "Condition": { "StringLike": { "iam:AWSServiceName": "access-analyzer.amazonaws.com" } } }] }
iam:FIDO-certification

字符串运算符结合使用。

在注册 FIDO 安全密钥时,检查 MFA 设备 FIDO 认证级别。从 FIDO Alliance Metadata Service(MDS)获取设备认证。如果您的 FIDO 安全密钥的认证状态或级别发生变化,则除非设备取消注册,然后重新注册,以获取更新的认证信息,否则不会对其进行更新。

L1、L1plus、L2、L2plus、L3、L3plus 的可能值

在本例中,您注册了安全密钥,并为设备检索 FIDO 1 级 + 认证。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "iam:EnableMFADevice", "Resource": "*", "Condition": { "StringEquals": { "iam:RegisterSecurityKey" : "Create" } } }, { "Effect": "Allow", "Action": "iam:EnableMFADevice", "Resource": "*", "Condition": { "StringEquals": { "iam:RegisterSecurityKey" : "Activate", "iam:FIDO-certification": "L1plus" } } } ] }
iam:FIDO-FIPS-140-2-certification

字符串运算符结合使用。

在注册 FIDO 安全密钥时,检查 MFA 设备 FIPS-140-2 验证认证级别。从 FIDO Alliance Metadata Service(MDS)获取设备认证。如果您的 FIDO 安全密钥的认证状态或级别发生变化,则除非设备取消注册,然后重新注册,以获取更新的认证信息,否则不会对其进行更新。

L1、L2、L3、L4 的可能值

在本例中,您注册了安全密钥,并为设备检索 FIPS-140-2 2 级认证。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "iam:EnableMFADevice", "Resource": "*", "Condition": { "StringEquals": { "iam:RegisterSecurityKey" : "Create" } } }, { "Effect": "Allow", "Action": "iam:EnableMFADevice", "Resource": "*", "Condition": { "StringEquals": { "iam:RegisterSecurityKey" : "Activate", "iam:FIDO-FIPS-140-2-certification": "L2" } } } ] }
iam:FIDO-FIPS-140-3-certification

字符串运算符结合使用。

在注册 FIDO 安全密钥时,检查 MFA 设备 FIPS-140-3 验证认证级别。从 FIDO Alliance Metadata Service(MDS)获取设备认证。如果您的 FIDO 安全密钥的认证状态或级别发生变化,则除非设备取消注册,然后重新注册,以获取更新的认证信息,否则不会对其进行更新。

L1、L2、L3、L4 的可能值

在本例中,您注册了安全密钥,并为设备检索 FIPS-140-3 3 级认证。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "iam:EnableMFADevice", "Resource": "*", "Condition": { "StringEquals": { "iam:RegisterSecurityKey" : "Create" } } }, { "Effect": "Allow", "Action": "iam:EnableMFADevice", "Resource": "*", "Condition": { "StringEquals": { "iam:RegisterSecurityKey" : "Activate", "iam:FIDO-FIPS-140-3-certification": "L3" } } } ] }
iam:RegisterSecurityKey

字符串运算符结合使用。

检查 MFA 设备支持的当前状态。

CreateActivate 的可能值。

在本例中,您注册了安全密钥,并为设备检索 FIPS-140-3 1 级认证。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "iam:EnableMFADevice", "Resource": "*", "Condition": { "StringEquals": { "iam:RegisterSecurityKey" : "Create" } } }, { "Effect": "Allow", "Action": "iam:EnableMFADevice", "Resource": "*", "Condition": { "StringEquals": { "iam:RegisterSecurityKey" : "Activate", "iam:FIDO-FIPS-140-3-certification": "L1" } } } ] }
iam:OrganizationsPolicyId

字符串运算符结合使用。

检查具有指定 AWS Organizations ID 的策略是否与请求中使用的策略匹配。要查看使用此条件键的示例 IAM policy,请参阅。IAM:查看 Organizations 策略的上次访问的服务信息

iam:PassedToService

字符串运算符结合使用。

指定可将角色传递到的服务的服务主体。此条件键仅适用于策略中的 PassRole 操作。无法使用它来限制任何其他操作。

在策略中使用此条件键时,请使用服务主体指定服务。服务主体是可在策略的 Principal 元素中指定的服务的名称。常见格式为:SERVICE_NAME_URL.amazonaws.com

您可以使用 iam:PassedToService 限制您的用户,使其只能将角色传递到特定服务。例如,用户可能会创建一个服务角色,该角色信任 CloudWatch 代表用户将日志数据写入到 Amazon S3 存储桶。之后,用户必须将一个权限策略和一个信任策略附加到新的服务角色。在此情况下,信任策略必须指定 cloudwatch.amazonaws.com 元素中的 Principal。要查看允许用户将角色传递给 CloudWatch 的策略,请参阅 IAM:将 IAM 角色传递给特定 AWS 服务

通过使用此条件键,您可以确保用户仅为您指定的服务创建服务角色。例如,如果具有之前的策略的用户尝试为 Amazon EC2 创建服务角色,操作将失败。失败的原因是因为用户无权将角色传递到 Amazon EC2。

有时,您会将角色传递给一个服务,随后将角色传递给另一个服务。iam:PassedToService 仅包含担任角色的最终服务,而不包括传递角色的中间服务。

注意

某些服务不支持此条件键。

iam:PermissionsBoundary

ARN 运算符结合使用。

检查指定的策略附加为 IAM 主体资源上的权限边界。有关更多信息,请参阅 IAM 实体的权限边界

iam:PolicyARN

ARN 运算符结合使用。

检查涉及托管策略的请求中的托管策略的 Amazon Resource Name (ARN)。有关更多信息,请参阅控制对策略的访问

iam:ResourceTag/key-name

字符串运算符结合使用。

检查附加到身份资源(用户或角色)的标签是否与指定的键名称和键值匹配。

注意

IAM 和 AWS STS 同时支持 iam:ResourceTag IAM 条件键和 aws:ResourceTag 全局条件键。

您可采用键值对的形式向 IAM 资源添加自定义属性。有关 IAM 资源的标签的更多信息,请参阅 标记 IAM 资源。您可以使用 ResourceTag 控制对 AWS 资源(包括 IAM 资源)的访问。但是,由于 IAM 不支持组的标签,因此您不能使用标签来控制对组的访问。

此示例说明如何创建基于身份的策略以允许删除具有 status=terminated 标签的用户。要使用此策略,请将示例策略中的斜体占位符文本替换为您自己的信息。然后,按照创建策略编辑策略中的说明操作。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "iam:DeleteUser", "Resource": "*", "Condition": {"StringEquals": {"iam:ResourceTag/status": "terminated"}} }] }

AWS Web 联合身份验证的可用键

您可以使用 Web 身份联合验证,将通过兼容 OpenID Connect 提供程序(OP)进行身份验证的用户的临时安全凭证,提供给您 AWS 中的 IAM OpenID Connect(OIDC)身份提供程序。此类提供商的示例包括 Login with Amazon、Amazon Cognito、Google 或 Facebook。可以使用您自己的 OpenID OP 中的身份令牌 (id_tokens),也可以使用发给 Amazon Elastic Kubernetes Service 集群的服务账户的 id_tokens。在此情况下,当使用临时安全凭证发出请求时,将会有额外条件键可用。您可以使用这些键编写策略,将联合身份用户的访问权限限制为与特定提供商、应用程序或用户关联的资源。这些键通常在角色的信任策略中使用。使用 OIDC 提供商的名称和声明(:aud:azp:amr:sub)定义条件键。对于 Amazon Cognito 使用的角色,键是使用 cognito-identity.amazonaws.com 和声明定义的。

amr

字符串运算符结合使用。

示例cognito-identity.amazonaws.com:amr

如果您正在使用 Amazon Cognito 进行 Web 联合身份验证,则 cognito-identity.amazonaws.com:amr 键(身份验证方法引用)包含有关该用户的登录信息。该键有多个值,这意味着您要在使用条件集合运算符的策略中对它进行测试。该键可包含以下值:

  • 如果用户未经过身份验证,则该键仅包含 unauthenticated

  • 如果该用户已经过身份验证,则该键包含值 authenticated 以及在调用中使用的登录提供商的名称 (graph.facebook.comaccounts.google.comwww.amazon.com)。

例如,某 Amazon Cognito 角色信任策略中的以下条件测试用户是否未经过身份验证:

"Condition": { "StringEquals": { "cognito-identity.amazonaws.com:aud": "us-east-2:identity-pool-id" }, "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "unauthenticated" } }
aud

字符串运算符结合使用。

使用 aud 条件键可验证 Google 客户端 ID 或 Amazon Cognito 身份池 ID 是否与您在策略中指定的 ID 匹配。对于同一身份提供程序,可以将 aud 键与 sub 键结合使用。

示例:

  • graph.facebook.com:app_id

  • accounts.google.com:aud

  • cognito-identity.amazonaws.com:aud

graph.facebook.com:app_id 字段提供的受众上下文与其他身份提供程序使用的 aud 字段相匹配。

accounts.google.com:aud 条件键与以下 Google ID 令牌字段匹配。

  • 应用程序的 OAuth 2.0 Google 客户端 ID 的 aud(如果未设置 azp 字段)。如果设置了 azp 字段,则 aud 字段将与 accounts.google.com:oaud 条件键匹配。

  • azp(如果设置了 azp 字段)。对于 Web 应用程序和 Android 应用程序具有不同的 OAuth 2.0 Google 客户端 ID 但共享相同的 Google API 项目的混合应用程序,可能会出现这种情况。

有关 Google audazp 字段的更多信息,请参阅 Google Identity Platform OpenID Connect 指南。

在使用 accounts.google.com:aud 条件键编写策略时,您必须了解该应用程序是否为设置 azp 字段的混合应用程序。

azp 字段未设置

以下示例策略适用于未设置 azp 字段的非混合应用程序。在此情况下,Google ID 令牌 aud 字段值将与 accounts.google.com:audaccounts.google.com:oaud 条件键值匹配。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": {"Federated": "accounts.google.com"}, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "accounts.google.com:aud": "aud-value", "accounts.google.com:oaud": "aud-value", "accounts.google.com:sub": "sub-value" } } } ] }

azp 字段已设置

以下示例策略适用于设置 azp 字段的混合应用程序。在此情况下,Google ID 令牌 aud 字段值仅与 accounts.google.com:oaud 条件键值匹配。azp 字段值与 accounts.google.com:aud 条件键值匹配。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": {"Federated": "accounts.google.com"}, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "accounts.google.com:aud": "azp-value", "accounts.google.com:oaud": "aud-value", "accounts.google.com:sub": "sub-value" } } } ] }
id

字符串运算符结合使用。

示例:

  • graph.facebook.com:id

  • www.amazon.com:app_id

  • www.amazon.com:user_id

使用这些键可验证应用程序(或站点)ID 或用户 ID 是否与您在策略中指定的 ID 匹配。这适用于 Facebook 或 Login with Amazon。对于同一身份提供程序,可以将 app_id 键与 id 键结合使用。

oaud

字符串运算符结合使用。

示例accounts.google.com:oaud

如果您使用 Google 进行 Web 联合身份验证,则此键将指定该 ID 令牌用于的 Google 受众 (aud)。它必须是应用程序的 OAuth 2.0 客户端 ID 之一。

sub

字符串运算符结合使用。

示例:

  • accounts.google.com:sub

  • cognito-identity.amazonaws.com:sub

使用这些键可验证用户 ID 是否与您在策略中指定的 ID 匹配。对于同一身份提供程序,可以将 sub 键与 aud 键结合使用。

{ "Version": "2012-10-17", "Statement": [ "Condition": { "StringEquals": { "oidc.eks.us-east-1.amazonaws.com/id/111122223333:aud": "sts.amazonaws.com", "oidc.eks.us-east-1.amazonaws.com/id/111122223333:sub": "system:serviceaccount:default:assumer" } } ] }
有关 Web 联合身份验证的更多信息

有关 Web 联合身份验证的更多信息,请参阅以下内容:

跨服务 AWS Web 身份联合验证上下文键

某些 Web 身份联合验证条件键可用于角色信任策略中,以定义允许哪些用户在其他 AWS 服务中进行访问。以下是条件键,当联合主体担任其他角色时,可以在角色信任策略中使用它们,也可以在其他 AWS 服务的资源策略中使用它们来授权联合主体访问资源。如果您正在使用 Amazon Cognito 进行 Web 身份联合验证,则这些键在进行用户身份验证时可用。

选择条件键以查看描述。

注意

在外部身份提供者(IdP)对初始 AssumeRoleWithWebIdentity 操作进行身份验证和授权后,没有其他基于 Web 身份的联合身份验证条件键可供使用。

基于 SAML 的 AWS STS 联合身份验证的可用键

如果您通过 AWS Security Token Service (AWS STS) 使用基于 SAML 的联合,则可以在策略中包含更多条件键。

SAML 角色信任策略

在角色的信任策略中,您可以包括以下键,以帮助您确定发起人是否有权担任角色。除了 saml:doc,所有值均源自 SAML 断言。在创建或编辑带条件的策略时,可在 IAM 控制台可视化编辑器中使用列表中的所有项目。标有 [] 的项目可以 具有指定类型列表中的值。

saml:aud

字符串运算符结合使用。

SAML 断言提交到的终端节点 URL。此键的值来自断言中的 SAML Recipient 字段,而不是 Audience 字段。

saml:commonName[]

字符串运算符结合使用。

这是 commonName 属性。

saml:cn[]

字符串运算符结合使用。

这是 eduOrg 属性。

saml:doc

字符串运算符结合使用。

这代表担任角色所用的主体。格式为 account-ID/provider-friendly-name,例如 123456789012/SAMLProviderName账户 ID 值指拥有 SAML 提供商的账户。

saml:edupersonaffiliation[]

字符串运算符结合使用。

这是 eduPerson 属性。

saml:edupersonassurance[]

字符串运算符结合使用。

这是 eduPerson 属性。

saml:edupersonentitlement[]

字符串运算符结合使用。

这是 eduPerson 属性。

saml:edupersonnickname[]

字符串运算符结合使用。

这是 eduPerson 属性。

saml:edupersonorgdn

字符串运算符结合使用。

这是 eduPerson 属性。

saml:edupersonorgunitdn[]

字符串运算符结合使用。

这是 eduPerson 属性。

saml:edupersonprimaryaffiliation

字符串运算符结合使用。

这是 eduPerson 属性。

saml:edupersonprimaryorgunitdn

字符串运算符结合使用。

这是 eduPerson 属性。

saml:edupersonprincipalname

字符串运算符结合使用。

这是 eduPerson 属性。

saml:edupersonscopedaffiliation[]

字符串运算符结合使用。

这是 eduPerson 属性。

saml:edupersontargetedid[]

字符串运算符结合使用。

这是 eduPerson 属性。

saml:eduorghomepageuri[]

字符串运算符结合使用。

这是 eduOrg 属性。

saml:eduorgidentityauthnpolicyuri[]

字符串运算符结合使用。

这是 eduOrg 属性。

saml:eduorglegalname[]

字符串运算符结合使用。

这是 eduOrg 属性。

saml:eduorgsuperioruri[]

字符串运算符结合使用。

这是 eduOrg 属性。

saml:eduorgwhitepagesuri[]

字符串运算符结合使用。

这是 eduOrg 属性。

saml:givenName[]

字符串运算符结合使用。

这是 givenName 属性。

saml:iss

字符串运算符结合使用。

发布者,以 URN 表示。

saml:mail[]

字符串运算符结合使用。

这是 mail 属性。

saml:name[]

字符串运算符结合使用。

这是 name 属性。

saml:namequalifier

字符串运算符结合使用。

基于 SAML 提供商的友好名称的哈希值。该值是以下值按顺序的连接,以“/”字符分隔:

  1. Issuer 响应值 (saml:iss)

  2. AWS 账户 ID

  3. IAM 中 SAML 提供商的友好名称(ARN 的最后一部分)

账户 ID 与 SAML 提供商的易记名称的串联可作为键 saml:doc 供 IAM policy 使用。有关更多信息,请参阅唯一标识基于 SAML 的联合中的用户

saml:organizationStatus[]

字符串运算符结合使用。

这是 organizationStatus 属性。

saml:primaryGroupSID[]

字符串运算符结合使用。

这是 primaryGroupSID 属性。

saml:sub

字符串运算符结合使用。

这是该陈述的主题,其中包含唯一标识组织中某个用户的值 (例如 _cbb88bf52c2510eabe00c1642d4643f41430fe25e3)。

saml:sub_type

字符串运算符结合使用。

此键的值可以是 persistenttransient 或由 SAML 断言中使用的 FormatSubject 元素的完整 NameID URI 构成。persistent 值表示在不同会话之间用户的 saml:sub 值是相同的。如果值为 transient,则用户在每个会话中拥有不同的 saml:sub 值。有关 NameID 元素的 Format 属性的信息,请参阅为身份验证响应配置 SAML 断言

saml:surname[]

字符串运算符结合使用。

这是 surnameuid 属性。

saml:uid[]

字符串运算符结合使用。

这是 uid 属性。

saml:x500UniqueIdentifier[]

字符串运算符结合使用。

这是 x500UniqueIdentifier 属性。

有关 eduPersoneduOrg 属性的一般信息,请参阅 REFEDS Wiki 网站。有关 eduPerson 属性的列表,请参阅 eduPerson 对象类规范 (201602)

列表类型的条件键可以包含多个值。要在策略中创建条件以获取列表值,可以使用集合运算符ForAllValuesForAnyValue)。例如,要支持从属关系为“教员”或“职员”(而非“学生”)的用户,可以使用下面这样的条件:

"Condition": { "ForAllValues:StringLike": { "saml:edupersonaffiliation":[ "faculty", "staff"] } }

基于 SAML 的跨服务 AWS STS 联合身份验证上下文键

一些基于 SAML 的联合身份验证条件键可用于后续请求中,以授权其他服务和 AssumeRole 调用中的 AWS 操作。以下是条件键,当联合主体担任其他角色时,可以在角色信任策略中使用它们,也可以在其他 AWS 服务的资源策略中使用它们来授权联合主体访问资源。有关使用这些键的更多信息,请参阅关于基于 SAML 2.0 的联合身份验证

选择条件键以查看描述。

注意

在初始外部身份提供者(IdP)身份验证响应后,没有其他基于 SAML 的联合身份验证条件键可供使用。

AWS STS 的可用键

您可以对使用 AWS Security Token Service (AWS STS) 操作担任的角色使用 IAM 角色信任策略中的以下条件键。

saml:sub

字符串运算符结合使用。

这是该陈述的主题,其中包含唯一标识组织中某个用户的值 (例如 _cbb88bf52c2510eabe00c1642d4643f41430fe25e3)。

sts:AWSServiceName

字符串运算符结合使用。

使用此键指定可以在其中使用持有者令牌的服务。在策略中使用此条件键时,请使用服务主体指定服务。服务主体是可在策略的 Principal 元素中指定的服务的名称。例如,codeartifact.amazonaws.com 是 AWS CodeArtifact 服务主体。

某些 AWS 服务需要您有权获取 AWS STS 服务持有者令牌,然后您才能以编程方式访问它们的资源。例如,AWS CodeArtifact 要求主体使用持有者令牌来执行某些操作。aws codeartifact get-authorization-token 命令返回一个持有者令牌。然后,您可以使用持有者令牌来执行 AWS CodeArtifact 操作。有关持有者令牌的更多信息,请参阅 使用持有者令牌

Availability(可用性)- 此键存在于获取持有者令牌的请求中。您不能直接调用 AWS STS 以获取持有者令牌。当您在其他服务中执行某些操作时,服务代表您请求持有者令牌。

您可以使用此条件键以允许主体获取用于特定服务的持有人令牌。

sts:DurationSeconds

数字运算符结合使用。

使用此键指定主体在获取 AWS STS 持有者令牌时可以使用的持续时间(以秒为单位)。

某些 AWS 服务需要您有权获取 AWS STS 服务持有者令牌,然后您才能以编程方式访问它们的资源。例如,AWS CodeArtifact 要求主体使用持有者令牌来执行某些操作。aws codeartifact get-authorization-token 命令返回一个持有者令牌。然后,您可以使用持有者令牌来执行 AWS CodeArtifact 操作。有关持有者令牌的更多信息,请参阅 使用持有者令牌

Availability(可用性)- 此键存在于获取持有者令牌的请求中。您不能直接调用 AWS STS 以获取持有者令牌。当您在其他服务中执行某些操作时,服务代表您请求持有者令牌。此键不适用于 AWS STS assume-role 操作。

sts:ExternalId

字符串运算符结合使用。

使用此键可要求主体在代入 IAM 角色时提供特定标识符。

可用性 - 如果主体在使用 AWS CLI 或 AWS API 代入角色时提供外部 ID,则请求中存在此键。

在其他账户中担任角色时可能需要的唯一标识符。如果角色所属的账户的管理员为您提供了外部 ID,请在 ExternalId 参数中提供该值。该值可以是任意字符串,如密码或账号。外部 ID 的主要功能是解决并防止混淆代理人问题。有关外部 ID 和混淆代理人问题的更多信息,请参阅如何在向第三方授予对 AWS 资源的访问权时使用外部 ID

ExternalId 值的长度必须最少为 2 个字符,最多为 1224 个字符。该值必须是字母数字,没有空格。它还可以包含以下符号:加号 (+)、等号 (=)、逗号 (,)、句点 (.)、@ 符号、冒号 (:)、正斜杠 (/) 和连字符 (-)。

sts:RequestContext/context-key

字符串运算符结合使用。

使用该键可将在请求中传递的可信令牌颁发者签名上下文断言中嵌入的会话上下文键值对与角色信任策略中指定的上下文键值进行比较。

可用性 – 如果在使用 AWS STS AssumeRole API 操作代入了角色,则在 ProvidedContexts 请求参数中提供上下文断言时,该请求中存在该键。

此上下文键的格式为 "sts:RequestContext/context-key":"context-value",其中 context-keycontext-value 是上下文键值对。在请求中传递的已签名上下文断言中嵌入多个上下文键时,每个键值对都有一个上下文键。您必须在角色信任策略中授予 sts:SetContext 操作的权限,才能允许主体在生成的会话令牌中设置上下文键。

您可以在角色信任策略中使用该键,以在用户代入角色时根据用户或其属性实施精细的访问控制。例如,您可以将 Amazon Redshift 配置为 IAM Identity Center 应用程序,以代表您的员工或联合身份访问 Amazon S3 资源。

以下角色信任策略允许 Amazon Redshift 服务主体代入账户 111122223333 中的角色。它还向 Amazon Redshift 服务主体授予在请求中设置上下文键的权限,前提是 identitystore:UserId 上下文键值设置为 1111-22-3333-44-5555。代入该角色后,活动将在 AWS CloudTrail 日志的 AdditionalEventData 元素中显示,其中包含由上下文提供程序在代入角色请求中设置的会话上下文键值对。这样,当不同的主体使用角色时,管理员可以更轻松地区分角色会话。键值对由指定的上下文提供程序设置,而不是由 AWS CloudTrail 或 AWS STS 设置。这使上下文提供程序可以控制 CloudTrail 日志和会话信息中包含哪些上下文。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "redshift.amazonaws.com" }, "Action": [ "sts:AssumeRole", "sts:SetContext" ], "Condition": { "ForAllValues:ArnEquals": { "sts:RequestContextProviders": [ "arn:aws:iam::aws:contextProvider/IdentityCenter" ] }, "StringEquals": { "aws:SourceAccount": "111122223333", "sts:RequestContext/identitystore:UserId": "1111-22-3333-44-5555" } } } ] }
sts:RequestContextProviders

ARN 运算符结合使用。

使用该键可将请求中的上下文提供程序 ARN 与角色信任策略中指定的上下文提供程序 ARN 进行比较。

可用性 – 如果在使用 AWS STS AssumeRole API 操作代入了角色,则在 ProvidedContexts 请求参数中提供上下文断言时,该请求中存在该键。

以下示例条件检查请求中传递的上下文提供程序 ARN 是否与角色信任策略条件中指定的 ARN 匹配。

"Condition": { "ForAllValues:ArnEquals": { "sts:RequestContextProviders": [ "arn:aws:iam::aws:contextProvider/IdentityCenter" ] } }
sts:RoleSessionName

字符串运算符结合使用。

使用此键可将主体在代入角色时指定的会话名称与策略中指定的值进行比较。

可用性 - 当主体使用 AWS Management Console 管理控制台、assume-role CLI 命令或 AWS STS AssumeRole API 操作代入角色时,则请求中存在此键。

您可以在角色信任策略中使用此键,以要求您的用户在代入角色时提供特定的会话名称。例如,您可以要求 IAM 用户指定自己的用户名作为其会话名称。在 IAM 用户代入角色后,活动将与匹配用户名的会话名称一起显示在 AWS CloudTrail 日志中。这样,当不同的主体使用角色时,管理员可以更轻松地区分角色会话。

以下角色信任策略要求账户 111122223333 中的 IAM 用户在代入角色时提供其 IAM 用户名作为会话名称。使用条件键中的 aws:username 条件变量来强制执行此要求。此策略允许 IAM 用户代入策略附加到的角色。此策略禁止任何使用临时凭证的人员代入角色,因为 username 变量仅适用于 IAM 用户。

重要

您可以使用任何可用的单值条件密钥作为变量。您不能使用多值条件键作为变量。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "RoleTrustPolicyRequireUsernameForSessionName", "Effect": "Allow", "Action": "sts:AssumeRole", "Principal": {"AWS": "arn:aws:iam::111122223333:root"}, "Condition": { "StringLike": {"sts:RoleSessionName": "${aws:username}"} } } ] }

当管理员查看操作的 AWS CloudTrail 日志时,他们可以将会话名称与其账户中的用户名进行比较。在以下示例中,名为 matjac 的用户使用名为 MateoRole 的角色执行操作。之后,管理员会联系具有名为 matjac 用户的 Mateo Jackson。

"assumedRoleUser": { "assumedRoleId": "AROACQRSTUVWRAOEXAMPLE:matjac", "arn": "arn:aws:sts::111122223333:assumed-role/MateoRole/matjac" }

如果您允许使用角色进行跨账户访问,则一个账户中的用户可以代入另一个账户中的角色。CloudTrail 中列出的代入角色的 ARN 包括角色所在的账户。它不包括已代入角色的用户的账户。用户仅在账户中是唯一的。因此,我们建议您使用此方法以仅在 CloudTrail 日志中查看您管理的账户中的用户所代入的角色。您的用户可以在多个账户中使用相同的用户名。

sts:SourceIdentity

字符串运算符结合使用。

使用此键可将主体在代入角色时指定的源身份与策略中指定的值进行比较。

可用性 — 如果主体提供源身份,同时担任使用任何 AWS STS 担任角色 CLI 命令或 AWS STS AssumeRole API 操作时,此密钥将会出现在请求中。

您可以在角色信任策略中使用此键,以要求您的用户在代入角色时设置特定的源身份。例如,您可以要求您的工作人员或联合身份为源身份指定值。您可以将身份提供程序 (IdP) 配置为使用与用户关联的属性之一(例如用户名或电子邮件)作为源身份。然后,IdP 会将源身份作为其发送的断言或声明中的一个属性传递给 AWS。源身份属性的值标识担任角色的用户或应用程序。

在用户担任角色后,活动将在使用已设置源身份值的 AWS CloudTrail 日志中出现。这使管理员能够更轻松地确定什么角色在 AWS 中执行了操作。您必须授予 sts:SetSourceIdentity 操作相应权限以允许身份设置源身份。

sts:RoleSessionName 不同,在设置源身份后,无法更改该值。它将存在于源身份对角色执行的所有操作的请求上下文中。当您使用会话凭证担任另一个角色时,该值将保留到后续角色会话中。从一个角色代入另一个角色的过程称为角色链

您可以使用 aws:SourceIdentity 全局条件键根据后续请求中源身份的值进一步控制对 AWS 资源的访问权限。

以下角色信任策略允许 IAM 用户 AdminUser 在账户中担任角色 111122223333。它还会向 AdminUser 授予权限来设置源身份,只要源身份设置为 DiegoRamirez 即可。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAdminUserAssumeRole", "Effect": "Allow", "Principal": {"AWS": " arn:aws:iam::111122223333:user/AdminUser"}, "Action": [ "sts:AssumeRole", "sts:SetSourceIdentity" ], "Condition": { "StringEquals": {"sts:SourceIdentity": "DiegoRamirez"} } } ] }

要了解有关使用源身份信息的更多信息,请参阅 监控和控制使用所担任角色执行的操作

sts:TransitiveTagKeys

字符串运算符结合使用。

使用此键将请求中的可传递会话标签键,与在策略中指定的键进行比较。

Availability(可用性)- 使用临时安全凭证发出请求时,请求中存在此密钥。这些凭证包括使用任何 assume-role 操作或 GetFederationToken 操作创建的凭证。

当您使用临时安全凭证发出请求时,请求上下文包含 aws:PrincipalTag 上下文密钥。此键包括会话标签可传递会话标签和角色标签的列表。可传递会话标签是当您使用会话凭证代入另一个角色时,持续传递到所有后续会话中的标记。从一个角色代入另一个角色的过程称为角色链

您可以在策略中使用此条件键,以便要求在代入角色或联合身份用户身份时,要求将特定会话标签设置为可传递标签。