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-1”或“us-west-1”区域中的实例。IAM 用户或角色不允许将角色传递给其他服务,也不允许 Amazon EC2 将角色用于其他区域中的实例。

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

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

iam:AWSServiceName

字符串运算符结合使用。

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

iam:OrganizationsPolicyId

字符串运算符结合使用。

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

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。

注意

某些服务不支持该条件键,例如 AWS CodeBuild 和 AWS CodeCommit。

iam:PermissionsBoundary

字符串运算符结合使用。

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

iam:PolicyARN

ARN 运算符结合使用。

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

iam:ResourceTag/key-name

字符串运算符结合使用。

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

注意

IAM 不支持使用 aws:ResourceTag 全局条件键。AWS STS 支持 IAM 键和全局键。

您可采用键/值对的形式向用户或角色添加自定义属性。有关 IAM 标签的更多信息,请参阅标记 IAM 用户和角色。您可以使用 iam:ResourceTag控制访问(针对 IAM 用户和角色)。但是,由于 IAM 不支持组的标签,因此您不能使用标签来控制对组的访问。

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

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

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

您可以使用 Web 联合身份验证为通过身份提供程序 (IdP) 进行身份验证的用户提供临时安全凭证。此类提供商的示例包括 Login with Amazon、Amazon Cognito、Google 或 Facebook。在此情况下,当使用临时安全凭证发出请求时,将会有额外条件键可用。您可以使用这些键编写策略,将联合身份用户的访问权限限制为与特定提供商、应用程序或用户关联的资源。这些键通常在角色的信任策略中使用。

aws:FederatedProvider

字符串运算符结合使用。

FederatedProvider 密钥可以识别是使用哪个 IdP 对用户进行身份验证的。例如,如果用户已通过 Amazon Cognito 进行身份验证,则键将包含 cognito-identity.amazonaws.com。同样,如果已通过 Login with Amazon 对用户进行身份验证,则键将包含值 www.amazon.com。您可能使用类似以下资源策略中的键,该策略在资源的 ARN 中使用 aws:FederatedProvider 键作为策略变量。如果用户是使用 IdP 进行的身份验证,那么策略将允许这些用户从 Amazon S3 存储桶中的文件夹获取对象。但是,存储桶必须是对用户进行身份验证的提供商特定的。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::BUCKET-NAME/${aws:FederatedProvider}/*" } }
amr

字符串运算符结合使用。

示例cognito-identity.amazonaws.com.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 键结合使用。

示例

  • accounts.google.com:aud

  • cognito-identity.amazonaws.com: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:app_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 键结合使用。

有关 Web 联合身份验证的更多信息

有关 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 策略使用。有关更多信息,请参阅唯一标识基于 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 属性的一般信息,请参阅 Internet2 网站。有关 eduPerson 属性的列表,请参阅 eduPerson 对象类规范 (201203)

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

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

SAML 角色权限策略

在定义允许用户在 AWS 中访问的内容的 SAML 联合角色权限策略中,您可以包含以下键:

saml:namequalifier

字符串运算符结合使用。

这包含代表 saml:docsaml:iss 值组合的一个哈希值。它用作命名空间限定词;saml:namequalifiersaml:sub 组合可唯一标识用户。

saml:sub

字符串运算符结合使用。

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

saml:sub_type

字符串运算符结合使用。

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

有关使用这些密钥的更多信息,请参阅关于基于 SAML 2.0 的联合身份验证

AWS STS 的可用键

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

sts:AWSServiceName

字符串运算符结合使用。

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

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

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

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

sts:DurationSeconds

数字运算符结合使用。

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

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

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

sts:ExternalId

字符串运算符结合使用。

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

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

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

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

sts:RoleSessionName

字符串运算符结合使用。

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

可用性 – 当委托人使用 AWS 管理控制台、assume-role CLI 命令或 AssueRole API 操作代入角色时,则请求中存在此键。

您可以在角色信任策略中使用此键,以要求您的用户在代入角色时提供特定的会话名称。例如,您可以要求 IAM 用户指定自己的用户名作为其会话名称。在 IAM 用户代入角色后,活动将与匹配用户名的会话名称一起显示在 AWS CloudTrail 日志中。这使管理员能够更轻松地确定哪个用户在 AWS 中执行了特定操作。

以下角色信任策略要求账户 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:TransitiveTagKeys

字符串运算符结合使用。

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

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

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

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