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

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 服务的操作、资源和条件键并选择要查看其键的服务。

aws:CurrentTime

日期运算符结合使用。

使用此键可将请求的日期和时间与您在策略中指定的日期和时间进行比较。

  • 可用性 – 此键始终包含在请求上下文中。

aws:EpochTime

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

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

  • 可用性 – 此键始终包含在请求上下文中。

aws:MultiFactorAuthAge

数字运算符结合使用。

使用此键可将自使用 MFA 向请求委托人授权以来的秒数与您在策略中指定的数量进行比较。有关 MFA 的更多信息,请参阅 在 AWS 中使用 Multi-Factor Authentication (MFA)

  • 可用性 – 仅在使用 MFA 对委托人进行身份验证后,才将此键包含在请求上下文中。如果未使用 MFA,则此键不存在。

aws:MultiFactorAuthPresent

布尔值运算符结合使用。

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

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

临时凭证用于验证 IAM 角色、联合身份用户、带 sts:GetSessionToken 中的临时令牌的 IAM 用户和 AWS 管理控制台用户。AWS 管理控制台中的 IAM 用户无意中使用了临时凭证。用户使用其作为长期凭证的用户名和密码登录控制台。但在后台,控制台代表用户生成临时凭证。要了解哪些服务支持使用临时凭证,请参阅使用 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

字符串运算符结合使用。

使用此键可将请求委托人所属的账户与您在策略中指定的账户标识符进行比较。

  • 可用性 – 此键始终包含在请求上下文中。

aws:PrincipalArn

ARN 运算符结合使用。

使用此键可将发出请求的委托人的 Amazon 资源名称 (ARN) 与您在策略中指定的 ARN 进行比较。对于 IAM 角色,请求上下文将返回角色的 ARN,而不是已代入角色的用户的 ARN。要了解可在此条件键中指定哪些类型的委托人,请参阅指定委托人

  • 可用性 – 此键始终包含在请求上下文中。

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:PrincipalTag

字符串运算符结合使用。

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

  • 可用性 – 仅在委托人是具有附加标签的 IAM 用户或 IAM 角色时,才将此键包含在请求上下文中。

您可采用键/值对的形式向用户或角色添加自定义属性。有关 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

字符串运算符结合使用。

使用此键可将在客户端浏览器中引用请求的站点与您在策略中指定的引用站点进行比较。aws:referer 请求上下文值是由调用方在 HTTP 标头中提供的。

  • 可用性 – 仅在浏览器中使用 URL 调用请求后,才将此键包含在请求上下文中。

例如,您可以使用 Web 浏览器直接调用 Amazon S3 API 操作。这意味着,您可以通过 Web 浏览器直接查看 S3 对象,例如图像和文档。aws:referer 条件允许您根据引用站点标头的值来限制对 HTTP 或 HTTPS 请求中的特定值的访问。

警告

应谨慎使用此键。包含公共已知的引用站点标头值是非常危险的。未经授权方可能会使用修改的浏览器或自定义浏览器提供他们选择的任何 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: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 请求期间控制访问

  • 可用性y – 仅在请求中传递标签时,才将此键包含在请求上下文中。在请求中传递多个标签时,每个标签键/值对均有一个上下文键。

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

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

aws:ResourceTag/tag-key

字符串运算符结合使用。

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

  • 可用性y – 仅在请求的资源已附加标签时,才将此键包含在请求上下文中。每个标签键/值对均有一个上下文键。

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

aws:SecureTransport

布尔值运算符结合使用。

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

  • 可用性 – 此键始终包含在请求上下文中。

aws:SourceAccount

字符串运算符结合使用。

使用此键可将请求的源与您在策略中指定的账户 ID 进行比较。例如,假定在您的账户中有 Amazon S3 存储桶,该存储桶配置为向 Amazon SNS 主题传送对象创建事件。在此情况下,您可以使用此条件键来检查 Amazon S3 未被用作混淆代理人。Amazon S3 会告知 Amazon SNS 存储桶所属的账户。

  • 可用性 – 仅在资源触发一项服务以代表资源拥有者调用另一项服务时,将此键包含在请求上下文中。

aws:SourceArn

ARN 运算符结合使用。

使用此键可将请求的源与您在策略中指定的 Amazon 资源名称 (ARN) 进行比较。例如,当 Amazon S3 存储桶更新触发 Amazon SNS 主题帖子时,Amazon S3 服务将调用 sns:Publish API 操作。该存储桶被视为 SNS 请求的源,并且键的值是存储桶的 ARN。此键不适用于发出请求的委托人的 ARN。请改用 aws:PrincipalArn

  • 可用性 – 仅在资源触发一项服务以代表资源拥有者调用另一项服务时,将此键包含在请求上下文中。

源的 ARN 包含账户 ID,因此不必将 aws:SourceAccountaws:SourceArn 结合使用。

aws:SourceIp

IP 地址运算符结合使用。

使用此键可将请求者的 IP 地址与您在策略中指定的 IP 地址进行比较。要了解可与此键结合使用的条件运算符,请参阅 IP 地址条件运算符

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

可在策略中使用 aws:SourceIp 条件键以仅允许委托人从指定的 IP 范围发出请求。不过,该策略将拒绝访问代表您进行调用的 AWS 服务。例如,假定 AWS CloudFormation 使用服务角色来调用 Amazon EC2 以停止实例。在此情况下,请求会被拒绝,因为目标服务 (Amazon EC2) 看到的是进行调用的服务 (AWS CloudFormation) 的 IP 地址。请求上下文不包含源用户的 IP 地址。无法通过进行调用的服务将源 IP 地址传递到目标服务以在 JSON 策略中进行评估。

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

aws:SourceVpc

字符串运算符结合使用。

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

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

aws:SourceVpce

字符串运算符结合使用。

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

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

aws:TagKeys

字符串运算符结合使用。

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

  • 可用性 – 仅在操作支持将标签附加到资源时,才将此键包含在请求上下文中。

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

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

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

aws:TokenIssueTime

日期运算符结合使用。

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

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

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

aws:UserAgent

字符串运算符结合使用。

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

  • 可用性 – 此键始终包含在请求上下文中。

警告

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

aws:userid

字符串运算符结合使用。

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

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

aws:username

字符串运算符结合使用。

使用此键可将请求者的用户名与您在策略中指定的用户名进行比较。有关如何为不同的委托人显示信息的详细信息,请参阅指定委托人

  • 可用性 – 此键始终包含在 IAM 用户的请求上下文中。匿名请求或使用 AWS 账户根用户 或 IAM 角色发出的请求不包含此键。

aws:VpcSourceIp

IP 地址运算符结合使用。

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

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

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