SCP语法介绍
下面以RAM的自定义策略为例,说明策略的语法。
{ "Version": "5.0", "Statement": [ { "Effect": "Deny", "Action": [ "ram:resourceShares:create" ], "Resource": [ "*" ], "Condition": { "ForAnyValue:StringNotEquals": { "g:RequestTag/owner": [ "Alice", "Jack" ] } } } ] }
SCP的语法与IAM身份策略的语法一致。
策略结构
策略结构包括Version(策略版本号)和Statement(策略权限语句)两部分,其中Statement元素的值可以是多个对象组成的数组,表示不同的权限约束。
策略参数
策略参数包含Version和Statement两部分,下面介绍策略参数详细说明。
参数 |
是否必选 |
含义 |
值 |
|
---|---|---|---|---|
Version |
必选 |
策略的版本。 |
5.0(不可自定义) |
|
Statement: 策略的授权语句 |
Statement Sid |
可选 |
策略语句标识符。您可为语句数组中的每个策略语句指定Sid值。 |
用户自定义字符串。 |
Effect:作用 |
必选 |
定义Action中的操作权限是否允许执行。 |
说明:
|
|
Action:授权项 |
Allow时必选。 Deny时与NotAction二选一。 |
操作权限。 |
格式为“服务名:资源类型:操作”。授权项支持通配符号*,通配符号*表示所有。 参数中的通配符*和?只能单独使用或放在字符串结尾处。它不能出现在字符串的开头或中间部分。 例如“vpc:subnets:list”:表示查看VPC子网列表权限,其中vpc为服务名,subnets为资源类型,list为操作。 |
|
NotAction |
Allow时不可选。 Deny时与Action二选一。 |
Deny时,NotAction列出的操作或服务不受当前策略影响,即除了NotAction列表中的操作之外,其他操作deny。 |
格式同Action。 |
|
Condition:条件 |
Allow时不可选。 |
格式为“条件运算符:{条件键:[条件值1,条件值2]}”。 如果您设置多个条件,同时满足所有条件时,该策略才生效。 示例: "StringEndWithIfExists":{"g:UserName":["specialCharactor"]}:表示当用户输入的用户名以"specialCharactor"结尾时该条statement生效。 |
||
Resource:资源类型 |
可选 未指定时,Resource默认为“*”,策略应用到所有资源。 |
策略所作用的资源。 |
Allow时,只能为“*”。 Deny时,可选择“*”或具体资源,格式为“服务名:region:domainId:资源类型:资源路径”, 资源类型支持通配符号*,通配符号*表示所有。 示例:"ecs:*:*:instance:*":表示所有的ECS实例。 |
SCP中不支持以下元素:
- Principal
- NotPrincipal
- NotResource
条件键
- 全局级条件键(前缀为g:)适用于所有操作,在鉴权过程中,云服务不需要提供用户身份信息,组织将自动获取并鉴权。详情请参见:通用全局条件键。
- 服务级条件键(前缀为服务缩写,如rms:)仅适用于对应服务的操作。详情请参见SCP授权参考中各服务支持的服务级条件键。
全局条件键 |
类型 |
说明 |
---|---|---|
g:CalledVia |
字符串 |
用于控制跨服务访问。示例参见1。 |
g:CalledViaFirst |
字符串 |
与g:CalledVia相同,特指g:CalledVia属性中的第一个元素。 |
g:CalledViaLast |
字符串 |
g:CalledVia相同,该属性特指g:CalledVia属性中的最后一个元素。 |
g:CurrentTime |
时间 |
接收到鉴权请求的时间。以ISO 8601格式表示,例如:2023-11-11T23:59:59Z。示例参见2。 |
g:DomainName |
字符串 |
请求者的账号名称。 |
g:DomainId |
字符串 |
请求者的账号ID。 |
g:MFAPresent |
布尔值 |
是否使用MFA多因素认证方式获取Token。 |
g:MFAAge |
数值 |
通过MFA多因素认证方式获取的Token的生效时长。该条件需要和g:MFAPresent一起使用。 |
g:PrincipalAccount |
字符串 |
与g:DomainId属性完全一致。 |
g:PrincipalUrn |
字符串 |
请求者身份的URN。不同身份类型的URN格式如下: IAM用户:iam::<domain-id>:user:<user-name> IAM委托:sts::<domain-id>:assumed-agency:<agency-name>/<session-name> |
g:PrincipalIsRootUser |
布尔值 |
指请求者身份是否是IAM根用户。所有请求中都会携带该属性。 |
g:PrincipalIsService |
布尔值 |
指请求者身份是否是云服务,可以通过该属性控制只有云服务身份才能访问指定API。 |
g:PrincipalOrgId |
字符串 |
指请求者身份所属的组织ID,用户可以通过该属性控制只有特定组织内的身份才能访问指定API。示例参见3。 |
g:PrincipalOrgManagementAccountId |
字符串 |
请求者身份所属组织的管理账号ID。示例参见4。 |
g:PrincipalOrgPath |
字符串 |
请求者账号所属组织中的路径,可以通过该属性控制只有组织中特定层级的账号才能访问指定API。示例参见5。一个账号的组织路径的格式如下: <organization-id>/<root-id>/(<ou-id>/)*<account-id> |
g:PrincipalServiceName |
字符串 |
请求者的云服务Service Principal名称。示例参见6。 |
g:PrincipalTag/tag-key |
字符串 |
请求者身份携带的标签,目前仅有STSToken支持的session tag可以作为该属性。 |
g:PrincipalType |
字符串 |
请求者的身份类型,共有两种类型:User、AssumedAgency。当以长期IAM凭据访问时,该属性取值为User;当以IAM临时凭据访问时,取值为AssumedAgency。 |
g:Referer |
字符串 |
请求携带的HTTP referer header,注意由于该属性是由客户端指定的,故不推荐使用它作为访问控制的安全依赖。 |
g:RequestedRegion |
字符串 |
请求的目标区域。如请求的目标云服务是全局服务时,需要设置为NULL;如请求的目标云服务是区域级服务时,则设置为对应的区域ID即可,例如cn-north-4。示例参见7。 |
g:RequestTag/tag-key |
字符串 |
请求中携带的标签。示例参见8。 |
g:ResourceAccount |
字符串 |
请求所访问的资源的所属主账号ID。 |
g:ResourceOrgId |
字符串 |
请求所访问的资源的所属主账号所在的组织ID。示例参见9。 |
g:ResourceOrgPath |
字符串 |
请求所访问的资源的所属主账号在组织中的路径。示例参见10。 |
g:ResourceTag/tag-key |
字符串 |
请求所访问的资源身上携带的标签。用户可以通过该属性控制只能访问带有特定标签的资源。示例参见11。 |
g:SecureTransport |
布尔值 |
请求是否使用了SSL协议。 |
g:SourceAccount |
字符串 |
指跨服务访问场景下,云服务是为哪一个资源所发起的请求,g:SourceAccount表示的是该资源的所属主账号。 |
g:SourceUrn |
字符串 |
指跨服务访问场景下,云服务是为哪一个资源所发起的请求,g:SourceUrn表示的是该资源URN。 |
g:SourceIdentity |
字符串 |
特指IAM临时凭据STSToken中的source_identity字段。source_identity字段在用户第一次通过STS服务的AssumeAgency API获取IAM临时凭据时指定,且在后续的委托切换中不可再更改。 |
g:SourceIp |
IP |
发起请求的源IP地址,专指来自公网的请求源IP。注意:如果请求是从VPC内的ECS发起并经过VPC Endpoint时,则会使用g:VpcSourceIp来取代g:SourceIp。示例参见12。 |
g:SourceVpc |
字符串 |
请求来源的VPC ID。 |
g:SourceVpce |
字符串 |
发起请求使用的VPC Endpoint ID。 |
g:TagKeys |
字符串 |
指请求中携带的所有标签的key组成的列表。 |
g:TokenIssueTime |
时间 |
指访问凭据中的STSToken的签发时间。 |
g:UserAgent |
字符串 |
指请求携带的HTTP User-Agent header,注意该属性是由客户端指定的,故不推荐使用它作为访问控制的安全依赖。 |
g:PrincipalId |
字符串 |
指请求者的身份ID,不同身份类型的ID格式如下: IAM 用户:<user-id> IAM 委托:<agency-id>:<session-name> |
g:UserName |
字符串 |
IAM用户名。 |
g:UserId |
字符串 |
IAM用户ID。 |
g:ViaService |
布尔值 |
指该请求是否是由云服务通过Impersonate协议代表用户身份发起的,当且仅当g:CalledVia属性非空时,该属性值为true。 |
g:VpcSourceIp |
IP |
指从VPC内发起的请求的源IP地址。 |
g:EnterpriseProjectId |
字符串 |
指该请求对应的企业项目ID或者请求操作的资源所属的企业项目ID。 |
- g:CalledVia
示例:表示不允许通过Console服务发起的请求调用RAM服务的查询资源共享接口。
{ "Version": "5.0", "Statement": [ { "Effect": "Deny", "Action": ["ram:resourceShares:search"], "Resource": ["*"], "Condition": { "ForAnyValue:StringEquals": { "g:CalledVia": "service.Console" } } } ] }
- g:CurrentTime
示例:表示用户通过该属性控制云服务API在2023年3月1日到2023年3月30日的时间段内禁止被访问。
{ "Version": "5.0", "Statement": [ { "Effect": "Deny", "Action": ["ram:resourceShares:search"], "Resource": ["*"], "Condition": { "DateGreaterThan": {"g:CurrentTime": "2023-03-01T00:00:00Z"}, "DateLessThan": {"g:CurrentTime": "2023-03-30T23:59:59Z"} } } ] }
- g:PrincipalOrgId
示例:表示用户通过该属性限制在组织o-xxxxxxxxxxx中的账号不允许访问RAM服务的查询资源共享接口。
{ "Version": "5.0", "Statement": [ { "Effect": "Deny", "Action": ["ram:resourceShares:search"], "Resource": ["*"], "Condition": { "StringEquals": { "g:PrincipalOrgID": "o-xxxxxxxxxxx" } } } ] }
- g:PrincipalOrgManagementAccountId
示例:表示条件键Condition在请求者所在组织的管理账号ID为ce20ec0406c844a08026399be5f13b08时返回true。
{ "Condition": { "StringEquals": { "g:PrincipalOrgManagementAccountId": "ce20ec0406c844a08026399be5f13b08" } } }
- g:PrincipalOrgPath
示例:表示条件键Condition在请求者账号属于组织单元ou-ab12-22222222时返回true。
{ "Condition": { "StringMatch": { "g:PrincipalOrgPath": "o-a1b2c3d4e5/r-ab12/ou-ab12-11111111/ou-ab12-22222222/*" } } }
- g:PrincipalServiceName
示例:表示条件键Condition在请求者是RAM服务时返回true。
{ "Condition": { "StringEquals": { "g:PrincipalServiceName": "service.RAM" } } }
- g:RequestedRegion
示例:表示策略禁止用户访问华北-北京四cn-north-4区域的ECS服务API。仅当目标云服务是Region服务时,请求中才会携带该属性。
{ "Version": "5.0", "Statement": [ { "Effect": "Deny", "Action": ["ecs:*:*"], "Resource": ["*"], "Condition": { "StringEquals": { "g:RequestedRegion": "cn-north-4" } } } ] }
- g:RequestTag/tag-key
示例:表示策略不允许用户创建带有{"team": "engineering"}标签的资源共享实例。
{ "Version": "5.0", "Statement": [ { "Effect": "Deny", "Action": ["ram:resourceShares:create"], "Resource": ["*"], "Condition": { "StringEquals": { "g:RequestTag/team": "engineering" } } } ] }
- g:ResourceOrgId
示例:表示策略拒绝用户修改属于组织o-xxxxxxxx下的账号的RAM资源共享实例。仅当访问的资源所有者加入到某个组织时,才会携带该属性。
{ "Version": "5.0", "Statement": [ { "Effect": "Deny", "Action": [ "ram:resourceShares:delete", "ram:resourceShares:update" ], "Resource": [ "*" ], "Condition": { "StringEquals": { "g:ResourceOrgId": "o-xxxxxxxx" } } } ] }
- g:ResourceOrgPath
示例:表示策略拒绝用户修改属于组织路径o-a1b2c3d4e5/r-ab12/ou-ab12-11111111下的账号的RAM资源共享实例。仅当访问的资源所有者加入到某个组织时,才会携带该属性。
{ "Version": "5.0", "Statement": [ { "Effect": "Deny", "Action": [ "ram:resourceShares:delete", "ram:resourceShares:update" ], "Resource": [ "*" ], "Condition": { "StringMatch": { "g:ResourceOrgPath": "o-a1b2c3d4e5/r-ab12/ou-ab12-11111111/*" } } } ] }
- g:ResourceTag/tag-key
示例:表示策略禁止用户修改带有{"team": "engineering"}标签的资源共享实例。
{ "Version": "5.0", "Statement": [ { "Effect": "Deny", "Action": [ "ram:resourceShares:delete", "ram:resourceShares:update" ], "Resource": [ "*" ], "Condition": { "StringEquals": { "g:ResourceTag/team": "engineering" } } } ] }
- g:SourceIp
示例:表示策略禁止源IP地址在10.27.128.0/24范围内时访问RAM服务。
{ "Version": "5.0", "Statement": [ { "Effect": "Deny", "Action": ["ram:*:*"], "Resource": ["*"], "Condition": { "IpAddress": { "g:SourceIp": "10.27.128.0/24" } } } ] }
- 多值条件键
- (请求中的所有值)ForAllValues:测试请求集的每个成员的值是否为条件键集的子集。如果请求中的每个键值均与策略中的至少一个值匹配,则条件返回true。
- (请求中的任何值)ForAnyValue:测试请求值集的至少一个成员是否与条件键值集的至少一个成员匹配。如果请求中的任何一个键值与策略中的任何一个条件值匹配,则条件返回true。对于没有匹配的键或空数据集,条件返回false。
运算符
运算符与条件键、条件值一起构成完整的条件判断语句,当请求信息满足该条件时,策略才能生效。运算符可以增加后缀“IfExists”,表示对应请求值为空或满足条件的请求值均使策略生效,如“StringEqualsIfExists”表示请求值为空或请求值等于条件值均使策略生效。运算符为字符串型运算符,表格中如未增加说明,不区分大小写。
- String类型
表3 String类型运算符 类型
运算符
说明
String
StringEquals
请求值与任意一个条件值相同(区分大小写)。
StringNotEquals
请求值与所有条件值都不同(区分大小写)。
StringEqualsIgnoreCase
请求值与任意一个条件值相同。
StringNotEqualsIgnoreCase
请求值与所有条件值都不同。
StringMatch
请求值符合任意一个条件值的正则表达式(区分大小写,正则表达式仅支持*和?)。
StringNotMatch
请求值不符合所有条件值的正则表达式(区分大小写,正则表达式仅支持*和?)。
示例:禁止用户名为ZhangSan的请求者删除和修改资源共享实例。
{ "Version": "5.0", "Statement": [ { "Effect": "Deny", "Action": [ "ram:resourceShares:delete", "ram:resourceShares:update" ], "Condition": { "StringEquals": { "g:DomainName": [ "ZhangSan" ] } } } ] }
- Number类型
表4 Number类型运算符 类型
运算符
说明
Number
NumberEquals
请求值等于任意一个条件值。
NumberNotEquals
请求值不等于所有条件值。
NumberLessThan
请求值小于任意一个条件值。
NumberLessThanEquals
请求值小于或等于任意一个条件值。
NumberGreaterThan
请求值大于任意一个条件值。
NumberGreaterThanEquals
请求值大于或等于任意一个条件值。
- Date类型
表5 Date类型运算符 类型
运算符
说明
Date
DateLessThan
请求值早于任意一个条件值。
DateLessThanEquals
请求值早于或等于任意一个条件值。
DateGreaterThan
请求值晚于任意一个条件值。
DateGreaterThanEquals
请求值晚于或等于任意一个条件值。
示例:请求者禁止在2022年8月1日前访问RAM服务。
{ "Version": "5.0", "Statement": [ { "Effect": "Deny", "Action": [ "ram:*:*" ], "Condition": { "DateLessThan": { "g:CurrentTime": [ "2022-08-01T00:00:00Z" ] } } } ] }
- Bool类型
表6 Bool类型运算符 类型
运算符
说明
Bool
Bool
条件值可选值:true、false。请求值等于条件值。
- Null类型
表7 Null类型运算符 类型
运算符
说明
Null
Null
条件值可选值:true、false。条件值为true,要求请求值不存在或者值为null;条件值为false,要求请求值必须存在且值不为null。
- IP类型
表8 IP类型运算符 类型
运算符
说明
IP
IpAddress
指定IP地址或者IP范围。
NotIpAddress
指定IP地址或者IP范围之外的所有IP地址。
示例:拒绝IP地址在10.27.128.0到10.27.128.255范围内的请求修改指定的永久访问密钥。
{ "Version": "5.0", "Statement": [ { "Effect": "Deny", "Action": [ "iam:credentials:updateCredentialV5" ], "Condition": { "IpAddress": { "g:SourceIp": [ "10.27.128.0/24" ] } } } ] }
- “IfExists”运算符后缀
除Null运算符以外,您可以在任何条件运算符名称的末尾添加IfExists,例如:StringEqualsIfExists。如果请求的内容中存在条件键,则依照策略所述来进行匹配。如果该键不存在,则该条件元素的匹配结果将为true。