更新时间:2024-09-25 GMT+08:00

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元素的值可以是多个对象组成的数组,表示不同的权限约束。

图1 策略结构

策略参数

策略参数包含Version和Statement两部分,下面介绍策略参数详细说明。

表1 策略参数说明

参数

是否必选

含义

Version

必选

策略的版本。

5.0(不可自定义)

Statement:

策略的授权语句

Statement Sid

可选

策略语句标识符。您可为语句数组中的每个策略语句指定Sid值。

用户自定义字符串。

Effect:作用

必选

定义Action中的操作权限是否允许执行。

  • Allow:允许执行。
  • Deny:不允许执行。
说明:
  • 当同一个Action的Effect既有Allow又有Deny时,遵循Deny优先的原则。
  • 当Effect为Allow时,不能有Condition元素。

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

条件键

条件键表示策略语句的Condition元素中的键值。根据适用范围,分为全局条件键和服务条件键。
  • 全局级条件键(前缀为g:)适用于所有操作,在鉴权过程中,云服务不需要提供用户身份信息,组织将自动获取并鉴权。详情请参见:通用全局条件键
  • 服务级条件键(前缀为服务缩写,如rms:)仅适用于对应服务的操作。详情请参见SCP授权参考中各服务支持的服务级条件键。
表2 通用全局条件键

全局条件键

类型

说明

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。

  1. g:CalledVia

    示例:表示不允许通过Console服务发起的请求调用RAM服务的查询资源共享接口。

    { 
         "Version": "5.0", 
         "Statement": [ 
             { 
                 "Effect": "Deny", 
                 "Action": ["ram:resourceShares:search"], 
                 "Resource": ["*"], 
                 "Condition": { 
                     "ForAnyValue:StringEquals": { 
                         "g:CalledVia": "service.Console" 
                     } 
                 } 
             } 
         ] 
     }
  2. 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"} 
                 } 
             } 
         ] 
     }
  3. g:PrincipalOrgId

    示例:表示用户通过该属性限制在组织o-xxxxxxxxxxx中的账号不允许访问RAM服务的查询资源共享接口。

    { 
         "Version": "5.0", 
         "Statement": [ 
             { 
                 "Effect": "Deny", 
                 "Action": ["ram:resourceShares:search"], 
                 "Resource": ["*"], 
                 "Condition": { 
                     "StringEquals": {  
                     "g:PrincipalOrgID": "o-xxxxxxxxxxx" 
    
                     } 
                 } 
             } 
         ] 
     }
  4. g:PrincipalOrgManagementAccountId

    示例:表示条件键Condition在请求者所在组织的管理账号ID为ce20ec0406c844a08026399be5f13b08时返回true。

    {
        "Condition": {
            "StringEquals": {
                "g:PrincipalOrgManagementAccountId": "ce20ec0406c844a08026399be5f13b08"
            }
        }
    }
  5. g:PrincipalOrgPath

    示例:表示条件键Condition在请求者账号属于组织单元ou-ab12-22222222时返回true。

    {
        "Condition": {
            "StringMatch": {
                "g:PrincipalOrgPath": "o-a1b2c3d4e5/r-ab12/ou-ab12-11111111/ou-ab12-22222222/*"
            }
        }
    }
  6. g:PrincipalServiceName

    示例:表示条件键Condition在请求者是RAM服务时返回true。

    {
        "Condition": {
            "StringEquals": {
                "g:PrincipalServiceName": "service.RAM"
            }
        }
    }
  7. g:RequestedRegion

    示例:表示策略禁止用户访问华北-北京四cn-north-4区域的ECS服务API。仅当目标云服务是Region服务时,请求中才会携带该属性。

    {
        "Version": "5.0",
        "Statement": [
            {
                "Effect": "Deny",
                "Action": ["ecs:*:*"],
                "Resource": ["*"],
                "Condition": {
                    "StringEquals": {
                        "g:RequestedRegion": "cn-north-4"
                    }
                }
            }
        ]
    }
  8. g:RequestTag/tag-key

    示例:表示策略不允许用户创建带有{"team": "engineering"}标签的资源共享实例。

    {
        "Version": "5.0",
        "Statement": [
            {
                "Effect": "Deny",
                "Action": ["ram:resourceShares:create"],
                "Resource": ["*"],
                "Condition": {
                    "StringEquals": {
                        "g:RequestTag/team": "engineering"
                    }
                }
            }
        ]
    }
  9. 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"
            }
          }
        }
      ]
    }
  10. 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/*"
            }
          }
        }
      ]
    }
  11. 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"
            }
          }
        }
      ]
    }
  12. 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"
                    }
                }
            }
        ]
    }
  • 多值条件键
    1. (请求中的所有值)ForAllValues:测试请求集的每个成员的值是否为条件键集的子集。如果请求中的每个键值均与策略中的至少一个值匹配,则条件返回true。
    2. (请求中的任何值)ForAnyValue:测试请求值集的至少一个成员是否与条件键值集的至少一个成员匹配。如果请求中的任何一个键值与策略中的任何一个条件值匹配,则条件返回true。对于没有匹配的键或空数据集,条件返回false。
      条件键运算逻辑
      图2 条件键运算逻辑示意图
      1. 对于同一条件键的多个条件值,采用OR运算逻辑,即请求值按照条件运算符匹配到任意一个条件值则返回true。

        当运算符表示否定含义的时候(例如:StringNotEquals),则请求值按照条件运算符不能匹配到所有的条件值。

      2. 同一运算符下的不同条件键之间,采用AND运算逻辑。不同运算符之间,采用AND运算逻辑。

运算符

运算符与条件键、条件值一起构成完整的条件判断语句,当请求信息满足该条件时,策略才能生效。运算符可以增加后缀“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。