AWS Identity and Access Management
用户指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

IAM JSON 策略元素:条件运算符

条件运算符是条件的“动词”形式,可指定 IAM 执行的比较类型。条件运算符可分为以下类别:

字符串条件运算符

利用字符串条件运算符,您可以构建基于键与字符串值的对比来限制访问的 Condition 元素。

条件运算符 说明

StringEquals

精确匹配,区分大小写

StringNotEquals

否定匹配

StringEqualsIgnoreCase

精确匹配,忽略大小写

StringNotEqualsIgnoreCase

否定匹配,忽略大小写

StringLike

区分大小写的匹配。此值可包括字符串中任何一个多字符匹配的通配符 (*) 或单字符匹配的通配符 (?)。字符串中的任何地方。

注意

如果键包含多个值,可使用集合运算符限定 StringLike - ForAllValues:StringLikeForAnyValue:StringLike。有关更多信息,请参阅 创建测试多个键值的条件 (集合运算)

StringNotLike

不区分大小写的无效匹配。此值可包括字符串中任何一个多字符匹配的通配符 (*) 或单字符匹配的通配符 (?)。字符串中的任何地方。

例如,以下声明包含一个 Condition 元素,该元素采用 StringEquals 条件运算符和 aws:UserAgent 键来指定在请求的用户代理标头中必须包含特定值。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "iam:*AccessKey*", "Resource": "arn:aws-cn:iam::ACCOUNT-ID-WITHOUT-HYPHENS:user/*", "Condition": {"StringEquals": {"aws:UserAgent": "Example Corp Java Client"}} } }

