AWS 全局条件上下文密钥 - AWS Identity and Access Management

AWS 全局条件上下文密钥

主体向 AWS 发出请求时,AWS 会将请求信息收集到请求上下文中。您可以使用 JSON 策略的 Condition 元素将请求上下文中的键与您在策略中指定的键值进行比较。要了解有关在请求上下文中包含全局键的情况的更多信息,请参阅每个全局条件键的可用性信息。有关如何在 JSON 策略中使用 Condition 元素的信息,请参阅IAM JSON 策略元素:Condition

注意

如果您使用只在某些情况下可用的条件键,则可使用 IfExists 版本的条件运算符。如果请求上下文中缺少条件键,则策略将无法通过评估。例如,将以下条件块与 ...IfExists 运算符结合使用以在请求来自特定 IP 范围或特定 VPC 时进行匹配。如果请求上下文中未包含这两个键或其中之一,则条件仍将返回 true。仅当请求上下文中包含指定的键时,才检查值。

"Condition": { "IpAddressIfExists": {"aws:SourceIp" : ["xxx"] }, "StringEqualsIfExists" : {"aws:SourceVpc" : ["yyy"]} }

全局条件键是带有 aws: 前缀的条件键。AWS 服务既可支持全局条件键,也可提供包含服务前缀的服务特定键。例如,IAM 条件键包含 iam: 前缀。有关更多信息,请参阅 AWS 服务的操作、资源和条件键,然后选择要查看其键的服务。

重要

要将条件与具有多个键值的请求上下文进行比较,必须使用 ForAllValues 或者 ForAnyValue 集合运算符。仅将集合运算符用于多值条件键。不要将集合运算符用于单值条件键。有关更多信息,请参阅创建具有多个键或值的条件

aws:CalledVia

字符串运算符结合使用。

使用此键可以将策略中的服务与代表 IAM 主体(用户或角色)发出请求的服务进行比较。当主体向 AWS 服务发出请求时,该服务可能会使用主体的凭证向其他服务发出后续请求。aws:CalledVia 键包含链中代表主体发出请求的每个服务的有序列表。

例如,您可以使用 AWS CloudFormation 从 Amazon DynamoDB 表中读取和写入。然后,DynamoDB 使用 AWS Key Management Service (AWS KMS) 提供的加密操作。

  • 可用性 - 当支持 aws:CalledVia 的服务使用 IAM 主体的凭证向其他服务发出请求时,此键会出现在请求中。如果服务使用服务角色服务相关角色代表主体进行调用,则此键不存在。当主体直接进行调用时,此键也不存在。

  • 值类型— 多值

要在策略中使用 aws:CalledVia 条件键,您必须提供服务主体以允许或拒绝 AWS 服务请求。AWS 支持将以下服务用于 aws:CalledVia

CalledVia 服务
AWS 服务 服务主体
Amazon Athena athena.amazonaws.com
AWS CloudFormation cloudformation.amazonaws.com
Amazon DynamoDB dynamodb.amazonaws.com
AWS Key Management Service (AWS KMS) kms.amazonaws.com

要在任何 服务使用主体的凭证发出请求时允许或拒绝访问,请使用 aws:ViaAWSService 条件键。该条件键支持 AWS 服务。

aws:CalledVia 键是多值键。但是,您不能在条件下强制使用此键进行排序。使用上面的示例,User 1(用户 1)向 AWS CloudFormation 发出请求,然后依次调用 DynamoDB 和调用 AWS KMS。这是三个单独的请求。对 AWS KMS 的最终调用是由用户 1 通过 AWS CloudFormation,然后通过 DynamoDB 进行的。


                使用 aws:CalledVia 的示例

在这种情况下,请求上下文中的 aws:CalledVia 键包括 cloudformation.amazonaws.comdynamodb.amazonaws.com(按照该顺序)。如果您只关心调用是在请求链中的某个地方通过 DynamoDB 进行的,则可以在策略中使用此条件键。

例如,以下策略允许管理名为 my-example-key 的 AWS KMS 键,但前提为 DynamoDB 是发出请求的服务之一。ForAnyValue:StringEquals 条件运算符确保 DynamoDB 是发出调用的服务之一。如果主体直接调用 AWS KMS,则条件将返回 false,且此策略不允许请求。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "KmsActionsIfCalledViaDynamodb", "Effect": "Allow", "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey", "kms:DescribeKey" ], "Resource": "arn:aws:kms:region:111122223333:key/my-example-key", "Condition": { "ForAnyValue:StringEquals": { "aws:CalledVia": ["dynamodb.amazonaws.com"] } } } ] }

如果要强制由哪个服务在链中进行第一个或最后一个调用,可以使用 aws:CalledViaFirstaws:CalledViaLast 键。例如,以下策略允许管理 AWS KMS 中名为 my-example-key 的键。仅当链中包含多个请求时,才允许执行这些 AWS KMS 操作。第一个请求必须通过 AWS CloudFormation 发出,而最后一个请求必须通过 DynamoDB 发出。如果其他服务在链的中间发出请求,则仍然允许该操作。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "KmsActionsIfCalledViaChain", "Effect": "Allow", "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey", "kms:DescribeKey" ], "Resource": "arn:aws:kms:region:111122223333:key/my-example-key", "Condition": { "StringEquals": { "aws:CalledViaFirst": "cloudformation.amazonaws.com", "aws:CalledViaLast": "dynamodb.amazonaws.com" } } } ] }

当服务使用 IAM 主体的凭证调用另一个服务时,请求中会存在 aws:CalledViaFirstaws:CalledViaLast 键。它们表示在请求链中进行调用的第一个和最后一个服务。例如,假定 AWS CloudFormation 调用另一个名为 X Service 的服务,然后依次调用 DynamoDB,然后调用 AWS KMS。对 AWS KMS 的最终调用是由 User 1 依次通过 AWS CloudFormation、X Service 和 DynamoDB 进行的。首先通过 DynamoDB 进行调用,最后通过 AWS CloudFormation 进行调用。


                使用 aws:CalledViaFirst 和 aws:CalledViaLast 的示例

aws:CalledViaFirst

字符串运算符结合使用。

使用此键可以将策略中的服务与代表 IAM 主体(用户或角色)发出请求的第一个服务 进行比较。有关更多信息,请参阅aws:CalledVia

  • Availability(可用性)- 当服务使用 IAM 主体的凭证向其他服务发出至少一个其他请求时,此键会出现在请求中。如果服务使用服务角色服务相关角色代表主体进行调用,则此键不存在。当主体直接进行调用时,此键也不存在。

  • 值类型— 单值

aws:CalledViaLast

字符串运算符结合使用。

使用此键可以将策略中的服务与代表 IAM 主体(用户或角色)发出请求的最后一个服务进行比较。有关更多信息,请参阅aws:CalledVia

  • Availability(可用性)- 当服务使用 IAM 主体的凭证向其他服务发出至少一个其他请求时,此键会出现在请求中。如果服务使用服务角色服务相关角色代表主体进行调用,则此键不存在。当主体直接进行调用时,此键也不存在。

  • 值类型— 单值

aws:CurrentTime

日期运算符结合使用。

