策略语法
下面以OBS的自定义策略为例,说明策略的语法。
{ "Version": "1.1", "Statement": [ { "Effect": "Allow", "Action": [ "obs:bucket:ListAllMyBuckets", "obs:bucket:HeadBucket", "obs:bucket:ListBucket", "obs:bucket:GetBucketLocation" ], "Condition": { "StringEndWithIfExists": { "g:UserName": [ "specialCharacter" ] }, "Bool": { "g:MFAPresent": [ "true" ] } }, "Resource": [ "obs:*:*:bucket:*" ] } ] }
策略结构
策略结构包括Version(策略版本号)和Statement(策略权限语句)两部分,其中Statement可以有多个,表示不同的授权项。
策略参数
策略参数包含Version和Statement两部分,下面介绍策略参数详细说明。了解策略参数后,您可以根据场景自定义策略,如自定义策略使用样例。
参数 |
含义 |
值 |
|
---|---|---|---|
Version |
策略的版本。 |
1.1:代表基于策略的访问控制。 |
|
Statement: 策略的授权语句 |
Effect:作用 |
定义Action中的操作权限是否允许执行。 |
说明:
当同一个Action的Effect既有Allow又有Deny时,遵循Deny优先的原则。 |
Action:授权项 |
操作权限。 |
格式为“服务名:资源类型:操作”。授权项支持通配符号*,通配符号*表示所有。 示例: "obs:bucket:ListAllMybuckets":表示查看OBS桶列表权限,其中obs为服务名,bucket为资源类型,ListAllMybuckets为操作。 您可以在对应服务“API参考”资料中查看该服务所有授权项,如OBS授权项。 |
|
Condition:条件 |
格式为“条件运算符:{条件键:[条件值1,条件值2]}”。 如果您设置多个条件,同时满足所有条件时,该策略才生效。 示例: "StringEndWithIfExists":{"g:UserName":["specialCharacter"]}:表示当用户输入的用户名以"specialCharacter"结尾时该条statement生效。 |
||
Resource: 资源类型 |
策略所作用的资源。 |
格式为“服务名:region:domainId:资源类型:资源路径”, 资源类型支持通配符号*,通配符号*表示所有。支持资源粒度授权的云服务和资源类型参见:支持IAM资源粒度授权的云服务。 示例:
|
- 条件键
条件键表示策略语句的 Condition 元素中的键值。根据适用范围,分为全局条件键和服务条件键。
- 全局级条件键(前缀为g:)适用于所有操作,IAM提供两种全局条件键:通用全局条件键和其他全局条件键。
- 通用全局条件键:在鉴权过程中,云服务不需要提供用户身份信息,IAM将自动获取并鉴权。详情请参见:通用全局条件键。
- 其他全局条件键:在鉴权过程中,IAM通过云服务获取条件信息并鉴权。仅部分已对接的云服务支持其他全局条件键。
- 服务级条件键(前缀为服务缩写,如obs:)仅适用于对应服务的操作,详情请参见对应云服务的用户指南,如OBS请求条件。
表2 通用全局条件键 全局条件键
类型
说明
g:CurrentTime
时间
接收到鉴权请求的时间。以 ISO 8601 格式表示,例如:2012-11-11T23:59:59Z。示例参见1。
g:DomainName
字符串
请求者的账号名称。示例参见2。
g:MFAPresent
布尔值
是否使用MFA多因素认证方式获取Token。示例参见3。
g:MFAAge
数值
通过MFA多因素认证方式获取的Token的生效时长。该条件需要和g:MFAPresent一起使用。示例参见4。
g:PKITokenIssueTime
时间
PKI Token的签发时间。以ISO 8601格式表示,例如:2012-11-11T23:59:59Z。示例参见5。
g:ProjectName
字符串
项目名称。示例参见6。
g:UserId
字符串
IAM用户ID。示例参见7。
g:UserName
字符串
IAM用户名。示例参见8。
表3 其他全局条件键 全局条件键
类型
说明
g:SourceIp
IP Address
请求用户的IP地址
g:SourceVpc
String
请求用户的VPC ID
g:SourceVpce
String
请求用户的VPC Endpoint ID
g:TagKeys
String
资源标签键
g:ResourceTag/{TagKey}
String
资源标签键值
- g:CurrentTime
示例:表示用户在北京时间2023年3月1日8点到北京时间2023年3月30日8点可以创建IAM委托。注意:策略中g:CurrentTime条件键值的时间格式为UTC时间。
{ "Version": "1.1", "Statement": [{ "Effect": "Allow", "Action": ["iam:roles:createRoles"], "Condition": { "DateGreaterThan": { "g:CurrentTime": ["2023-03-01T00:00:00Z"] }, "DateLessThan": { "g:CurrentTime": ["2023-03-30T00:00:00Z"] } } }] }
- g: DomainName
示例:表示仅有用户zhangsan可以创建委托。
{ "Version": "1.1", "Statement": [{ "Effect": "Allow", "Action": ["iam:roles:createRoles"], "Condition": { "StringEquals": { "g:DomainName": ["zhangsan"] } } }] }
- g:MFAPresent
示例:表示请求者获取身份凭证时采用了MFA认证后才可以创建IAM委托。
{ "Version": "1.1", "Statement": [{ "Effect": "Allow", "Action": ["iam:roles:createRoles"], "Condition": { "Bool": { "g:MFAPresent": ["true"] } } }] }
- g:MFAAge
示例:表示请求者获取身份凭证时采用了MFA认证的时间必须大于900s才可以创建IAM委托。
{ "Version": "1.1", "Statement": [{ "Effect": "Allow", "Action": ["iam:roles:createRoles"], "Condition": { " NumberGreaterThanEquals ": { "g:MFAAge": ["900"] } } }] }
- g:PKITokenIssueTime
示例:表示用户在北京时间2023年3月1日8点前请求签发的PKI Token可以创建IAM委托。
策略中g:PKITokenIssueTime条件键值的时间格式为UTC时间。
{ "Version": "1.1", "Statement": [{ "Effect": "Allow", "Action": ["iam:roles:createRoles"], "Condition": { "DateLessThan": { "g:PKITokenIssueTime": ["2023-03-01T00:00:00Z"] } } }] }
- g:ProjectName
示例:表示请求者获取的凭证范围必须是在北京四时才可以创建IAM委托。
{ "Version": "1.1", "Statement": [{ "Effect": "Allow", "Action": ["iam:roles:createRoles"], "Condition": { " StringEquals ": { "g: ProjectName ": ["cn-north-4"] } } }] }
- g: UserId
示例:表示用户ID为xxxxxxxxxxx…的用户才可以创建IAM委托。
{ "Version": "1.1", "Statement": [{ "Effect": "Allow", "Action": ["iam:roles:createRoles"], "Condition": { "StringEquals": { "g: UserId ": ["xxxxxxxxxxx…"] } } }] }
- g: UserName
示例:表示用户lisi才可以创建IAM委托。
{ "Version": "1.1", "Statement": [{ "Effect": "Allow", "Action": ["iam:roles:createRoles"], "Condition": { "StringEquals": { "g: UserName ": ["lisi"] } } }] }
- 多值条件键
- ForAllValues:测试请求集的每个成员的值是否为条件键集的子集。如果请求中的每个键值均与策略中的至少一个值匹配,则条件返回true。
{ "Version": "1.1", "Statement": [ { "Effect": "Allow", "Action": [ "ims:images:share" ], "Condition": { "ForAllValues:StringEquals": { "ims:TargetOrgPaths": [ "orgPath1", "orgPath2", "orgPath3" ] } } } ] }
此策略描述的是对于请求者发起共享的组织中所有组织路径必须是orgPath1、orgPath2或者orgPath3,那么允许共享。
假如请求者想共享镜像给组织路径orgPath1、orgPath3下的成员,策略匹配成功。
假如请求者想共享镜像给组织路径orgPath1、orgPath2、orgPath3、orgPath4下的成员,策略匹配失败。
- ForAnyValue:测试请求值集的至少一个成员是否与条件键值集的至少一个成员匹配。如果请求中的任何一个键值与策略中的任何一个条件值匹配,则条件返回true。对于没有匹配的键或空数据集,条件返回false。
{ "Version": "1.1", "Statement": [ { "Effect": "Allow", "Action": [ "ims:images:share" ], "Condition": { "ForAnyValue:StringEquals": { "ims:TargetOrgPaths": [ "orgPath1", "orgPath2", "orgPath3" ] } } } ] }
此策略描述的是对于请求者发起共享的组织中任一一个组织路径是orgPath1、orgPath2或者orgPath3,那么允许共享。
假如请求者想共享镜像给组织路径orgPath1、orgPath4下的成员,策略匹配成功。
假如请求者想共享镜像给组织路径orgPath4、orgPath5下的成员,策略匹配失败。
- ForAllValues:测试请求集的每个成员的值是否为条件键集的子集。如果请求中的每个键值均与策略中的至少一个值匹配,则条件返回true。
条件键运算逻辑
图2 条件键运算逻辑示意图
- 对于同一条件键的多个条件值,采用OR运算逻辑,即请求值按照条件运算符匹配到任意一个条件值则返回true。
当运算符表示否定含义的时候(例如:StringNotEquals),则请求值按照条件运算符不能匹配到所有的条件值。
- 同一运算符下的不同条件键之间,采用AND运算逻辑。不同运算符之间,采用AND运算逻辑。
- 全局级条件键(前缀为g:)适用于所有操作,IAM提供两种全局条件键:通用全局条件键和其他全局条件键。
- 运算符
运算符与条件键、条件值一起构成完整的条件判断语句,当请求信息满足该条件时,策略才能生效。运算符可以增加后缀“IfExists”,表示对应请求值为空或满足条件的请求值均使策略生效,如“StringEqualsIfExists”表示请求值为空或请求值等于条件值均使策略生效。运算符为字符串型运算符,表格中如未增加说明,不区分大小写。
- String类型
表4 String类型运算符 类型
运算符
说明
String
StringEquals
请求值与任意一个条件值相同(区分大小写)。
StringNotEquals
请求值与所有条件值都不同(区分大小写)。
StringEqualsIgnoreCase
请求值与任意一个条件值相同。
StringNotEqualsIgnoreCase
请求值与所有条件值都不同。
StringMatch
请求值符合任意一个条件值的正则表达式(区分大小写,正则表达式仅支持*和?)。
StringNotMatch
请求值不符合所有条件值的正则表达式(区分大小写,正则表达式仅支持*和?)。
示例:指定用户名为ZhangSan的请求者才能够获取对象内容、获取对象元数据。
{ "Version": "1.1", "Statement": [ { "Effect": "Allow", "Action": [ "obs:object:GetObject" ], "Condition": { "StringEquals": { "g:DomainName": [ "ZhangSan" ] } } } ] }
- Number类型
表5 Number类型运算符 类型
运算符
说明
Number
NumberEquals
请求值等于任意一个条件值。
NumberNotEquals
请求值不等于所有条件值。
NumberLessThan
请求值小于任意一个条件值。
NumberLessThanEquals
请求值小于或任意一个等于条件值。
NumberGreaterThan
请求值大于任意一个条件值。
NumberGreaterThanEquals
请求值大于或等于任意一个条件值。
示例:请求者一次最多可以在example_bucket桶中列出10个对象。
{ "Version": "1.1", "Statement": [ { "Effect": "Allow", "Action": [ "obs:bucket:ListBucket" ], "Resource": [ "OBS:*:*:bucket:example_bucket" ], "Condition": { "NumberLessThanEquals": { "obs:max-keys": [ "10" ] } } } ] }
- Date类型
表6 Date类型运算符 类型
运算符
说明
Date
DateLessThan
请求值早于任意一个条件值。
DateLessThanEquals
请求值早于或等于任意一个条件值。
DateGreaterThan
请求值晚于任意一个条件值。
DateGreaterThanEquals
请求值晚于或等于任意一个条件值。
示例:请求者只能在2022年8月1日前创建桶资源。
{ "Version": "1.1", "Statement": [ { "Effect": "Allow", "Action": [ "obs:bucket:CreateBucket" ], "Condition": { "DateLessThan": { "g:CurrentTime": [ "2022-08-01T00:00:00Z" ] } } } ] }
- Bool类型
表7 Bool类型运算符 类型
运算符
说明
Bool
Bool
条件值可选值:true、false。请求值等于条件值。
示例:请求者必须使用开启了MFA认证的凭证才能修改指定永久访问密钥。
{ "Version": "1.1", "Statement": [ { "Effect": "Allow", "Action": [ "iam:credentials:updateCredential" ], "Condition": { "Bool": { "g:MFAPresent": [ "true" ] } } } ] }
- Null类型
表8 Null类型运算符 类型
运算符
说明
Null
Null
条件值可选值:true、false。条件值为true,要求请求值不存在或者值为null;条件值为false,要求请求值必须存在且值不为null。
示例:请求者的创建桶请求必须来源于VPC。
{ "Version": "1.1", "Statement": [ { "Effect": "Allow", "Action": [ " obs:bucket:CreateBucket" ], "Condition": { "Null": { "obs:SourceVpc": [ "false" ] } } } ] }
- “IfExists”运算符后缀
除Null运算符以外,您可以在任何条件运算符名称的末尾添加IfExists,例如:StringEqualsIfExists。如果请求的内容中存在条件键,则依照策略所述来进行匹配。如果该键不存在,则该条件元素的匹配结果将为true。
- String类型