AWS Identity and Access Management
用户指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

AWS 全局条件上下文键

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

本主题介绍全局可用键(前缀为 aws:)。AWS 服务(如 IAM)提供与该服务定义的操作和资源相关的服务特定键。有关更多信息,请参阅AWS 服务的操作、资源和条件键。支持条件键的服务的文档通常包含附加信息。例如,有关可在 Amazon S3 资源的策略中使用的密钥的信息,请参阅 Amazon Simple Storage Service 开发人员指南 中的 Amazon S3 策略密钥

有些全局条件键可用于所有 AWS 服务,而有些仅受部分服务支持。您可以在 IAM 策略中使用这些键,但在基于资源的策略中不一定能够使用。

可用于所有服务的键

AWS 为支持 IAM 访问控制的所有 AWS 服务提供下列预定义条件键。要了解有关这些服务的写入策略的更多信息,请参阅AWS 服务的操作、资源和条件键

aws:CurrentTime

日期运算符结合使用。

要针对日期/时间条件检查的当前日期和时间。

aws:EpochTime

日期运算符结合使用。

要针对日期/时间条件检查的纪元中的当前日期和时间或 UNIX 时间。

aws:MultiFactorAuthAge

数字运算符结合使用。

检查经 MFA 验证的、用于发出请求的安全凭证是在多久之前使用多重验证 (MFA) 颁发的 (以秒为单位)。如果未使用 MFA,则此键不存在。请参阅在 AWS 中使用多重身份验证 (MFA)。因此,这是您在使用 *IfExists 版本的比较运算符时应考虑的另一个键。这将确保比较结果是您所希望的,即使键在请求环境中不存在。

aws:MultiFactorAuthPresent

布尔值运算符结合使用。

检查是否使用了多重验证 (MFA) 来验证发出当前请求的临时安全凭证。仅当用户使用临时凭证调用 API 时,此键才存在于请求环境。此类凭证由 IAM 角色、联合身份用户、具有 sts:GetSessionToken 凭证的 IAM 用户,以及 AWS 管理控制台用户使用。(控制台使用在后台代表用户生成的临时凭证。) 当使用例如标准访问密钥前缀的长期凭证调用 CLI 命令或 API 时,aws:MultiFactorAuthPresent 键不存在。因此我们建议,当您检查此键时使用 ...IfExists 版本的条件运算符。

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

##### WARNING: USE WITH CAUTION ##### "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 的临时凭证的请求。它还拒绝使用长期凭证(如 IAM 用户访问密钥)发出的请求。*IfExists 运算符用于检查 aws:MultiFactorAuthPresent 键是否存在以及它是否可以存在(由其存在性指示)。当您要拒绝未使用 MFA 进行身份验证的任何请求时,可使用此运算符。

您还可以使用 BoolIfExists 运算符来允许使用 MFA 进行身份验证的请求和使用长期凭证发出的请求。

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

此条件将匹配键存在键不存在的情况。AllowBoolIfExiststrue 的组合允许已使用 MFA 进行身份验证的请求或无法使用 MFA 进行身份验证的请求。它不允许来自不包含 MFA 的临时凭证的请求。可以使用此组合来允许 MFA 请求和使用长期凭证发出的请求。

或者,您也可以仅允许已使用 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:PrincipalOrgID

字符串运算符结合使用。

使用 AWS Organizations 创建的组织的标识符。此全局键提供了列出组织中的所有 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 组织的主账户。

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

aws:PrincipalArn

ARN 运算符结合使用。

检查发出请求的 IAM 用户或角色的 Amazon 资源名称 (ARN)。

aws:RequestedRegion

字符串运算符结合使用。

检查是否向特定的区域发出 AWS 请求。您可以使用该全局条件键以控制用户可以对哪些区域进行调用。要查看每个服务的 AWS 区域,请参阅 Amazon Web Services 一般参考 中的 AWS 区域和终端节点

全球服务 (例如 IAM) 具有单个终端节点。不过,由于该终端节点实际位于 美国东部(弗吉尼亚北部) 区域中,因此,始终对 us-east-1 区域进行 IAM 调用。例如,如果您创建一个策略以在请求的区域不是 us-west-2 时拒绝访问所有服务,IAM 调用将始终失败。要查看如何解决此问题的示例,请参阅 NotAction 与 Deny