使用此键可将请求的日期和时间与您在策略中指定的日期和时间进行比较。要查看使用此条件键的示例策略,请参阅AWS:允许基于日期和时间进行访问

  • Availability(可用性)- 此键始终包含在请求上下文中。

  • 值类型— 单值

aws:EpochTime

日期运算符数字运算符结合使用。

使用此键可将请求的日期和时间(以纪元或 Unix 时间表示)与您在策略中指定的值进行比较。此键还接受自 1970 年 1 月 1 日以来的秒数。

  • Availability(可用性)- 此键始终包含在请求上下文中。

  • 值类型— 单值

aws:FederatedProvider

字符串运算符结合使用。

使用此密钥将主体的发布身份提供程序 (IdP) 与您在策略中指定的 IdP 进行比较。这意味着 IAM 角色正在使用 AssumeRoleWithWebIdentityAssumeRoleWithSAML AWS STS 操作代入。使用生成的角色会话的临时证书发出请求时,请求上下文将标识对原始联合身份进行身份验证的 IdP。

  • 可用性 — 当主体是角色会话主体并且该会话是使用第三方身份提供程序发出的时候,此密钥就存在。

  • 值类型— 单值

例如,如果用户已通过 Amazon Cognito 进行身份验证,则请求上下文将包含值 cognito-identity.amazonaws.com。同样,如果已通过 Login with Amazon 对用户进行身份验证,则请求上下文将包含值 www.amazon.com

您可以使用任何可用的单值条件密钥作为变量。以下示例基于资源的策略使用 aws:FederatedProvider 密钥作为资源的 ARN 中的策略变量。此策略允许使用 IdP 进行身份验证的任何主体,使用特定于发布身份提供程序的路径从 Amazon S3 存储桶获取对象。

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

aws:MultiFactorAuthAge

数字运算符结合使用。

使用此键可将自使用 MFA 向请求主体授权以来的秒数与您在策略中指定的数量进行比较。有关 MFA 的更多信息,请参阅 在 AWS 中使用多重身份验证 (MFA)

  • Availability(可用性)- 仅在使用 MFA 对进行调用的主体进行身份验证后,才将此键包含在请求上下文中。如果未使用 MFA,则此键不存在。

  • 值类型— 单值

aws:MultiFactorAuthPresent

布尔值运算符结合使用。

使用此键可检查是否已使用多重验证 (MFA) 来验证发出请求的临时安全凭证。

  • Availability(可用性)- 仅在主体使用临时凭证发出请求时,才将此键包含在请求上下文中。此键在 AWS CLI、AWS API 或使用长期凭证发出的 AWS 开发工具包请求中不存在。

  • 值类型— 单值

临时凭证用于验证 IAM 角色、联合身份用户、具有来自 sts:GetSessionToken 的临时令牌的 IAM 用户以及 AWS Management Console 用户。IAM 用户访问密钥是长期凭证,但在某些情况下,AWS 会代表 IAM 用户创建临时凭证以执行操作。在这些情况下,aws:MultiFactorAuthPresent 密钥存在于请求中,并设置为值 false。有两种常见情况可能会发生这种情形:

  • AWS Management Console中的 IAM 用户在不知情的情况下使用了临时凭证。用户使用其作为长期凭证的用户名和密码登录控制台。但在后台,控制台代表用户生成临时凭证。

  • 如果 IAM 用户对某个 AWS 服务进行调用,则该服务将重新使用该用户的凭证向其他服务发出另一个请求。例如,当调用 Athena 以访问 Amazon S3 存储桶或使用 AWS CloudFormation 创建 Amazon EC2 实例时。对于后续请求,AWS 使用临时凭证。

要了解哪些服务支持使用临时凭证,请参阅使用 IAM 的AWS服务

在使用长期凭证(例如,用户访问密钥对)调用 API 或 CLI 命令时,不提供 aws:MultiFactorAuthPresent 键。因此我们建议,当您检查此键时使用 ...IfExists 版本的条件运算符。

必须理解,以下 Condition 元素不是 检查请求是否使用 MFA 进行身份验证的可靠方式。

##### WARNING: NOT RECOMMENDED ##### "Effect" : "Deny", "Condition" : { "Bool" : { "aws:MultiFactorAuthPresent" : "false" } }

Deny 效果、Bool 元素和 false 值的这一组合可拒绝可以使用但未使用 MFA 进行身份验证的请求。这仅适用于支持使用 MFA 的临时凭证。此语句不会拒绝对使用长期凭证发出的请求或使用 MFA 进行身份验证的请求的访问权限。使用此示例时务必要谨慎,因为其逻辑复杂,并且未对是否实际使用 MFA 身份验证进行测试。

此外,请勿使用 Deny 效果、Null 元素和 true 的组合,因为该组合行为方式相同,但逻辑更加复杂。

建议的组合

我们建议您使用 BoolIfExists 运算符检查是否使用 MFA 对请求进行身份验证。

"Effect" : "Deny", "Condition" : { "BoolIfExists" : { "aws:MultiFactorAuthPresent" : "false" } }

DenyBoolIfExistsfalse 的组合将拒绝未使用 MFA 进行身份验证的请求。具体来说,它拒绝来自不包含 MFA 的临时凭证的请求。它还拒绝使用长期凭证发出的请求,例如使用访问密钥执行的 AWS CLI 或 AWS API 操作。*IfExists 运算符用于检查 aws:MultiFactorAuthPresent 键是否存在以及它是否可以存在(由其存在性指示)。当您要拒绝未使用 MFA 进行身份验证的任何请求时,可使用此运算符。这是更安全的,但可能会中断使用访问密钥访问 AWS CLI 或 AWS API 的任何代码或脚本。

替代组合

您还可以使用 BoolIfExists 运算符以允许通过 MFA 进行身份验证的请求以及使用长期凭证发出的 AWS CLI 或 AWS API 请求。

"Effect" : "Allow", "Condition" : { "BoolIfExists" : { "aws:MultiFactorAuthPresent" : "true" } }

此条件将匹配键存在键不存在的情况。AllowBoolIfExiststrue 的组合允许已使用 MFA 进行身份验证的请求或无法使用 MFA 进行身份验证的请求。这意味着,在请求者使用其长期访问密钥时,允许执行 AWS CLI、AWS API 和 AWS 开发工具包操作。该组合不允许来自临时凭证的请求,这些凭证可能包含 MFA,但未包含 MFA。

在使用 IAM 控制台可视化编辑器创建策略并选择需要 MFA 时,将应用该组合。该设置要求使用 MFA 进行控制台访问,但允许在没有 MFA 的情况下进行编程访问。

或者,您也可以使用 Bool 运算符,以便仅在使用 MFA 进行身份验证时允许编程和控制台请求。

"Effect" : "Allow", "Condition" : { "Bool" : { "aws:MultiFactorAuthPresent" : "true" } }

AllowBooltrue 的组合仅允许已进行 MFA 身份验证的请求。这仅适用于支持使用 MFA 的临时凭证。该语句不允许访问使用长期访问密钥发出的请求,也不允许访问在没有 MFA 的情况下使用临时凭证发出的请求。

请勿使用策略进行类似以下的构建,以检查 MFA 密钥是否存在:

