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

AWS 全局条件上下文键

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

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

注意

如果您使用只在某些情况下可用的条件键 (例如 aws:SourceIpaws:SourceVpc),则可使用 IfExists 版本的比较运算符。如果请求上下文中缺少条件键 (未设置 IfExists),策略引擎将无法通过评估。例如,如果需要编写策略来限制来自特定 IP 范围或特定 VPC 的访问,则可按如下所示构造条件:

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

此条件满足 (1) 如果 aws:SourceIp 上下文键存在并且值为 xxx或者 (2) 如果 aws:SourceVpc 上下文键存在并且值为 yyy。如果两个键中的任意一个不存在或两个都不存在,条件仍匹配。仅当请求上下文中存在指定的键时,才进行测试。如果不存在,则视为“与我无关”。

AWS 为支持 IAM 的所有 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 使用的方式:

##### THIS EXAMPLE DOES NOT WORK ##### "Condition" : { "Bool" : { "aws:MultiFactorAuthPresent" : false } }

这是因为使用长期凭证时,aws:MultiFactorAuthPresent 键在请求中不存在,导致测试始终 失败,最终造成不匹配。相反,我们建议您使用 BoolIfExists 运算符检查值。例如:

"Condition" : { "BoolIfExists" : { "aws:MultiFactorAuthPresent" : false } }

*IfExists 运算符表示当值存在且值为“false”或者 值不存在时语句将匹配。*IfExists 意味着您仅关注值 (如果已使用)。如果您不希望在未使用值时匹配失败,请使用此选项。

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

##### THIS EXAMPLE DOES NOT WORK ##### "Action" : "Deny", "Condition" : { "Null" : { "aws:MultiFactorAuthPresent" : true } }

您可能希望上述示例在未使用 MFA 时拒绝访问。当您使用 IAM 角色、联合身份用户、AWS 管理控制台或凭证从 sts:GetSessionToken 发出请求时,是这样。但是,当您使用 IAM 用户的长期凭证(访问密钥)发出 API 请求时,MFA 上下文不可用于测试。因此,此条件键始终为 false,无论所测试用户是否是使用 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:PrincipalType

字符串运算符结合使用。

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

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

aws:Referer

字符串运算符结合使用。

检查谁将客户端浏览器指向到请求发送到的地址。只有某些服务 (如 Amazon S3,作为可以由 Web 浏览器直接寻址的服务) 支持它。值来自对 AWS 进行的 HTTPS 请求中的引用站点标头。

警告

应谨慎使用此键:aws:referer 允许 Amazon S3 存储桶拥有者帮助阻止未经授权的第三方站点将其内容提供给标准 Web 浏览器。有关更多信息,请参阅上一段中的链接。由于 aws:referer 值由发起人在 HTTP 标头中提供,因此未经授权的第三方可以修改或自定义浏览器以提供他们选择的任何 aws:referer 值。因此,aws:referer 不应用于阻止未经授权的第三方发出直接 AWS 请求。提供它只是为了允许客户保护其存储在 Amazon S3 中的数字内容,以免在未经授权的第三方站点上引用。

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

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:RequestTag/tag-key

字符串运算符结合使用。

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

在 AWS 请求中检查标签及其值。例如,您可以检查请求是否包含标签键 "Dept" 并具有 "Accounting" 值。

该 AWS 条件键是为 Amazon EC2 引入的,支持该键的其他服务数量有限。请检查服务,以了解它是否支持使用该条件键。

aws:SecureTransport

布尔值运算符结合使用。

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

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 服务的流量支持此条件键。)

aws:SourceVpce

字符串运算符结合使用。

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

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

aws:TagKeys

字符串运算符结合使用。

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

检查在 AWS 请求中包含的标签键。该 AWS 条件键是为 Amazon EC2 引入的,支持该键的其他服务数量有限。请检查服务,以了解它是否支持使用该条件键。

aws:TokenIssueTime

日期运算符结合使用。

检查发布临时安全凭证的日期/时间。此键仅在使用临时安全凭证签名的请求中存在。有关临时安全凭证的更多信息,请参阅临时安全凭证

aws:UserAgent

字符串运算符结合使用。

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

aws:userid

字符串运算符结合使用。

检查请求者的用户 ID。

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

aws:username

字符串运算符结合使用。

检查请求者的用户名。

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