注意

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

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

{ "Version": "2012-10-17", "Statement": [ { "Sid": "InstanceConsoleReadOnly", "Effect": "Allow", "Action": [ "ec2:DescribeInstances", "ec2:DescribeIamInstanceProfileAssociations", "ec2:DescribeInstanceAttribute", "ec2:DescribeReservedInstancesOfferings", "ec2:DescribeClassicLinkInstances", "ec2:DescribeSpotInstanceRequests", "ec2:GetReservedInstancesExchangeQuote", "ec2:DescribeInstanceCreditSpecifications", "ec2:DescribeSpotFleetInstances", "ec2:DescribeScheduledInstances", "ec2:DescribeScheduledInstanceAvailability", "ec2:DescribeReservedInstancesModifications", "ec2:DescribeReservedInstances", "ec2:DescribeReservedInstancesListings", "ec2:DescribeInstanceStatus" ], "Resource": "*" }, { "Sid": "InstanceWriteRegionRestricted", "Effect": "Allow", "Action": [ "ec2:ModifyInstancePlacement", "ec2:TerminateInstances", "ec2:ImportInstance", "ec2:StartInstances", "ec2:MonitorInstances", "ec2:RunScheduledInstances", "ec2:ResetInstanceAttribute", "ec2:RunInstances", "ec2:ModifyInstanceAttribute", "ec2:StopInstances", "ec2:AssociateIamInstanceProfile", "ec2:ModifyReservedInstances" ], "Resource": "*", "Condition": {"StringEquals": {"aws:RequestedRegion": [ "eu-west-1", "eu-west-2", "eu-west-3" ]}} } ] }
aws:SecureTransport

布尔值运算符结合使用。

检查请求是否是使用 SSL 发送的。

aws:UserAgent

字符串运算符结合使用。

检查请求者的客户端应用程序。

警告

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

可用于部分服务的键

AWS 仅为支持这些功能的部分 AWS 服务提供下列预定义条件键。要了解某一服务是否支持其中一个条件键,您必须查看该服务的文档。

注意

如果您使用只在某些情况下可用的条件键,则可使用 IfExists 版本的条件运算符。如果请求上下文中缺少条件键,策略引擎将无法通过评估。例如,将以下策略与 ...IfExists 运算符结合使用,以匹配请求是否来自特定 IP 范围或特定 VPC。如果两个键中的任意一个不存在或两个都不存在,条件仍匹配。仅当请求中存在指定的键时,才检查值。

"Condition": {"IpAddressIfExists": {"aws:SourceIp" : ["xxx"] }, "StringEqualsIfExists" : {"aws:SourceVpc" : ["yyy"]} }
aws:PrincipalTag/tag-key

字符串运算符结合使用。

检查附加到发出请求的委托人的标签是否与指定的键名称和键值匹配。

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

此示例显示您可以如何创建策略 允许具有 tagManager=true 标签的用户管理 IAM 用户、组或角色。要使用此策略,请将示例策略中的红色斜体文本替换为您自己的信息。

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

字符串运算符结合使用。

检查当前请求的委托人类型(用户、账户、联合身份用户等)。

此条件键仅适用于某些服务。

aws:Referer

字符串运算符结合使用。

检查谁将客户端浏览器指向到请求发送到的地址。仅某些服务(如 Amazon S3)支持该键,该服务可以通过 Web 浏览器直接进行寻址aws:referer 允许 Amazon S3 存储桶所有者帮助防止未经授权的第三方站点将其内容提供给标准 Web 浏览器。值来自对 AWS 进行的 HTTPS 请求中的引用站点标头。aws:referer 值是由调用者在 HTTP 标头中提供的。

警告

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

此条件键仅适用于某些服务。

aws:RequestTag/tag-key

字符串运算符结合使用。

该上下文键的格式为 "aws:RequestTag/tag-key":"tag-value",其中 tag-keytag-value 是标签键值对。

