JSON元素参考
策略由JSON元素组成,本章节对这些元素进行逐一介绍。这些元素按照在身份策略中使用的大致顺度列出,但是元素的顺序实际上并不重要,顺序不同并不会导致权限不一致。例如,Resource元素可以在Action元素之前出现。注意,一些JSON元素会相互排斥,这意味着您不能创建同时包含两个相互排斥的元素的策略。例如,您不能在同一策略语句中同时使用Action和NotAction。
Version

Version 策略元素与身份策略的版本不同。Version策略元素用在身份策略之中,是用于定义身份策略语言的版本。而身份策略版本是指您在创建或修改自定义身份策略时,IAM均会将创建一个新的身份策略版本,身份策略版本功能可以让您快速回退到身份策略的历史版本。如果您想了解与身份策略版本相关的更多信息,请参见身份策略版本。
{ "Version": "5.0", "Statement": [ { "Effect": "Allow", "Action": [ "obs:bucket:listBucket" ] } ] }
Statement
"Statement": [{...},{...},{...}]
{ "Version": "5.0", "Statement": [ { "Effect": "Allow", "Action": [ "obs:bucket:listBucket" ] }, { "Effect": "Allow", "Action": [ "ecs:servers:get", "ecs:servers:list" ] } ] }
Sid
{ "Version": "5.0", "Statement": [ { "Sid": "StatementIDExample", "Effect": "Allow", "Action": [ "obs:bucket:listBucket" ] } ] }
Effect
"Effect":"Allow"
Principal
在资源策略中可以使用Principal元素指定允许或拒绝主体访问该资源。目前华为云的资源策略仅包含OBS桶策略和IAM信任策略,详情请参见支持身份策略与信任委托的云服务列表中的“基于资源的策略”列。
- 账号 Principal
Principal策略元素中的“IAM”元素表示账号主体。例如,在IAM信任委托中,当信任的主体类型是普通账号时,您可以在信任策略中指定受信任账号的账号ID来实现跨账号的资源访问。
例如,在给定账号ID为“55555555555555555555555555555555“ 的情况下,您可以使用以下方法来在 Principal元素中指定账号主体:{ "Version": "5.0", "Statement": [ { "Principal": { "IAM": [ "55555555555555555555555555555555" ] }, "Effect": "Allow", "Action": [ "sts:agencies:assume" ] } ] }
因为“IAM”元素值是数组形式,因此您可以在该元素中指定多个账号主体:{ "Version": "5.0", "Statement": [ { "Principal": { "IAM": [ "55555555555555555555555555555555", "ffffffffffffffffffffffffffffffff" ] }, "Effect": "Allow", "Action": [ "sts:agencies:assume" ] } ] }
- 云服务 Principal
Principal策略元素中的“Service”元素表示云服务主体。继续以信任委托为例,当信任的主体类型是云服务时,您可以在信任策略中指定受信任账号为华为云服务,将账号内资源的操作权限委托给华为云服务。以下示例描述了将账号内资源的操作权限委托给资源治理中心RGC服务。
{ "Version": "5.0", "Statement": [ { "Action": [ "sts:agencies:assume" ], "Effect": "Allow", "Principal": { "Service": [ "service.RGC" ] } } ] }
Action
Action元素描述将允许或拒绝的特定操作,Action元素的值也称为授权项。Statement元素中的语句必须包含Action或NotAction元素。每个云服务都有自己单独的授权项,一般以云服务名称为前缀,要查看每个云服务支持的授权项完整列表,请参见身份策略授权参考,然后打开指定云服务的章节,并导航至“操作”小节。一些云服务的Action 元素示例如下:
"Action":["obs:object:PutObjectRetention"]
"Action": ["ecs:cloudServers:put"]
"Action": ["iam:users:listUsersV5"]
"Action": ["obs:object:PutObjectRetention", "ecs:cloudServers:put", "iam:users:listUsersV5"]
"Action": ["ECS:*:*"]
"Action": ["iam:credentials:*CredentialV5"]
NotAction
- NotAction与Allow
可在包含 "Effect": "Allow" 的语句中使用 NotAction 元素,来提供未在NotAction元素中列出的所有授权项对应的操作的访问权限。有时您可能需要允许访问大量操作,使用 NotAction 元素可有效地修改策略语句,生成更短的授权项列表。例如,由于华为云提供了很多的云服务,您可能需要创建一个身份策略,以允许用户执行除访问 IAM 操作之外的所有操作,其身份策略示例如下所示:
{ "Version": "5.0", "Statement": [ { "Effect": "Allow", "NotAction": [ "IAM:*:*" ] } ] }
在同一语句或一个策略内的不同语句中使用 NotAction 元素和 "Effect": "Allow" 时要特别注意,NotAction会匹配所有未明确列出或不适用于指定资源的服务和授权项,这可能会授予用户比您预期更多的权限。
- NotAction与Deny
可在包含 "Effect": "Deny" 的语句中使用 NotAction 元素,来拒绝未在NotAction元素中列出的所有授权项对应的操作的访问权限。此组合没有授予列出的服务和授权项的权限,而是拒绝所有未列出的服务和授权项,因此您仍然需要显示允许您要授予的服务和授权项。
以下条件示例拒绝用户在未使用多重身份验证(MFA)登录时访问非IAM的操作。如果用户使用MFA登录,则Condition匹配失败,最终的 Deny语句将不起作用。但请注意,这并不会授予用户访问任何操作的权限;它只会在未使用多重身份验证登录时明确拒绝除IAM操作之外的所有其他操作。{ "Version": "5.0", "Statement": [ { "Effect": "Deny", "NotAction": [ "IAM:*:*" ], "Condition": { "BoolIfExists": { "g:MFAPresent": [ "false" ] } } } ] }
Resource
策略语句中的 Resource 元素指定了该语句适用的一个或多个资源。华为云使用资源URN来标识资源,资源URN的格式取决于具体云服务和特定资源,有关资源URN的介绍,请参见使用URN标识华为云资源。尽管URN格式各不相同,但您可以始终使用 URN 来标识资源,想要查看云服务特定资源的URN格式,请参见身份策略授权参考,然后打开指定云服务的章节,并导航至“资源类型”小节。
"Resource": ["obs::xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:bucket:*"]
- 在资源URN中使用通配符
您可在URN(用冒号分隔的部分)的各分段中使用通配符(*和 ?):
- *号可以匹配任意的多个字符。
- ?号可以匹配任意的一个字符。
您可以在每个分段中使用多个 * 或 ? 字符。如果 * 通配符是资源 URN 分段的最后一个字符,则它可以扩展以匹配冒号边界以外的内容。不得在服务分段中使用通配符,有关URN分段的更多信息,请参见使用URN标识华为云资源。
以下示例表示了其账号下的所有IAM用户。注意,需要在实际使用时将{account_id}替换为您实际的账号ID。"Resource": ["iam:*:{account_id}:user:*"]
以下示例表示了其账号中my-bucket桶my-object目录下的所有对象。注意,需要在实际使用时将{account_id}替换为您实际的账号ID。"Resource": ["obs:*:{account_id}:object:my-bucket/my-object/*"]
- 指定多个资源
Resource元素是数组格式,您可以在数组中指定多个资源。下列示例适用于OBS服务的my-bucket桶my-object目录下的所有对象以及IAM所有的委托及信任委托。注意,需要在实际使用时将{account_id}替换为您实际的账号ID。
"Resource": [ "obs:*:{account_id}:bucket:my-bucket/my-object/*", "iam:*:{account_id}:agency:*" ]
- 在资源URN中使用策略变量
在Resource元素中,您可以在标识特定资源的URN部分中使用策略变量。例如,您可以使用${g:UserName}作为资源URN的一部分,以表示应包含当前用户的名称作为资源名称的一部分。
{ "Version": "5.0", "Statement": [ { "Effect": "Allow", "Action": [ "obs:bucket:listBucket" ], "Resource": [ "obs:*:*:bucket:${g:UserName}" ] } ] }
Condition
Condition元素允许您指定策略生效的条件。Condition元素是可选的。在Condition元素中,您可以使用条件键和运算符来构建出使策略生效的特定条件。
条件键名称不区分大小写,条件键的键值是否区分大小写取决于您使用的运算符。
{ "Version": "5.0", "Statement": [ { "Effect": "Allow", "Action": [ "iam:users:listUsersV5" ], "Condition": { "StringEquals": { "g:UserName": [ "Bob" ] } } } ] }
{ "Version": "5.0", "Statement": [ { "Effect": "Allow", "Action": [ "iam:users:listUsersV5" ], "Condition": { "StringEquals": { "g:userName": [ "Bob" ] } } } ] }
{ "Version": "5.0", "Statement": [ { "Effect": "Allow", "Action": [ "iam:users:listUsersV5" ], "Condition": { "StringEqualsIgnoreCase": { "g:userName": [ "Bob" ] } } } ] }
- 运算符
运算符与条件键、条件值一起构成完整的条件判断语句,当请求信息满足该条件时,策略才能生效。运算符可以增加后缀“IfExists”,表示对应请求值不存在或请求值存在且满足条件时均使策略生效,如“StringEqualsIfExists”表示请求值不存在或请求值等于条件值均使策略生效。
- 请求值是指请求上下文中携带的条件键对应的值,条件值是指策略中配置的条件键对应的值。
- 请求值不存在和空值是2个概念,空值表示请求值存在但是为空。例如,如果是字符串类型条件键,不存在表示为None,空值则是空字符串;如果是多值条件键,不存在表示为None,空值则是空数组。
- 否定运算符,如"StringNotEquals",确实与None值匹配,因为None值不等于指定的字符串值。
- String类型运算符
- 策略变量 – 支持
- 通配符 – 只有StringMatch和StringNotMatch支持
表1 String类型运算符 类型
运算符
说明
String
StringEquals
请求值与任意一个条件值相同,区分大小写。
StringNotEquals
请求值与所有条件值都不同,区分大小写。
StringEqualsIgnoreCase
请求值与任意一个条件值相同,不区分大小写。
StringNotEqualsIgnoreCase
请求值与所有条件值都不同,不区分大小写。
StringLike(不推荐)
任何一个条件值作为请求值连续子串出现,不区分大小写,不支持通配符。
StringNotLike(不推荐)
所有条件值均不作为请求值连续子串出现,不区分大小写,不支持通配符。
StringMatch(推荐)
请求值符合任意一个条件值,区分大小写,支持通配符*和?。如果StringMatch包含多个值,还可以使用集合运算符ForAllValues、ForAnyValue来限定。
StringNotMatch(推荐)
请求值不符合所有条件值,区分大小写,支持通配符*和?。如果StringNotMatch包含多个值,还可以使用集合运算符ForAllValues、ForAnyValue来限定。
StringStartWith
包含作为前缀,不区分大小写。
StringEndWith
包含作为后缀,不区分大小写。
StringNotStartWith
未包含作为前缀,不区分大小写。
StringNotEndWith
未包含作为后缀,不区分大小写。
示例:指定用户名为ZhangSan的请求者才能够查询IAM用户列表。{ "Version": "5.0", "Statement": [ { "Effect": "Allow", "Action": [ "iam:users:listUsersV5" ], "Condition": { "StringEquals": { "g:UserName": [ "ZhangSan" ] } } } ] }
如果请求上下文中没有您在策略条件中指定的键,则这些值不匹配。在下面示例中,当主体是IAM用户时,只有为IAM用户添加了标签时,请求上下文中才会存在 g:PrincipalTag/job-category 键;当主体是IAM信任委托时,为信任委托添加了标签或在获取信任委托临时安全凭证时添加了会话标签,则请求上下文中也会存在 g:PrincipalTag/job-category 键。如果使用没有标签的主体发起请求,则该条件将会返回 false,因此没有标签的主体将会被拒绝访问用户列表。{ "Version": "5.0", "Statement": [ { "Effect": "Allow", "Action": [ "iam:users:listUsersV5" ], "Condition": { "StringEquals": { "g:PrincipalTag/job-category": [ "admin" ] } } } ] }
下表显示了IAM如何根据请求中的条件键值来评估此策略。表2 IAM如何根据请求中的条件键值来评估此策略 身份策略条件
请求上下文
结果
"StringEquals": { "g:PrincipalTag/job-category": [ "admin" ] }
g:PrincipalTag/job-category: admin
匹配
"StringEquals": { "g:PrincipalTag/job-category": [ "admin" ] }
g:PrincipalTag/job-category: operator
不匹配
"StringEquals": { "g:PrincipalTag/job-category": [ "admin" ] }
请求上下文中没有 g:PrincipalTag/job-category
不匹配
- Number类型运算符
- 策略变量 – 支持
- 通配符 – 不支持
表3 Number类型运算符 类型
运算符
说明
Number
NumberEquals
请求值等于任意一个条件值
NumberNotEquals
请求值不等于所有条件值
NumberLessThan
请求值小于任意一个条件值
NumberLessThanEquals
请求值小于或等于任意一个条件值
NumberGreaterThan
请求值大于任意一个条件值
NumberGreaterThanEquals
请求值大于或等于任意一个条件值
示例:请求者一次最多可以在example_bucket桶中列出10个对象。{ "Version": "5.0", "Statement": [ { "Effect": "Allow", "Action": [ "obs:bucket:ListBucket" ], "Resource": [ "OBS:*:*:bucket:example_bucket" ], "Condition": { "NumberLessThanEquals": { "obs:max-keys": [ "10" ] } } } ] }
- Date类型运算符
Date类型用于匹配RFC 3339格式的UTC时间。
- 策略变量 – 支持
- 通配符 – 不支持
表4 Date类型运算符 类型
运算符
说明
Date
DateEquals
请求值等于任意一个条件值
DateNotEquals
请求值不等于所有条件值
DateLessThan
请求值早于任意一个条件值
DateLessThanEquals
请求值早于或等于任意一个条件值
DateGreaterThan
请求值晚于任意一个条件值
DateGreaterThanEquals
请求值晚于或等于任意一个条件值
示例:请求者只能在2025年9月9日前查询IAM用户列表。{ "Version": "5.0", "Statement": [ { "Effect": "Allow", "Action": [ "iam:users:listUsersV5" ], "Condition": { "DateLessThan": { "g:CurrentTime": [ "2025-09-09T00:00:00Z" ] } } } ] }
- Bool类型运算符
- 策略变量 – 支持
- 通配符 – 不支持
表5 Bool类型运算符 类型
运算符
说明
Bool
Bool
条件值可选值:true、false,不区分大小写。当请求值等于条件键的值时视作匹配,当请求值不存在时,视作不匹配。
示例:请求者必须使用开启了MFA认证的凭证才能修改永久访问密钥。{ "Version": "5.0", "Statement": [ { "Effect": "Allow", "Action": [ "iam:credentials:updateCredentialV5" ], "Condition": { "Bool": { "g:MFAPresent": [ "true" ] } } } ] }
- IP类型运算符
- 策略变量 – 支持
- 通配符 – 不支持
表6 IP类型运算符 类型
运算符
说明
IP
IpAddress
指定IP地址或者IP范围。
当条件键为多值条件键时,支持传入IP或IP网段,其语义为:
- 对于ForAnyValue:请求上下文中任一IP(包括IP网段中的IP)需要在用户策略配置网段中任意一个或多个的网段中时策略才生效。
- 对于ForAllValues:请求上下文中所有IP(包括IP网段中的IP)需要在用户策略配置网段中任意一个或多个的子网中时策略才生效。
NotIpAddress
指定IP地址或者IP范围之外的所有IP地址。
当条件键为多值条件键时,支持传入IP或IP网段,其语义为:
- 对于ForAnyValue:请求上下文中任一IP(包括IP网段中的IP)不在用户策略配置所有网段中时策略才生效。
- 对于ForAllValues:请求上下文中所有IP(包括IP网段中的IP)都不在用户策略配置所有网段中时策略才生效。
示例:只允许IP地址在10.27.128.0到10.27.128.255范围内的请求才能够修改指定的永久访问密钥。有关g:SourceIp条件键的详细介绍见全局条件键。{ "Version": "5.0", "Statement": [{ "Effect": "Allow", "Action": [ "iam:credentials:updateCredentialV5" ], "Condition": { "IpAddress": { "g:SourceIp": [ "10.27.128.0/24" ] } } }] }
- Null类型运算符
- 策略变量 – 支持
- 通配符 – 不支持
表7 Null类型运算符 类型
运算符
说明
Null
Null
条件值可选值:true、false,不区分大小写。条件值为true,要求请求值不存在即值为null;条件值为false,要求请求值必须存在即不为null。
示例:请求者的创建桶请求必须来源于VPC。{ "Version": "5.0", "Statement": [ { "Effect": "Allow", "Action": [ "obs:bucket:CreateBucket" ], "Condition": { "Null": { "obs:SourceVpc": [ "false" ] } } } ] }
- IfExists 运算符后缀
除Null运算符以外,您可以在任何条件运算符名称的末尾添加IfExists,例如:StringEqualsIfExists。如果请求的内容中存在条件键,则依照策略所述来进行匹配。如果该键不存在,则该条件元素的匹配结果将为true。
语句中其他条件因素仍然可以导致不匹配。如果您使用否定运算符(如 StringNotEqualsIfExists),无论是否带有IfExists后缀,都等效于存在IfExists后缀。例如,在Effect为Deny时使用StringNotEquals,即使条件键不存在,请求仍会被拒绝。
{ "Version": "5.0", "Statement": [ { "Effect": "Allow", "Action": [ "iam:users:listUsersV5" ], "Condition": { "StringEqualsIfExists": { "g:PrincipalTag/job": [ "iam-user" ] } } } ] }
下表显示了如何根据请求中的条件键值来评估此策略。表8 根据请求中的条件键值来评估此策略 策略条件
请求上下文
结果
"Condition": { "StringEqualsIfExists": { "g:PrincipalTag/job": [ "iam-user" ] } }
g:PrincipalTag/job:iam-user
匹配
"Condition": { "StringEqualsIfExists": { "g:PrincipalTag/job": [ "iam-user" ] } }
g:PrincipalTag/job:admin
不匹配
"Condition": { "StringEqualsIfExists": { "g:PrincipalTag/job": [ "iam-user" ] } }
请求上下文中没有标签g:PrincipalTag/job
不匹配
- 多个条件键或值
您可以使用Condition元素来编写具有多个条件键或单个条件键具有多个值的策略。
- 多个条件键或值的评估逻辑
一个Condition元素可以包含多个运算符,而每个运算符又可以包含多个条件键的键值对。
- 如果您的策略语句具有多个运算符,则使用AND运算逻辑评估这些运算符。
- 如果您的策略语句在一个运算符中包含多个条件键,则使用AND运算逻辑评估这些条件键。
- 如果单个运算符包含一个条件键的多个值,则使用OR运算逻辑评估这些值。
- 如果单个表否定含义的运算符(例如:StringNotEquals)包含一个条件键的多个值,则使用NOR运算逻辑评估这些值。
Condition元素中的所有条件键都必须解析为true才能达到所需的Allow或Deny效果。
下图说明了具有多个运算符和条件键值对的评估逻辑。图1 多个运算符和条件键值对的评估逻辑例如,以下IAM身份策略说明了上图在策略中的表示方式。此条件块包含条件运算符StringEquals ,以及条件键g:UserName和 g:PrincipalTag/job。要达到所需的Allow或Deny效果,Condition元素中的所有条件键都必须解析为true。
此身份策略描述的是对IAM用户名为bob或者alice,且携带键值为"job":"admin"的标签的用户被授予IAM服务的所有权限。{ "Version": "5.0", "Statement": [ { "Effect": "Allow", "Action": [ "IAM:*:*" ], "Condition": { "StringEquals": { "g:UserName": [ "bob", "alice" ], "g:PrincipalTag/job": [ "admin" ] } } } ] }
下表显示了IAM如何根据请求中的条件键值来评估身份策略。表9 根据请求中的条件键值评估身份策略 身份策略条件
请求上下文
结果
"Condition": { "StringEquals": { "g:UserName": [ "bob", "alice" ], "g:PrincipalTag/job": [ "admin" ] } }
g:UserName: "bob" g:PrincipalTag/job: "admin"
匹配
"Condition": { "StringEquals": { "g:UserName": [ "bob", "alice" ], "g:PrincipalTag/job": [ "admin" ] } }
g:UserName: "alice" 请求上下文中没有主体标签
不匹配
"Condition": { "StringEquals": { "g:UserName": [ "bob", "alice" ], "g:PrincipalTag/job": [ "admin" ] } }
g:UserName: "other-user" g:PrincipalTag/job: "admin"
不匹配
"Condition": { "StringEquals": { "g:UserName": [ "bob", "alice" ], "g:PrincipalTag/job": [ "admin" ] } }
g:UserName: "alice" g:PrincipalTag/job: "iam-user"
不匹配
- 否定运算符的评估逻辑
一些运算符(如StringNotEquals或StringNotMatch),使用否定匹配的方式将策略中的条件键值对与请求中的上下文键值对进行比较。当使用否定运算符为策略中的单个条件键指定多个值时,其工作方式类似于NOR运算逻辑。在否定匹配中,IAM会将请求中的上下文键值与策略的条件键值逐一比较,仅当所有值都计算为false时,逻辑NOR或NOT OR才会返回true。
下图说明了具有多个运算符和条件键值对的否定运算符的评估逻辑。图2 多个运算符和条件键值对的否定运算符的评估逻辑以下示例描述了请求者的用户名不在否定匹配条件键对应的列表中时,结果鉴权为true。{ "Version": "5.0", "Statement": [ { "Effect": "Allow", "Action": [ "IAM:*:*" ], "Condition": { "StringNotEquals": { "g:UserName": [ "alice", "bob" ] } } } ] }
下表显示了IAM如何根据请求中的条件键值来评估此身份策略。表10 根据请求中的条件键值评估身份策略 策略条件
请求上下文
结果
"Condition": { "StringNotEquals": { "g:UserName": [ "alice", "bob" ] } }
g:UserName: alice
不匹配
"Condition": { "StringNotEquals": { "g:UserName": [ "alice", "bob" ] } }
g:UserName: bob
不匹配
"Condition": { "StringNotEquals": { "g:UserName": [ "alice", "bob" ] } }
g:UserName: other-user
匹配
- 多个条件键或值的评估逻辑
- 单值和多值条件键
单值条件键和多值条件键之间的差异取决于请求上下文中的值数量,而不是策略条件中的值数量。要查看每个云服务支持的服务级条件键是单值还是多值条件键,请参见
,然后打开指定云服务的章节,并导航至“条件”小节。- 单值条件键在请求上下文中最多有一个值。例如,当您在云服务中标记资源时,每个资源标签都以键值对的形式存储。由于资源标签键只能具有单个标签值,因此g:ResourceTag/key-name 为单值条件键。
- 多值条件键在请求上下文中可以有多个值。例如,当您在云服务中标记资源时,您可以在请求中包含多个标签键值对。因此,g:TagKeys是多值条件键。
多值条件键的集合运算符- ForAllValues
请求上下文中每个成员的值是否为条件键集的子集。如果请求上下文中的每个键值均与策略中的至少一个值匹配,则条件返回true。注意:如果请求上下文中键对应的值为空,它也会返回true,如果请求上下文中键不存在,则会返回false。
以下示例,身份策略描述为对于请求者发起共享的组织中所有组织路径必须为orgPath1、orgPath2或者orgPath3中的元素,那么允许共享。{ "Version": "5.0", "Statement": [ { "Effect": "Allow", "Action": [ "ims:images:share" ], "Condition": { "ForAllValues:StringEquals": { "ims:TargetOrgPaths": [ "orgPath1", "orgPath2", "orgPath3" ] } } } ] }
下表显示了IAM如何根据请求上下文中的键值来评估此身份策略。表11 上下文中的键值来评估此身份策略 策略条件
请求上下文
结果
"Condition": { "ForAllValues:StringEquals": { "ims:TargetOrgPaths": [ "orgPath1", "orgPath2", "orgPath3" ] } }
ims:TargetOrgPaths: orgPath1 orgPath3
匹配
"Condition": { "ForAllValues:StringEquals": { "ims:TargetOrgPaths": [ "orgPath1", "orgPath2", "orgPath3" ] } }
ims:TargetOrgPaths: orgPath1 orgPath2 orgPath3 orgPath4
不匹配
- ForAnyValue
请求上下文中至少一个成员是否与条件键值集的至少一个成员匹配。如果请求上下文中的任何一个键值与策略中的任何一个条件值匹配,则条件返回true。如果请求上下文中没有任何键值与策略中的任何条件值匹配,或者请求上下文中不存在对应的键,条件返回false。
以下示例,身份策略描述为对于请求者发起共享的组织中任一个组织路径包含orgPath1、orgPath2或者orgPath3中的元素,那么允许共享。{ "Version": "5.0", "Statement": [ { "Effect": "Allow", "Action": [ "ims:images:share" ], "Condition": { "ForAnyValue:StringEquals": { "ims:TargetOrgPaths": [ "orgPath1", "orgPath2", "orgPath3" ] } } } ] }
下表显示了IAM如何根据请求中的条件键值来评估此身份策略。表12 上下文中的键值来评估此身份策略 策略条件
请求上下文
结果
"Condition": { "ForAnyValue:StringEquals": { "ims:TargetOrgPaths": [ "orgPath1", "orgPath2", "orgPath3" ] } }
ims:TargetOrgPaths: orgPath1 orgPath4
匹配
"Condition": { "ForAnyValue:StringEquals": { "ims:TargetOrgPaths": [ "orgPath1", "orgPath2", "orgPath3" ] } }
ims:TargetOrgPaths: orgPath4 orgPath5
不匹配
策略变量
在编写Resource或Condition的条件值时,如果您不知道资源或条件键的精确值,可以使用策略变量作为占位符。在实际鉴权的时候,这些占位符将会被自动替换成请求上下文中指定条件键的值。策略变量结构支持使用$前缀,后跟一对大括号{ }。在大括号内,包含想要使用的请求上下文中的条件键的名称,例如${g:UserName},在实际鉴权的时候,${g:UserName}将被自动替换为条件键g:UserName的值。
如果变量指定的条件键替换失败,您可以为它提供默认值。要向变量添加默认值,请用单引号' '括起默认值,并用英文逗号和空格分隔条件键名称和默认值,例如${key, 'default'},表示当key不存在或者替换失败时,将${key, 'default'}替换为文本串default。条件键名称不区分大小写,但是默认值区分大小写。此外,条件键名称与默认值引号前后的空格都会被忽略。例如${ g:username , 'Default_User_Name' }表示如果访问身份是IAM用户,则替换成g:UserName的值,否则替换成文本串Default_User_Name。
- 特殊符号
对于策略中具有特殊含义的字符:"*"(通配符)、"?"(通配符)、"$"(策略变量标识符),如果您不想让这三个字符表示这些特殊含义,请将它们改写为${*}、${?}、${$};此外,在策略变量默认值中,如果您想表达一个单引号字符('),请使用一对连续的单引号('')来表示。例如${g:UserName, 'A single quote is '', two quotes are ''''.'},当使用默认值进行替换时,它将被替换成A single quote is ', two quotes are ''。
IAM只会进行一轮替换,这意味着即使替换完毕后包含新的策略变量结构,它仍然不会被替换。例如${g:UserName, '${g:UserName}${*}'},当使用默认值进行替换时,它将被替换成${g:UserName}${*},不会继续迭代。
- 变量的使用
策略变量的本质即在策略中设置占位符,从而定义动态值。
如果指定条件键在请求上下文中不存在,或者指定条件键是多值条件键,那么将会替换失败,可能会导致整个语句无效。
例如当且仅当访问身份是IAM用户时,请求中才会存在g:UserName。如果以其它身份访问,那么所有包含${g:UserName}的资源和条件键都将视作不匹配。
同理,对于多值条件键g:CalledVia,即使它存在于请求上下文中,由于它是多值条件键,${g:CalledVia}依然会被判定为替换失败,从而视作不匹配。
- 在资源中使用变量
Config服务关联委托的预置身份策略,在资源中使用"iam::${g:DomainId}:agency:rms_tracker_agency_v5"来指定对应账号下的信任委托URN:
{ "Version": "5.0", "Statement": [ { "Effect": "Allow", "Action": [ "iam:agencies:attachPolicyV5", "iam:agencies:detachPolicyV5" ], "Resource": [ "iam::${g:DomainId}:agency:rms_tracker_agency_v5" ], "Condition": { "StringEquals": { "iam:PolicyURN": "iam::system:policy:ConfigTrackAgencyPolicy" } } } ] }
- 在条件值中使用变量
禁止跨组织访问资源:
{ "Version": "5.0", "Statement": [ { "Effect": "Deny", "Action": [ "*" ], "Resource": [ "*" ], "Condition": { "StringNotEquals": { "g:ResourceOrgId": "${g:PrincipalOrgId}" }, "Null": { "g:ResourceOrgId": "false" } } } ] }
- 与标签配合使用
通过给每个IAM用户设置标签MaxAllowedMfaAge,使得该IAM用户仅能在经过多因素认证MaxAllowedMfaAge秒内才能调用IAM API:
{ "Version": "5.0", "Statement": [ { "Effect": "Allow", "Action": [ "iam:*" ], "Condition": { "NumberLessThanEquals": { "g:MFAAge": "${g:PrincipalTag/MaxAllowedMfaAge}" } } } ] }
- 在资源中使用变量
- 指定默认值
要向变量添加默认值,请用单引号 (' ') 括起默认值,并用逗号和空格 (, ) 分隔变量文本和默认值。
例如,通过给每个IAM用户设置标签MaxAllowedMfaAge,使得该IAM用户仅能在经过多因素认证MaxAllowedMfaAge秒内才能调用IAM API,若未设置标签MaxAllowedMfaAge,则视作600秒:
{ "Version": "5.0", "Statement": [ { "Effect": "Allow", "Action": [ "iam:*" ], "Condition": { "NumberLessThanEquals": { "g:MFAAge": "${g:PrincipalTag/MaxAllowedMfaAge, '600'}" } } } ] }