您可以在策略声明的特定位置使用通配符或变量,从而定义出更灵活、更复杂的权限规则。
访问控制支持使用通配*
及?
:
*
:匹配0个、1个或多个字符。?
:匹配一个字符(不能为0个)。您可以在策略的以下位置使用通配符:
例如,以下是一条使用了通配符的策略:
{ "Statement": [ { "Effect": "Allow", "Action": [ "natgateway:*" ], "Resource": [ "trn:natgateway:*:2000000001:ngw/*" ], "Condition":{ "StringEquals":{ "volc:PrincipalTrn":"trn:iam::2000000001:role/*" } } } ] }
解读: 该条策略一共使用了四个通配符,Action中通配符*
表达操作范围是NAT网关中的全部操作;Resource中NAT网关实例的TRN中,第一个通配符*
表达了资源范围不限地域,第二个通配符*
表达了NAT网关的任何实例;在Condition中,通配符*
表达了该则声明的生效条件为请求身份为账号下的任何角色。
条件键可以作为变量放在策略声明的某些位置中代理固定值。
变量的的格式为${condition-key
},condition-key
可代入任一支持的条件键,例如${volc:UserName}
。
变量支持在以下位置使用:
Resource中TRN表达式中资源名称路径部分(即${AccountId}:
之后的部分);
Condition中的条件键和条件值中。
例如,以下是一条使用了变量的策略:
{ "Statement": [ { "Effect": "Allow", "Action": [ "iam:UpdateSecureContactInfo" ], "Resource": [ "trn:iam::2000000000:user/${volc:UserName}" ] } ] }
该策略通过限定了”访问主体 = 访问客体“,从而限制住IAM用户仅能为自身修改安全邮箱或手机号。具体原理为:策略Resource元素内的变量${volc:UserName}
可获取到请求用户的用户名(该条件键的具体说明可参考Condition帮助文档)。假设一名用户名为Bob的IAM用户发起了一次修改安全信息操作(UpdateSecureContactInfo),此时变量${volc:UserName}
的取值为请求者的用户名(即Bob),系统会将该值代入到trn:iam::2000000000:user/${volc:UserName}
表达式中,因此在这次请求中,该策略将等价于以下策略:
{ "Statement": [ { "Effect": "Allow", "Action": [ "iam:UpdateSecureContactInfo" ], "Resource": [ "trn:iam::2000000000:user/Bob" ] } ] }
因此,该策略限制了用户将仅能为自己修改安全信息。同理,当其他被授予该策略的IAM用户发起修改安全信息操作时,变量也将按同样逻辑进行取值并代入,结果为其他用户也同样只能为自己修改安全信息。