##### WARNING: USE WITH CAUTION ##### "Effect" : "Allow", "Condition" : { "Null" : { "aws:MultiFactorAuthPresent" : "false" } }

Allow 效果、Null 元素和 false 值的组合仅允许可以使用 MFA 进行身份验证的请求,而不考虑该请求是否已实际进行身份验证。这组合允许使用临时凭证发出的所有请求,而对长期凭证拒绝访问权限。使用此示例时务必要谨慎,因为它未对是否实际使用 MFA 身份验证进行测试。

aws:PrincipalAccount

字符串运算符结合使用。

使用此键可将请求主体所属的账户与您在策略中指定的账户标识符进行比较。对于匿名请求,请求上下文将返回 anonymous

  • Availability(可用性)– 此键包含在所有请求(包括匿名请求)的请求上下文中。

  • 值类型 — 单值

在以下示例中,除了拥有账号 123456789012 的主体外,访问会被拒绝。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyAccessFromPrincipalNotInSpecificAccount", "Action": "service:*", "Effect": "Deny", "Resource": [ "arn:partition:service:region:accountID:resource" ], "Condition": { "StringNotEquals": { "aws:PrincipalAccount": [ "123456789012" ] } } } ] }

aws:PrincipalArn

使用 ARN 运算符字符串运算符

使用此键可将发出请求的主体的 Amazon Resource Name (ARN) 与您在策略中指定的 ARN 进行比较。对于 IAM 角色,请求上下文将返回角色的 ARN,而不是已代入角色的用户的 ARN。

  • Availability(可用性)- 此键包含在所有签名请求的请求上下文中。匿名请求不包括此键。您可以在此条件键中指定以下类型的主体:

    • IAM 角色

    • IAM 用户

    • AWS STS 联合用户会话

    • AWS 账户根用户

  • 值类型 — 单值

下表显示了您可以在 aws:PrincipalArn 条件键中指定的为不同类型的主体返回的请求上下文值:

  • IAM 角色 – 请求上下文包含条件键 aws:PrincipalArn 的以下值。请勿将所担任角色会话 ARN 指定为此条件键的值。有关所担任角色会话主体的更多信息,请参阅 角色会话主体

    arn:aws:iam::123456789012:role/role-name
  • IAM 用户 – 请求上下文包含条件键 aws:PrincipalArn 的以下值。

    arn:aws:iam::123456789012:user/user-name
  • AWS STS 联合用户会话 – 请求上下文包含条件键 aws:PrincipalArn 的以下值。

    arn:aws:sts::123456789012:federated-user/user-name
  • AWS 账户 根用户 – 请求上下文包含条件键 aws:PrincipalArn 的以下值。当您将根用户 ARN 指定为 aws:PrincipalArn 条件键,它仅限制 AWS 账户 根用户的权限。这不同于在基于资源策略的主体元素中指定根用户 ARN,后者会将权限委托给 AWS 账户。有关在基于资源策略的主体元素中指定根用户 ARN 的更多信息,请参阅 AWS 账户主体

    arn:aws:iam::123456789012:root

    您可以将根用户 ARN 指定为 AWS Organizations 服务控制策略(SCP)条件键 aws:PrincipalArn 的值。SCP 是一种组织策略,用于管理组织中的权限,仅影响组织中的成员账户。SCP 会限制成员账户中的 IAM 用户和角色的权限,包括成员账户的根用户。有关 SCP 对权限影响的更多信息,请参阅《Organizations 用户指南》中的 SCP 对权限的影响

aws:PrincipalIsAWSService

布尔值运算符结合使用。

使用此密钥可检查对您资源的调用是否直接由 AWS 服务主体提出。例如,AWS CloudTrail 使用服务主体 cloudtrail.amazonaws.com 将日志写入 Amazon S3 存储桶。当服务使用服务主体对资源执行直接操作时,请求上下文密钥将设置为 true。如果服务使用 IAM 主体的凭证代表主体发出请求时,上下文密钥设置为 false。如果服务使用服务角色服务相关角色代表主体进行调用,则请求也会被设为 false。

  • 可用性 — 此密钥存在于所有使用 AWS 凭证的签名 API 请求的请求上下文中。匿名请求不包括此键。

  • 值类型— 单值

您可以使用此条件键限制对可信身份和预期网络位置的访问,同时安全地授予对 AWS 服务的访问权限。