以下示例使用 StringLike 条件运算符执行与策略变量的字符串匹配来创建策略,该策略允许 IAM 用户使用 Amazon S3 控制台管理其 Amazon S3 存储桶中的“主目录”。该策略允许对 S3 存储桶执行指定操作,前提是 s3:prefix 与任一指定模式相匹配。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets", "s3:GetBucketLocation" ], "Resource": "arn:aws-cn:s3:::*" }, { "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws-cn:s3:::BUCKET-NAME", "Condition": {"StringLike": {"s3:prefix": [ "", "home/", "home/${aws:username}/" ]}} }, { "Effect": "Allow", "Action": "s3:*", "Resource": [ "arn:aws-cn:s3:::BUCKET-NAME/home/${aws:username}", "arn:aws-cn:s3:::BUCKET-NAME/home/${aws:username}/*" ] } ] }

有关演示如何使用 Condition 元素基于 Web 联合身份验证的应用程序 ID 和用户 ID 限制对资源的访问的策略示例,请参阅Amazon S3:允许 Amazon Cognito 用户访问其存储桶中的对象

数字条件运算符

利用数字条件运算符,您可以构建基于键与整数或小数值的对比来限制访问的 Condition 元素。

条件运算符 说明

NumericEquals

匹配

NumericNotEquals

否定匹配

NumericLessThan

“小于”匹配

NumericLessThanEquals

“小于或等于”匹配

NumericGreaterThan

“大于”匹配

NumericGreaterThanEquals

“大于或等于”匹配

例如,以下声明包含一个 Condition 元素,该元素使用 NumericLessThanEquals 条件运算符与 s3:max-keys 键来指定请求者一次最多可在 example_bucket 内列出 10 个对象。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws-cn:s3:::example_bucket", "Condition": {"NumericLessThanEquals": {"s3:max-keys": "10"}} } }

日期条件运算符

利用日期条件运算符,您可以构建基于键与日期/时间值的对比来限制访问的 Condition 元素。您同时使用这些条件运算符与 aws:CurrentTime 键或 aws:EpochTime 键。您必须指定日期/时间值,且其中一个 W3C 实现要采用 ISO 8601 日期格式或新纪元 (UNIX) 时间格式。

注意

日期条件运算符不允许使用通配符。

条件运算符 说明

DateEquals

匹配特定日期

DateNotEquals

否定匹配

DateLessThan

在特定日期和时间之前匹配。

DateLessThanEquals

在特定日期和时间或之前匹配

DateGreaterThan

在特定日期和时间之后匹配

DateGreaterThanEquals

在特定日期和时间或之后匹配

例如,以下声明包含一个 Condition 元素,该元素使用 DateLessThan 条件运算符与 aws:CurrentTime 键来指定必须在 2013 年 6 月 30 日之前收到请求。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "iam:*AccessKey*", "Resource": "arn:aws-cn:iam::ACCOUNT-ID-WITHOUT-HYPHENS:user/*", "Condition": {"DateLessThan": {"aws:CurrentTime": "2013-06-30T00:00:00Z"}} } }

布尔值条件运算符

利用布尔值条件,您可以构建基于键与“正确”或“错误”的对比来限制访问的 Condition 元素。

条件运算符 说明

Bool

布尔值匹配

例如,下列声明使用 Bool 条件运算符与 aws:SecureTransport 键来指定必须使用 SSL 发出请求。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "iam:*AccessKey*", "Resource": "arn:aws-cn:iam::ACCOUNT-ID-WITHOUT-HYPHENS:user/*", "Condition": {"Bool": {"aws:SecureTransport": "true"}} } }

二进制条件运算符

利用 BinaryEquals 条件运算符,您可以构建测试二进制格式键值的 Condition 元素。它会比较指定键字节的值和策略中 base-64 编码表示的二进制值。

"Condition" : { "BinaryEquals": { "key" : "QmluYXJ5VmFsdWVJbkJhc2U2NA==" } }

IP 地址条件运算符

利用 IP 地址条件运算符,您可以构建 Condition 元素,它们会基于键与 IPv4 或 IPv6 地址或 IP 地址范围的对比来限制访问。可以用aws:SourceIp键使用它们。该值必须采用标准的 CIDR 格式 (例如 203.0.113.0/24 或 2001:DB8:1234:5678::/64)。如果您指定的 IP 地址没有关联的路由前缀,IAM 将使用 /32 作为默认前缀值。

某些 AWS 服务支持 IPv6,使用 :: 表示一系列 0。要了解某项服务是否支持 IPv6,请参阅该服务的文档。

条件运算符 说明

IpAddress

指定的 IP 地址或范围

NotIpAddress

除指定 IP 地址或范围外的所有 IP 地址

例如,下列声明使用 IpAddress 条件运算符与 aws:SourceIp 键来指定必须从 IP 范围 203.0.113.0 至 203.0.113.255 发出请求。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "iam:*AccessKey*", "Resource": "arn:aws-cn:iam::ACCOUNT-ID-WITHOUT-HYPHENS:user/*", "Condition": {"IpAddress": {"aws:SourceIp": "203.0.113.0/24"}} } }

aws:SourceIp 条件密钥解析为发出请求的 IP 地址。如果请求源自 Amazon EC2 实例,则 aws:SourceIp 计算为实例的公有 IP 地址。

下面的示例说明如何结合使用 IPv4 和 IPv6 地址来覆盖组织的所有有效 IP 地址。建议您使用您的 IPv6 地址范围以及已拥有的 IPv4 范围来增强组织的策略,以确保策略在您过渡到 IPv6 时继续有效。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "someservice:*", "Resource": "*", "Condition": { "IpAddress": { "aws:SourceIp": [ "203.0.113.0/24", "2001:DB8:1234:5678::/64" ] } } } }

如果以用户身份直接调用测试的 API,aws:SourceIp 条件键仅在 JSON 策略中有效。如果改为使用服务代表您调用目标服务,则目标服务看到的是进行调用的服务的 IP 地址而不是源用户的 IP 地址。举例来说,如果使用 AWS CloudFormation 调用 Amazon EC2 来构建实例,则会发生这种情况。目前,无法通过进行调用的服务将源 IP 地址传递给目标服务以在 JSON 策略中进行评估。对于这些服务 API 调用类型,请勿使用 aws:SourceIp 条件键。

Amazon 资源名称 (ARN) 条件运算符

利用 Amazon 资源名称 (ARN) 条件运算符,您可以构建基于键与 ARN 的对比来限制访问的 Condition 元素。ARN 被视为一个字符串。此值只可用于某些服务;不是所有服务都支持可作为 ARN 比较的请求值。

条件运算符 描述

ArnEqualsArnLike

区分大小写的 ARN 匹配。ARN 的六个由冒号分隔开的部分都要单独检查,每一个部分都可包括一个多字符匹配通配符 (*) 或一个单字符匹配通配符。这些部分的行为相同。

ArnNotEqualsArnNotLike

ARN 无效匹配. 这些部分的行为相同。

在下列示例中列举了您需要附加到任何 Amazon SNS 队列 (您希望接收 SNS 消息的队列) 的策略。它授予 Amazon SNS 将消息发送到所选队列的权限,但仅在该服务代表特定 Amazon SNS 主题发送这些消息时才授予此权限。您在 Resource 字段中指定队列,Amazon SNS 主题则作为 SourceArn 键的值。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": {"AWS": "123456789012"}, "Action": "SQS:SendMessage", "Resource": "arn:aws-cn:sqs:REGION:123456789012:QUEUE-ID", "Condition": {"ArnEquals": {"aws:SourceArn": "arn:aws-cn:sns:REGION:123456789012:TOPIC-ID"}} } }

...IfExists 条件运算符

Null 条件外,您可在任何条件运算符名称的末尾添加 IfExists - 例如,StringLikeIfExists。如果您是指“如果请求的内容中存在策略键,则依照策略所述来处理键。若该键不存在,则该条件将条件元素计算为 true。语句中其他条件因素仍然可以导致不匹配,但使用 ...IfExists 检查时没有缺失键。

使用 IfExists 的示例

许多条件键描述有关特定类型的资源的信息,仅当访问该类型的资源时才存在。这些条件键在其他类型的资源上不存在。当策略语句仅适用于一种类型的资源时,这不会导致问题。但是,有时单个语句可以适用于多种类型的资源,例如当策略语句从多个服务引用操作时,或是当服务中的给定操作访问同一服务中的多种不同资源类型时。在这种情况下,在策略语句中包含仅适用于一种资源的条件键可能会导致策略语句中的 Condition 元素失败,从而使语句的 "Effect" 不适用。

例如,请考虑以下策略示例:

{ "Version": "2012-10-17", "Statement": { "Sid": "THISPOLICYDOESNOTWORK", "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "*", "Condition": {"StringLike": {"ec2:InstanceType": [ "t1.*", "t2.*", "m3.*" ]}} } }

上述策略的意图 是使用户可以启动类型为 t1、t2 或 m3 的任何实例。但是,启动实例实际上要求访问除了实例本身之外的许多资源;例如映像、密钥对、安全组等。会针对启动实例所需的每个资源来评估整个语句。这些其他资源没有 ec2:InstanceType 条件键,因此 StringLike 检查会失败,并且不会向用户授予启动任何 实例类型的能力。要解决此问题,请改用 StringLikeIfExists 条件运算符。这样,仅当条件键存在时才会进行测试。您会读到以下内容:“If the resource being checked has an "ec2:InstanceType" condition key, then allow the action only if the key value begins with "t1.*", "t2.*", or "m3.*". If the resource being checked does not have that condition key, then don't worry about it.”

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "*", "Condition": {"StringLikeIfExists": {"ec2:InstanceType": [ "t1.*", "t2.*", "m3.*" ]}} } }

用于检查条件键是否存在的条件运算符

使用 Null 条件运算符检查授权时是否有条件键。在策略语句中使用 true (键不存在 - 为 null) 或 false (键存在且值不为 null)。

例如,您可以使用此条件运算符确定用户使用的是自己的针对该操作的凭证还是临时凭证。如果用户使用的是临时凭证,则键 aws:TokenIssueTime 存在并具有一个值。以下示例显示了一个条件,该条件说明用户在使用 Amazon EC2 API 时不能使用临时凭证 (键不能存在)。

{ "Version": "2012-10-17", "Statement":{ "Action":"ec2:*", "Effect":"Allow", "Resource":"*", "Condition":{"Null":{"aws:TokenIssueTime":"true"}} } }