检查在 AWS 请求中是否包含标签键值对。例如,您可以检查请求是否包含标签键 "Dept" 并具有 "Accounting" 值。有关更多信息,请参阅 控制对请求的访问

此条件键仅适用于某些服务,并引入了 Amazon EC2

aws:ResourceTag/tag-key

字符串运算符结合使用。

该上下文键的格式为 "aws:ResourceTag/tag-key":"tag-value",其中 tag-keytag-value 是标签键值对。

检查标签键值对是否附加到资源。例如,您可能会要求只有在资源具有附加的标签键 "Dept" 和值 "Marketing" 时才允许访问该资源。有关更多信息,请参阅 控制对资源的访问

此条件键仅适用于某些服务。

aws:SourceAccount

字符串运算符结合使用。

检查请求来源是否来自某个特定账户。例如,假定在您的账户中有 S3 存储桶,该存储桶配置为向 SNS 主题传送对象创建事件。在这种情况下,您可以使用此条件键来检查 Amazon S3 未被用作混淆代理人。Amazon S3 会告知 Amazon SNS 存储桶所属的账户。

此条件键仅适用于某些服务。

aws:SourceArn

ARN 运算符结合使用。

使用来源的 Amazon 资源名称 (ARN) 查看请求的来源。

此条件键仅适用于某些服务。

aws:SourceIp

IP 地址运算符结合使用。

检查请求者的 IP 地址,请参阅IP 地址条件运算符

注意

只应在 JSON 策略中针对从指定的 IP 范围中进行 API 调用的 IAM 用户、组、角色或联合身份用户使用 aws:SourceIp 条件键。该策略拒绝访问代表您进行调用的 AWS 服务。例如,假定您有一个服务角色,该角色允许 AWS CloudFormation 调用 Amazon EC2 来停止实例。在这种情况下,请求会被拒绝,因为目标服务 (Amazon EC2) 看到的是进行调用的服务 (AWS CloudFormation) 的 IP 地址而不是源用户的 IP 地址。无法通过进行调用的服务将源 IP 地址传递到目标服务以在 JSON 策略中进行评估。

如果请求来自使用 Amazon VPC 终端节点的主机,则 aws:SourceIp 密钥不可用。您应改用特定于 VPC 的密钥。有关更多信息,请参阅 Amazon VPC 用户指南 中的 VPC 终端节点 - 控制终端节点的使用

aws:SourceVpc

字符串运算符结合使用。

限制对特定 VPC 的访问。有关更多信息,请参阅 Amazon Simple Storage Service 开发人员指南 中的限制对特定 VPC 的访问

此条件键适用于支持流量通过 VPC 终端节点的服务。

aws:SourceVpce

字符串运算符结合使用。

限制对特定 VPC 终端节点的访问。有关更多信息,请参阅 Amazon Simple Storage Service 开发人员指南 中的限制对特定 VPC 终端节点的访问

此条件键适用于支持流量通过 VPC 终端节点的服务。

aws:TagKeys

字符串运算符结合使用。

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

检查在 AWS 请求中包含的标签键。

作为使用策略来通过标签控制访问的最佳实践,您应该使用 aws:TagKeys 条件键来定义允许的标签键。有关示例策略和更多信息,请参阅控制标签键

注意

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

此条件键仅适用于某些服务,并引入了 Amazon EC2

aws:TokenIssueTime

日期运算符结合使用。

检查发布临时安全凭证的日期/时间。

此条件键仅适用于支持使用临时安全凭证的某些服务。要了解哪些服务支持使用临时凭证,请参阅使用 IAM 的 AWS 服务

aws:userid

字符串运算符结合使用。

检查请求者的用户 ID。

此条件键仅适用于某些服务。

aws:username

字符串运算符结合使用。

检查请求者的用户名。

此条件键仅适用于某些服务。

aws:VpcSourceIp

IP 地址运算符结合使用。

在 VPC 终端节点策略中使用时,限制从委托人的 VPC 中访问特定的 IP。

只能在 VPC 终端节点策略中使用该条件键。有关更多信息,请参阅 Amazon VPC 用户指南 中的使用 VPC 终端节点控制对服务的访问