在以下 Amazon S3 存储桶策略示例中,对存储桶的访问受到限制,除非请求源自 vpc-111bbb22 或者来自服务主体,例如 CloudTrail。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Expected-network+service-principal", "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET1/AWSLogs/AccountNumber/*", "Condition": { "StringNotEqualsIfExists": { "aws:SourceVpc": "vpc-111bbb22" }, "BoolIfExists": { "aws:PrincipalIsAWSService": "false" } } } ] }

在以下视频中,了解有关如何在策略中使用 aws:PrincipalIsAWSService 条件键的更多信息。

aws:PrincipalOrgID

字符串运算符结合使用。

使用此键可将请求主体所属的 AWS Organizations 中组织的标识符与策略中指定的标识符进行比较。

  • Availability(可用性)- 仅在主体是企业成员时,才将此键包含在请求上下文中。匿名请求不包括此键。

  • 值类型— 单值

此全局键提供了列出组织中的所有 AWS 账户的所有账户 ID 的替代方法。您可以使用此条件键来简化在基于资源的策略中指定 Principal 元素的过程。您可以在条件元素中指定组织 ID。当您添加和删除账户时,包含 aws:PrincipalOrgID 键的策略将自动包括正确的账户,并且不需要手动更新。

例如,以下 Amazon S3 存储桶策略允许 o-xxxxxxxxxxx 企业中的任何账户成员将对象添加到 policy-ninja-dev 存储桶中。

{ "Version": "2012-10-17", "Statement": { "Sid": "AllowPutObject", "Effect": "Allow", "Principal": "*", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::policy-ninja-dev/*", "Condition": {"StringEquals": {"aws:PrincipalOrgID":"o-xxxxxxxxxxx"} } } }
注意

此全局条件也适用于 AWS 企业的管理账户。此策略防止指定组织之外的所有主体访问 Amazon S3 存储桶。这包括与您的内部资源交互的任何 AWS 服务,如将日志数据发送到 Amazon S3 存储桶的 AWS CloudTrail。了解如何安全地授予 AWS 服务的访问权限,请参阅 aws:PrincipalIsAWSService

有关 AWS Organizations 的更多信息,请参阅 AWS Organizations 用户指南中的什么是 AWS Organizations?

aws:PrincipalOrgPaths

字符串运算符结合使用。

使用此键可将发出请求的主体的 AWS Organizations 路径与策略中的路径进行比较。该主体可以是 IAM 用户、IAM 角色、联合身份用户或 AWS 账户 根用户。在策略中,此条件键可确保请求者是 AWS Organizations 中指定组织根或组织单位 (OU) 的账户成员。AWS Organizations 路径是 Organizations 实体结构的文本表示形式。有关使用和了解路径的更多信息,请参阅了解 AWS Organizations 实体路径

  • Availability(可用性)- 仅在主体是企业成员时,才将此键包含在请求上下文中。匿名请求不包括此键。

  • 值类型— 多值

注意

组织 ID 是全局唯一的,但 OU ID 和根目录 ID 仅在组织内是唯一的。这意味着没有两个组织具有相同的组织 ID。但是,另一个组织可能具有与您的组织相同的 OU 或根目录 ID。我们建议您在指定 OU 或根目录时始终包含组织 ID。

例如,以下条件返回账户中主体的 true,该主体直接附加到 ou-ab12-22222222 OU 但不在其子 OU 中。

"Condition" : { "ForAnyValue:StringEquals" : { "aws:PrincipalOrgPaths":["o-a1b2c3d4e5/r-ab12/ou-ab12-11111111/ou-ab12-22222222/"] }}

以下条件为账户中的主体返回 true,该主体直接附加到 OU 或其任何子 OU。包含通配符时,您必须使用 StringLike 条件运算符。

"Condition" : { "ForAnyValue:StringLike" : { "aws:PrincipalOrgPaths":["o-a1b2c3d4e5/r-ab12/ou-ab12-11111111/ou-ab12-22222222/*"] }}

以下条件为账户中的主体返回 true,该主体直接附加到任意子 OU,但不会直接附加至父 OU。以前的条件适用于 OU 或任何子 OU。以下条件仅适用于子 OU(以及这些子 OU 的任何子 OU)。

"Condition" : { "ForAnyValue:StringLike" : { "aws:PrincipalOrgPaths":["o-a1b2c3d4e5/r-ab12/ou-ab12-11111111/ou-ab12-22222222/ou-*"] }}

以下条件允许访问 o-a1b2c3d4e5 组织中的各个主体,而无论其父 OU 如何。

"Condition" : { "ForAnyValue:StringLike" : { "aws:PrincipalOrgPaths":["o-a1b2c3d4e5/*"] }}

aws:PrincipalOrgPaths 是一个多值条件键。多值键包含一个值或列表格式的多个值。结果是逻辑 OR。在您为 ForAnyValue 条件运算符使用多个值时,主体的路径必须与策略中列出的其中一个路径匹配。对于包含单个键的多个值的策略,必须将条件括在方括号内,例如数组 ("Key":["Value1", "Value2"])。在单值情况下您也应包含这些括号。有关多值条件键的更多信息,请参阅创建具有多个键或值的条件

"Condition": { "ForAnyValue:StringLike": { "aws:PrincipalOrgPaths": [ "o-a1b2c3d4e5/r-ab12/ou-ab12-33333333/*", "o-a1b2c3d4e5/r-ab12/ou-ab12-22222222/*" ] } }

aws:PrincipalServiceName

字符串运算符结合使用。

使用此密钥可以将策略中的服务主体名称与正在向您的资源发出请求的服务主体进行比较。您可以使用此密钥来检查此调用是否由特定的服务主体提出。当服务主体向您的资源发出直接请求时,aws:PrincipalServiceName 密钥将包含服务主体的名称。例如,AWS CloudTrail 服务主体的名称是 cloudtrail.amazonaws.com

  • 可用性 — 当调用由 AWS 服务主体提出时,此密钥将存在于请求中。此密钥不会在任何其他情况中出现,包括以下情况:

    • 如果服务使用服务角色服务相关角色代表主体进行调用。

    • 如果服务使用 IAM 主体的凭证代表主体发出请求。

    • 如果调用是由 IAM 主体直接发出的。

    • 如果调用是由匿名请求者发出的。

  • 值类型— 单值

您可以使用此条件键限制对可信身份和预期网络位置的访问,同时安全地授予对 AWS 服务的访问权限。

在以下 Amazon S3 存储桶策略示例中,对存储桶的访问受到限制,除非请求源自 vpc-111bbb22 或者来自服务主体,例如 CloudTrail。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "expected-network+service-principal", "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET1/AWSLogs/AccountNumber/*", "Condition": { "StringNotEqualsIfExists": { "aws:SourceVpc": "vpc-111bbb22", "aws:PrincipalServiceName": "cloudtrail.amazonaws.com" } } } ] }

aws:PrincipalServiceNamesList

字符串运算符结合使用。

此密钥提供了属于此服务的所有服务主体名称列表。这是一个高级条件键。您可以用它来限制服务仅从特定地区访问您的资源。某些服务可能会创建区域服务主体,以指示特定区域内服务的特定实例。您可以将对资源的访问限制为服务的特定实例。当服务主体向您的资源发出直接请求时,aws:PrincipalServiceNamesList 会包含与服务的区域实例关联的所有服务主体名称的无序列表。

  • 可用性 — 当调用由 AWS 服务主体提出时,此密钥将存在于请求中。此密钥不会在任何其他情况中出现,包括以下情况:

    • 如果服务使用服务角色服务相关角色代表主体进行调用。

    • 如果服务使用 IAM 主体的凭证代表主体发出请求。

    • 如果调用是由 IAM 主体直接发出的。

    • 如果调用是由匿名请求者发出的。

  • 值类型— 多值

aws:PrincipalServiceNamesList 是一个多值条件键。多值键包含一个值或列表格式的多个值。结果是逻辑 OR。当您使用此密钥时,您必须将 ForAnyValue 或者 ForAllValues 集合运算符与 StringLike 条件运算符搭配使用。对于包含单个键的多个值的策略,必须将条件括在方括号内,例如数组 ("Key":["Value1", "Value2"])。在单值情况下您也应包含这些括号。有关多值条件键的更多信息,请参阅使用多个键和值

aws:PrincipalTag/tag-key

字符串运算符结合使用。

使用此键可将附加到发出请求的主体的标签与您在策略中指定的标签进行比较。如果已为主体附加多个标签,则请求上下文会为每个附加的标签键包含一个 aws:PrincipalTag 键。

  • 可用性 - 仅在主体使用具有附加标签的 IAM 用户时,才将此键包含在请求上下文中。对于主体,如果使用附加了标签或会话标签的 IAM 角色,则应包括它。匿名请求不包括此键。

  • 值类型— 单值

您可采用键/值对的形式向用户或角色添加自定义属性。有关 IAM 标签的更多信息,请参阅 标记 IAM 资源。您可以将 aws:PrincipalTag 用于针对 AWS 主体的访问控制

此示例说明如何创建基于角色的策略,以允许具有 department=hr 标签的用户管理 IAM 用户、组或角色。要使用此策略,请将示例策略中的斜体占位符文本替换为您自己的信息。然后,按照创建策略编辑策略中的说明操作。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iam:*", "Resource": "*", "Condition": { "StringEquals": { "aws:PrincipalTag/department": "hr" } } } ] }

aws:PrincipalType

字符串运算符结合使用。

使用此键可将发出请求的主体的类型与您在策略中指定的主体类型进行比较。有关更多信息,请参阅指定主体。有关 principal 密钥值的具体示例,请参阅 主体键值

  • Availability(可用性)– 此键包含在所有请求(包括匿名请求)的请求上下文中。

  • 值类型— 单值

aws:referer

字符串运算符结合使用。

使用此键可将在客户端浏览器中引用请求的站点与您在策略中指定的引用站点进行比较。aws:referer 请求上下文值是由调用方在 HTTP 标头中提供的。当您在网页上选择链接时,Referer 标题将包含在 Web 浏览器请求中。Referer 标题包含选定链接的网页的 URL。

  • Availability(可用性)- 仅当通过从浏览器中的网页 URL 链接来调用对 AWS 资源的请求时,才将此键包含在请求上下文中。编程请求不包括此键,因为它不使用浏览器链接即可访问 AWS 资源。

  • 值类型— 单值

例如,您可以直接使用 URL 或使用直接 API 调用访问 Amazon S3 对象。有关更多信息,请参阅使用 Web 浏览器直接调用 Amazon S3 API 操作。当您从网页中存在的 URL 访问 Amazon S3 对象时,源网页的 URL 将在 aws:referer 中使用。当您通过在浏览器中键入 URL 来访问 Amazon S3 对象时,aws:referer 不存在。直接调用 API 时,aws:referer 也不存在。您可以使用策略中的 aws:referer 条件键以允许来自特定引用站点发出的请求,例如公司域中网页上的链接。

警告

应谨慎使用此键。包含公共已知的引用站点标头值是非常危险的。未经授权方可能会使用修改的浏览器或自定义浏览器提供他们选择的任何 aws:referer 值。因此,aws:referer 不应用于阻止未经授权方直接发出 AWS 请求。提供它只是为了允许客户保护其数字内容(如存储在 Amazon S3 中的内容),以免在未经授权的第三方站点上引用。

aws:RequestedRegion

字符串运算符结合使用。

使用此键可将已在请求中调用的 AWS 区域与您在策略中指定的区域进行比较。您可以使用此全局条件键来控制可请求的区域。要查看每种服务的 AWS 区域,请参阅 Amazon Web Services 一般参考中的服务终端节点和配额

  • Availability(可用性)- 此键始终包含在请求上下文中。

  • 值类型— 单值

一些全球服务(如 IAM)具有单个终端节点。因为此端点的物理位置在美国东部(弗吉尼亚北部)区域,所以 IAM 调用始终会向 us-east-1 区域发出。例如,如果您创建一个策略以在请求的区域不是 us-west-2 时拒绝访问所有服务,则 IAM 调用将始终失败。要查看如何解决此问题的示例,请参阅 NotAction 与 Deny

注意

使用 aws:RequestedRegion 条件键可以控制服务的哪个终端节点被调用,但不控制该操作产生的影响。一些服务具有跨区域影响。例如,Amazon S3 具有控制跨区域复制的 API 操作。您可以在一个区域中调用 s3:PutBucketReplication(受 aws:RequestedRegion 条件键的影响),但其他区域将会受到影响,具体取决于复制配置设置。

您可以使用该上下文密钥将访问限制为一组给定区域中的 AWS 服务。例如,以下策略允许用户查看 AWS Management Console 中的所有 Amazon EC2 实例。但是,它仅允许用户更改爱尔兰 (eu-west-1)、伦敦 (eu-west-2) 或巴黎 (eu-west-3) 中的实例。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "InstanceConsoleReadOnly", "Effect": "Allow", "Action": [ "ec2:Describe*", "ec2:Export*", "ec2:Get*", "ec2:Search*" ], "Resource": "*" }, { "Sid": "InstanceWriteRegionRestricted", "Effect": "Allow", "Action": [ "ec2:Associate*", "ec2:Import*", "ec2:Modify*", "ec2:Monitor*", "ec2:Reset*", "ec2:Run*", "ec2:Start*", "ec2:Stop*", "ec2:Terminate*" ], "Resource": "*", "Condition": { "StringEquals": { "aws:RequestedRegion": [ "eu-west-1", "eu-west-2", "eu-west-3" ] } } } ] }

aws:RequestTag/tag-key

字符串运算符结合使用。

使用此键可将请求中传递的标签键/值对与您在策略中指定的标签对进行比较。例如,您可以检查请求是否包含标签键 "Dept" 并具有 "Accounting" 值。有关更多信息,请参阅在 AWS 请求期间控制访问

  • Availability(可用性)– 当在请求中传递标签键值对时,将此键包含在请求上下文中。在请求中传递多个标签时,每个标签键/值对均有一个上下文密钥。

  • 值类型— 单值

该上下文密钥的格式为 "aws:RequestTag/tag-key":"tag-value",其中 tag-keytag-value 是标签键值对。标签密钥和值不区分大小写。这意味着,如果您在策略的条件元素中指定 "aws:RequestTag/TagKey1": "Value1",则条件将匹配名为 TagKey1tagkey1 的请求标签键,但不会同时匹配两者。

这个例子表明,虽然该键是单值的,但如果键不同,您仍然可以在请求中使用多个键值对。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "ec2:CreateTags", "Resource": "arn:aws:ec2:::instance/*", "Condition": { "StringEquals": { "aws:RequestTag/environment": [ "preprod", "production" ], "aws:RequestTag/team": [ "engineering" ] } } } }

aws:ResourceAccount

字符串运算符结合使用。

使用此键,将策略中所请求的资源所有者的 AWS 账户 ID 与资源账户进行比较。然后,您可以根据拥有该资源的账户来允许或拒绝对该资源的访问。

  • Availability(可用性)– 对于大多数服务操作,此键始终包含在请求上下文中。以下操作不支持此键:

    • Amazon Elastic Block Store – 所有操作

    • Amazon EC2

      • ec2:CopyFpgaImage

      • ec2:CopyImage

      • ec2:CopySnapshot

      • ec2:CreateTransitGatewayPeeringAttachment

      • ec2:CreateVolume

      • ec2:CreateVpcPeeringConnection

    • Amazon EventBridge – 所有操作

    • Amazon WorkSpaces

      • workspaces:CopyWorkspaceImage

      • workspaces:DescribeWorkspaceImages

  • 值类型 — 单值

此密钥等于包含请求中受评估资源的账户的 AWS 账户 ID。

对于您的账户中的大多数资源,ARN 包含该资源的所有者账户 ID。对于某些资源(如 Amazon S3 存储桶),资源 ARN 不包含该账户 ID。以下两个示例显示了在 ARN 中具有账户 ID 的资源与没有账户 ID 的 Amazon S3 ARN 之间的区别:

  • arn:aws:iam::123456789012:role/AWSExampleRole – 在账户 123456789012 中创建和拥有的 IAM 角色。

  • arn:aws:s3:::DOC-EXAMPLE-BUCKET2 – 在账户 111122223333 中创建且拥有的 Amazon S3 存储桶,在 ARN 中不显示。

使用 AWS 控制台、API 或 CLI 查找您的所有资源和相应的 ARN。

您编写的策略根据资源所有者的账户 ID 拒绝对资源的权限。例如,如果指定资源不属于指定账户,以下基于身份的策略会拒绝访问该资源。

要使用此策略,请将示例策略中的斜体占位符文本替换为您的账户信息。

重要

该策略不允许进行任何操作。相反,该策略会使用 Deny 效果,这会显式拒绝访问语句中列出而不属于已列出账户的所有资源。将此策略与允许访问特定资源的其他策略结合使用。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyInteractionWithResourcesNotInSpecificAccount", "Action": "service:*", "Effect": "Deny", "Resource": [ "arn:partition:service:region:account:*" ], "Condition": { "StringNotEquals": { "aws:ResourceAccount": [ "account" ] } } } ] }

此策略会拒绝对特定 AWS 服务所有资源的访问,除非指定 AWS 账户拥有该资源。

注意

某些 AWS 服务 需要访问托管在其他 AWS 中的 AWS 账户 所拥有的资源。在基于身份的策略中使用 aws:ResourceAccount 可能会影响您的身份访问这些资源的能力。

某些 AWS 服务,例如 AWS Data Exchange 和 CloudFormation,依赖于对您的 AWS 账户以外的资源的访问来进行正常操作。如果您在策略中使用元素 aws:ResourceAccount,请在策略中包含额外声明来为这些服务创建豁免。以下示例策略演示了如何根据资源账户拒绝访问,同时定义对于服务拥有的资源的例外情况。

将这些策略示例用作创建自己的自定义策略的模板。参阅服务文档以了解更多信息。

aws:ResourceOrgID

字符串运算符结合使用。

使用此键可将被请求资源所属的 AWS Organizations 中组织的标识符与策略中指定的标识符进行比较。

  • Availability(可用性)- 仅在拥有资源的账户是企业成员时,才将此键包含在请求上下文中。此全局条件键不支持以下操作:

    • Amazon Elastic Block Store – 所有操作

    • Amazon EC2

      • ec2:CopyFpgaImage

      • ec2:CopyImage

      • ec2:CopySnapshot

      • ec2:CreateTransitGatewayPeeringAttachment

      • ec2:CreateVolume

      • ec2:CreateVpcPeeringConnection

    • Amazon EventBridge – 所有操作

    • Amazon WorkSpaces

      • workspaces:CopyWorkspaceImage

      • workspaces:DescribeWorkspaceImages

  • 值类型 — 单值

此全局键会返回给定请求的资源组织 ID。它允许您创建适用于组织中所有资源的规则,这些资源在基于身份的策略Resource 元素中指定。您可以在条件元素中指定组织 ID。当您添加和删除账户时,包含 aws:ResourceOrgID 键的策略将自动包括正确的账户,并且不必手动更新。

例如,以下策略会阻止主体将对象添加到 policy-genius-dev 资源,除非 Amazon S3 资源与发出请求的主体属于同一组织。

重要

该策略不允许进行任何操作。相反,该策略会使用 Deny 效果,这会显式拒绝访问语句中列出而不属于已列出账户的所有资源。将此策略与允许访问特定资源的其他策略结合使用。

{ "Version": "2012-10-17", "Statement": { "Sid": "DenyPutObjectToS3ResourcesOutsideMyOrganization", "Effect": "Deny", "Action": "s3:PutObject", "Resource": "arn:partition:s3:::policy-genius-dev/*", "Condition": { "StringNotEquals": { "aws:ResourceOrgID": "${aws:PrincipalOrgID}" } } } }
注意

某些 AWS 服务 需要访问托管在其他 AWS 中的 AWS 账户 所拥有的资源。在基于身份的策略中使用 aws:ResourceOrgID 可能会影响您的身份访问这些资源的能力。

某些 AWS 服务,例如 AWS Data Exchange 和 CloudFormation,依赖于对您的 AWS 账户以外的资源的访问来进行正常操作。如果您在策略中使用 aws:ResourceOrgID 键,请在策略中包含额外声明来为这些服务创建豁免。以下示例策略演示了如何根据资源账户拒绝访问,同时定义对于服务拥有的资源的例外情况。您可以使用 aws:ResourceOrgID 键来创建类似的策略,限制对企业内部资源的访问,同时包括服务拥有的资源。

将这些策略示例用作创建自己的自定义策略的模板。参阅服务文档以了解更多信息。

在以下视频中,了解有关如何在策略中使用 aws:ResourceOrgID 条件键的更多信息。

aws:ResourceOrgPaths

字符串运算符结合使用。

使用此键来比较所访问资源的 AWS Organizations 路径与策略中的路径。在策略中,此条件键可确保该资源属于 AWS Organizations 中指定组织根或组织单位(OU)的账户成员。AWS Organizations 路径是 Organizations 实体结构的文本表示形式。有关使用和了解路径的更多信息,请参阅 了解 AWS Organizations 实体路径

  • Availability(可用性)- 仅在拥有资源的账户是企业成员时,才将此键包含在请求上下文中。此全局条件键不支持以下操作:

    • Amazon Elastic Block Store – 所有操作

    • Amazon EC2

      • ec2:CopyFpgaImage

      • ec2:CopyImage

      • ec2:CopySnapshot

      • ec2:CreateTransitGatewayPeeringAttachment

      • ec2:CreateVolume

      • ec2:CreateVpcPeeringConnection

    • Amazon EventBridge – 所有操作

    • Amazon WorkSpaces

      • workspaces:CopyWorkspaceImage

      • workspaces:DescribeWorkspaceImages

  • 值类型— 多值

aws:ResourceOrgPaths 是一个多值条件键。多值键包含一个值或列表格式的多个值。结果是逻辑 OR。当您使用此密钥时,您必须将 ForAnyValue 或者 ForAllValues 集合运算符与 StringLike 条件运算符搭配使用。对于包含单个键的多个值的策略,必须将条件括在方括号内,例如数组 ("Key":["Value1", "Value2"])。在单值情况下您也应包含这些括号。有关多值条件键的更多信息,请参阅使用多个键和值

例如,对于属于组织 o-a1b2c3d4e5 的资源,以下条件会返回为 True。包含通配符时,您必须使用 StringLike 条件运算符。

"Condition": { "ForAnyValue:StringLike": { "aws:ResourceOrgPaths":["o-a1b2c3d4e5/*"] } }

对于附加到 OU ou-ab12-11111111 或任何子 OU 的账户所拥有的资源,以下条件返回 True

"Condition": { "ForAnyValue:StringLike" : { "aws:ResourceOrgPaths":["o-a1b2c3d4e5/r-ab12/ou-ab12-11111111/*"] }}

对于直接附加到 OU ou-ab12-22222222(非子 OU)的账户所拥有的资源,以下条件返回 True。下面的示例使用 StringEquals 条件运算符来指定 OU 的完全匹配(而不是通配符匹配)要求。

"Condition": { "ForAnyValue:StringEquals" : { "aws:ResourceOrgPaths":["o-a1b2c3d4e5/r-ab12/ou-ab12-11111111/ou-ab12-22222222/"] }}
注意

某些 AWS 服务 需要访问托管在其他 AWS 中的 AWS 账户 所拥有的资源。在基于身份的策略中使用 aws:ResourceOrgPaths 可能会影响您的身份访问这些资源的能力。

某些 AWS 服务,例如 AWS Data Exchange 和 CloudFormation,依赖于对您的 AWS 账户以外的资源的访问来进行正常操作。如果您在策略中使用 aws:ResourceOrgPaths 键,请在策略中包含额外声明来为这些服务创建豁免。以下示例策略演示了如何根据资源账户拒绝访问,同时定义对于服务拥有的资源的例外情况。您可以使用 aws:ResourceOrgPaths 键来创建类似的策略,限制对企业部门(OU)内部资源的访问,同时包括服务拥有的资源。

将这些策略示例用作创建自己的自定义策略的模板。参阅服务文档以了解更多信息。

aws:ResourceTag/tag-key

字符串运算符结合使用。

使用此键可将您在策略中指定的标签键/值对与附加到资源的键/值对进行比较。例如,您可能会要求只有在资源具有附加的标签键 "Dept" 和值 "Marketing" 时才允许访问该资源。有关更多信息,请参阅控制对 AWS 资源的访问

  • Availability(可用性)– 当请求的资源已附加标签,或者是在利用附加包创建资源的请求中,键会包含在请求上下文中。只有支持基于标签的授权的资源返回此键。每个标签键/值对均有一个上下文密钥。

  • 值类型— 单值

该上下文密钥的格式为 "aws:ResourceTag/tag-key":"tag-value",其中 tag-keytag-value 是标签键值对。标签密钥和值不区分大小写。这意味着,如果您在策略的条件元素中指定 "aws:ResourceTag/TagKey1": "Value1",则条件将匹配名为 TagKey1tagkey1 的资源标签键,但不会同时匹配两者。

有关使用 aws:ResourceTag 键控制对 IAM 资源的访问的示例,请参阅 控制对 AWS 资源的访问

有关使用 aws:ResourceTag 键控制对其他 AWS 资源的访问的示例,请参阅 使用标签控制对 AWS 资源的访问

有关使用 aws:ResourceTag 条件键进行基于属性的访问控制 (ABAC) 的教程,请参阅 IAM 教程:根据标签定义访问 AWS 资源的权限

aws:SecureTransport

布尔值运算符结合使用。

使用此键可检查是否已使用 SSL 发送请求。请求上下文将返回 truefalse。在策略中,只能在使用 SSL 发送请求时允许特定操作。

  • Availability(可用性)- 此键始终包含在请求上下文中。

  • 值类型— 单值

aws:SourceAccount

字符串运算符结合使用。

使用此键可将发出服务到服务请求的资源的账户 ID 与您在策略中指定的账户 ID 进行比较。

  • Availability(可用性)- 仅在访问资源触发一项 AWS 服务以代表资源拥有者调用另一项服务时,将此键包含在请求上下文中。发出调用的服务必须将源的资源账户 ID 传递给被调用的服务。此账户 ID 包括源账户 ID。

  • 值类型— 单值

您可以使用此条件键来防止 AWS 服务在服务之间执行事务时被用作混淆代理人。将此条件键的值设置为请求中资源的账户。例如,当 Amazon S3 存储桶更新触发 Amazon SNS 主题帖子时,Amazon S3 服务将调用 sns:Publish API 操作。在允许 sns:Publish 操作的策略中,将条件键的值设置为 Amazon S3 存储桶的账户 ID。有关如何以及建议何时使用这些条件键的信息,请参阅有关您正在使用的 AWS 服务的文档。

aws:SourceArn

ARN 运算符字串运算符结合使用。AWS 建议在比较 ARN 时使用 ARN 运算符而不是字符串运算符。

使用此键可将发出服务到服务请求的资源的 Amazon Resource Name (ARN) 与您在策略中指定的 ARN 进行比较。

此键不适用于发出请求的主体的 ARN。请改用 aws:PrincipalArn。源的 ARN 包含账户 ID,因此不必将 aws:SourceAccountaws:SourceArn 结合使用。

  • Availability(可用性)- 仅在访问资源触发一项 AWS 服务以代表资源拥有者调用另一项服务时,将此键包含在请求上下文中。调用服务必须将原始资源的 ARN 传递给被调用的服务。

  • 值类型— 单值

您可以使用此条件键来防止 AWS 服务在服务之间执行事务时被用作混淆代理人。将此条件键的值设置为请求中资源的 ARN。例如,当 Amazon S3 存储桶更新触发 Amazon SNS 主题帖子时,Amazon S3 服务将调用 sns:Publish API 操作。在允许 sns:Publish 操作的策略中,将条件免邮的值设置为 Amazon S3 存储桶的 ARN。有关如何以及建议何时使用这些条件键的信息,请参阅有关您正在使用的 AWS 服务的文档。

aws:SourceIdentity

字符串运算符结合使用。

使用此密钥可将主体设置的源身份与您在策略中指定的源身份进行比较。

  • 可用性 — 在使用任何 AWS STS 担任角色 CLI 命令或 AWS STS AssumeRoleAPI 操作担任角色时设置好源身份后,此密钥将会被包含在请求中。

  • 值类型— 单值

您可以在策略中使用此密钥来允许 AWS 中的主体操作,这些主体在担任角色时设置了源身份。角色指定源身份的活动显示在 AWS CloudTrail。这使管理员能够更轻松地确定什么角色在 AWS 中执行了操作。

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

当主体使用任何 AWS STS 担任角色 CLI 命令或 AWS STS AssumeRole API 操作担任角色并初次设置源身份时,sts:SourceIdentity 密钥将会出现在请求中。aws:SourceIdentity键存在于对具有源身份设置的角色会话执行的任何操作请求中。

以下账户 111122223333 中适用于 CriticalRole 的角色信任策略包含一个条件适用于 aws:SourceIdentity 的条件,可防止未将源身份设置为 Saanvi 或 Diego 主体担任该角色。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AssumeRoleIfSourceIdentity", "Effect": "Allow", "Principal": {"AWS": " arn:aws:iam::123456789012:role/CriticalRole"}, "Action": [ "sts:AssumeRole", "sts:SetSourceIdentity" ], "Condition": { "StringLike": { "aws:SourceIdentity": ["Saanvi","Diego"] } } } ] }

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

aws:SourceIp

IP 地址运算符结合使用。

使用此键可将请求者的 IP 地址与您在策略中指定的 IP 地址进行比较。aws:SourceIp 条件键只能用于公有 IP 地址范围。

  • Availability(可用性)- 此键将包含在请求上下文中,但请求者使用 VPC 终端节点发出请求时除外。

  • 值类型— 单值

可在策略中使用 aws:SourceIp 条件键以仅允许主体从指定的 IP 范围发出请求。但是,如果 AWS 服务代表主体进行调用,则此策略拒绝访问。在这种情况下,您可以将 aws:SourceIpaws:ViaAWSService 键结合使用,以确保源 IP 限制仅适用于主体直接发出的请求。

例如,您可以将以下策略附加到一个 IAM 用户。如果用户从指定的 IP 地址进行调用,则此策略允许用户将对象直接放入 DOC-EXAMPLE-BUCKET3 Amazon S3 存储桶中。但是,如果用户发出另一个请求而导致服务调用 Amazon S3,则 IP 地址限制不适用。只有当请求不是由服务发出时,PrincipalPutObjectIfIpAddress 语句才会限制 IP 地址。如果请求是由服务发出的,则 ServicePutObject 语句允许执行此操作而没有 IP 地址限制。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "PrincipalPutObjectIfIpAddress", "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET3/*", "Condition": { "Bool": {"aws:ViaAWSService": "false"}, "IpAddress": {"aws:SourceIp": "203.0.113.0"} } }, { "Sid": "ServicePutObject", "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*", "Condition": { "Bool": {"aws:ViaAWSService": "true"} } } ] }

如果请求来自使用 Amazon VPC 终端节点的主机,则 aws:SourceIp 密钥不可用。您应改用特定于 VPC 的键,例如 aws:VpcSourceIp。有关使用 VPC 端点的更多信息,请参阅《AWS PrivateLink 指南》中的 VPC 端点和 VPC 端点服务的身份和访问管理

aws:SourceVpc

字符串运算符结合使用。

使用此键可检查请求是否来自您在策略中指定的 VPC。在策略中,您可以使用此键以仅允许访问特定的 VPC。有关更多信息,请参阅 Amazon Simple Storage Service 用户指南中的限制对特定 VPC 的访问

  • Availability(可用性)- 仅在请求者使用 VPC 终端节点发出请求时,才将此键包含在请求上下文中。

  • 值类型— 单值

aws:SourceVpce

字符串运算符结合使用。

使用此键可将请求的 VPC 终端节点标识符与您在策略中指定的终端节点 ID 进行比较。在策略中,您可以使用此键来限制对特定 VPC 的访问。有关更多信息,请参阅 Amazon Simple Storage Service 用户指南中的限制对特定 VPC 终端节点的访问

  • Availability(可用性)- 仅在请求者使用 VPC 终端节点发出请求时,才将此键包含在请求上下文中。

  • 值类型— 单值

aws:TagKeys

字符串运算符结合使用。

使用此键可将请求中的标签键与您在策略中指定的键进行比较。作为使用策略来通过标签控制访问的最佳实践,请使用 aws:TagKeys 条件键来定义允许的标签键。有关示例策略和更多信息,请参阅根据标签键控制访问

  • Availability(可用性)– 仅在操作支持将标签传递到请求中时,才将此键包含在请求上下文中。

  • 值类型— 多值

该上下文密钥的格式为 "aws:TagKeys":"tag-key",其中 tag-key 是没有值的标签键列表 (例如,["Dept","Cost-Center"])。

由于可在一个请求中包含多个标签键/值对,因此,请求内容可以是多值请求。在此情况下,您必须使用 ForAllValuesForAnyValue 集合运算符。有关更多信息,请参阅使用多个键和值

某些服务支持同时使用标记和资源操作,例如创建、修改或删除资源。要允许在单次调用中同时使用标记和操作,您必须创建同时包含标记操作和资源修改操作的策略。然后,您可以使用 aws:TagKeys 条件键强制在请求中使用特定标签键。例如,要在某人创建 Amazon EC2 快照时限制标签,您必须在策略中包含 ec2:CreateSnapshot创建操作 ec2:CreateTags 标记操作。要查看此使用 aws:TagKeys 场景的策略,请参阅适用于 Linux 实例的 Amazon EC2 用户指南中的创建具有标签的快照

aws:TokenIssueTime

日期运算符结合使用。

使用此键可将临时安全凭证的颁发日期和时间与您在策略中指定的日期和时间进行比较。

  • Availability(可用性)- 仅在主体使用临时凭证发出请求时,才将此键包含在请求上下文中。使用访问密钥发出的 AWS CLI、AWS API 或 AWS 开发工具包请求中未提供此键。

  • 值类型— 单值

要了解哪些服务支持使用临时凭证,请参阅使用 IAM 的AWS服务

aws:UserAgent

字符串运算符结合使用。

使用此键可将请求者的客户端应用程序与您在策略中指定的应用程序进行比较。

  • Availability(可用性)- 此键始终包含在请求上下文中。

  • 值类型— 单值

警告

应谨慎使用此键。由于 aws:UserAgent 值由发起人在 HTTP 标头中提供,因此未经授权方可以修改或自定义浏览器以提供他们选择的任何 aws:UserAgent 值。因此,aws:UserAgent 不应用于阻止未经授权方直接发出 AWS 请求。您可以使用它来仅允许特定客户端应用程序,并且仅在对策略进行测试之后。

aws:userid

字符串运算符结合使用。

使用此键可将请求者的主体标识符与您在策略中指定的 ID 进行比较。对于 IAM 用户,请求上下文值是用户 ID。对于 IAM 角色,此值的格式可能有所不同。有关如何为不同的主体显示信息的详细信息,请参阅指定主体。有关 principal 密钥值的具体示例,请参阅 主体键值

  • Availability(可用性)– 此键包含在所有请求(包括匿名请求)的请求上下文中。

  • 值类型— 单值

aws:username

字符串运算符结合使用。

使用此键可将请求者的用户名与您在策略中指定的用户名进行比较。有关如何为不同的主体显示信息的详细信息,请参阅指定主体。有关 principal 密钥值的具体示例,请参阅 主体键值

  • 可用性 - 此键始终包含在 IAM 用户的请求上下文中。匿名请求或使用 AWS 账户 根用户或 IAM 角色 角色发出的请求不包含此键。使用 IAM Identity Center 凭证发出的请求不会在上下文中包含此键。要了解如何控制对 IAM Identity Center 中的用户的访问权限,请参阅 identitystore:UserId将 IAM Identity Center 身份存储中的预定义属性用于 AWS 中的访问控制。IAM Identity Center 中的用户是您的员工队伍中需要访问您的 AWS 账户或您的云应用程序的人员。

  • 值类型 — 单值

aws:ViaAWSService

布尔值运算符结合使用。

使用此键检查 AWS 服务是否代表您向其他服务发出请求。

当服务使用 IAM 主体的凭证代表主体发出请求时,请求上下文密钥返回 true。如果服务使用服务角色服务相关角色代表主体进行调用,则上下文密钥返回 false。当主体直接进行调用时,请求上下文密钥也会返回 false

  • Availability(可用性)- 此键始终包含在请求上下文中。

  • 值类型— 单值

您可以根据请求是否由服务发出,使用此条件键允许或拒绝访问。有关示例策略,请参阅AWS:基于源 IP 拒绝对 AWS 的访问

aws:VpcSourceIp

IP 地址运算符结合使用。

使用此键可将从中发出请求的 IP 地址与您在策略中指定的 IP 地址进行比较。在策略中,键仅在请求来自指定的 IP 地址并经过 VPC 终端节点时进行匹配。

  • Availability(可用性)- 仅在使用 VPC 终端节点发出请求时,才将此键包含在请求上下文中。

  • 值类型— 单值

有关更多信息,请参阅《Amazon VPC 用户指南》中的使用 VPC 终端节点控制对服务的访问

其他跨服务条件键

全局条件键是带 aws: 前缀的条件键。单个服务可以创建自己的条件键。这些特定于服务的条件键包括与服务名称匹配的前缀,例如 iam:sts:

服务可以创建服务特定键,这些键在其他服务的请求上下文中可用。这些键可在多个服务中使用,但不是全局条件键。例如,AWS STS 支持 基于 SAML 的联合条件键。当使用 SAML 联合的用户在其他服务中执行 AWS 操作时,这些键可用。其他示例包括 identitystore:UserIdec2:SourceInstanceArn

要查看用于一项服务的服务特定条件键,请参阅AWS 服务的操作、资源和条件键,然后选择要查看其键的服务。