更新时间:2025-01-22 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:)适用于所有操作,在鉴权过程中,云服务不需要提供用户身份信息,组织将自动获取并鉴权。
  • 服务级条件键(前缀为服务缩写,如ram:)仅适用于对应服务的操作。详情请参见SCP授权参考中各服务支持的服务级条件键。
表2 通用全局条件键

全局条件键

类型

说明

g:CalledVia

字符串数组

用于控制跨服务访问。当身份主体向云服务发起访问时,该服务可能会转发身份主体的访问请求至其他服务,g:CalledVia包含服务转发访问的请求链中代表身份主体发出请求的服务列表。如服务转发身份主体的访问时,此条件键存在;如身份主体直接访问,则此条件键不存在。示例参见1

g:CalledViaFirst

字符串

与g:CalledVia相同,特指g:CalledVia属性中的第一个元素,即第一个转发身份主体访问的服务。

g:CalledViaLast

字符串

与g:CalledVia相同,该属性特指g:CalledVia属性中的最后一个元素,即最后一个转发身份主体访问的服务。

g:CurrentTime

时间

接收到请求的时间。以ISO 8601格式表示,例如:2012-11-11T23:59:59Z。示例参见2

g:DomainName

字符串

指请求者的账号名称。

g:DomainId

字符串

指请求者的账号ID。

g:EnterpriseProjectId

字符串

指该请求对应的企业项目ID或者请求操作的资源所属的企业项目ID。当请求指定了具体的企业项目ID或访问的资源属于具体的企业项目时,如该API所对应授权项(Action)支持g:EnterpriseProjectId,则此条件键存在。此条件键为鉴权场景下使用的条件键,并非过滤条件,即不会过滤出符合该条件键所指定的企业项目下的资源。示例参见3

g:MFAPresent

布尔值

指是否使用MFA多因素认证方式获取STS Security Token。仅在使用MFA认证登录控制台访问或使用MFA获取的委托会话发出请求时,此条件键为true。仅在STS Security Token发出请求时,此条件键存在。示例参考见4

g:MFAAge

数值

指通过MFA多因素认证方式获取的STS Security Token的生效时长。仅在使用MFA认证登录控制台访问,或使用MFA获取的委托会话发出请求时,此条件键存在。单位为秒。

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>

虚拟联邦用户:sts::<domain-id>:external-user:<idp-id>/<session-name>

示例参见5

g:PrincipalIsRootUser

布尔值

指请求者身份主体是否是IAM根用户。所有请求中都会携带该属性。

g:PrincipalIsService

布尔值

指请求者身份主体是否是云服务,可以通过该属性控制只有云服务身份才能访问指定API。

g:PrincipalOrgId

字符串

指请求者身份主体所属的组织ID,用户可以通过该属性控制只有特定组织内的身份才能访问指定API,仅在请求者存在所属组织时,此条件键存在。示例参见6

g:PrincipalOrgManagementAccountId

字符串

指请求者身份主体所属组织的管理账号ID,仅在请求者存在所属组织时,此条件键存在。示例参见7

g:PrincipalOrgPath

字符串

指请求者身份主体所属组织中的路径,可以通过该属性控制只有组织中特定层级的账号才能访问指定API,仅在请求者存在所属组织时,此条件键存在。示例参见8。一个账号的组织路径的格式如下:

<organization-id>/<root-id>/(<ou-id>/)*<account-id>

g:PrincipalServiceName

字符串

指请求者的身份主体名称,仅在请求者为云服务时,此条件键存在。示例参见9

g:PrincipalTag/<tag-key>

字符串

指请求者身份主体携带的标签,标签键<tag-key>不区分大小写,仅请求者为带有标签的IAM用户、带有标签的信任委托、或带有会话标签的委托会话时,此条件键存在。示例参见10

g:PrincipalType

字符串

指请求者的身份主体类型,共有三种类型:User、AssumedAgency、ExternalUser。当以IAM用户访问时,该属性取值为User;当以IAM委托会话访问时,取值为AssumedAgency;当以虚拟联邦用户访问时,取值为ExternalUser。

g:Referer

字符串

指请求携带的HTTP referer header,注意由于该属性是由客户端指定的,故不推荐使用它作为访问控制的安全依赖。

g:RequestedRegion

字符串

指请求的目标区域(Region)。请求的目标云服务是区域级服务时,设置为对应的区域ID以进行控制,例如cn-north-4。仅在请求为部分区域级服务时,此条件键存在。

g:RequestTag/<tag-key>

字符串

指请求中携带的标签,标签键<tag-key>不区分大小写。当请求者在调用API时传入了标签(例如给资源添加标签的API、创建资源同时支持传入标签的API等),可以通过此条件键检查此请求是否包含对应标签。仅在支持g:RequestTag/<tag-key>的授权项(Action)中,当前请求的API传入标签时,此条件键存在。更多内容请参见SCP授权参考。示例参见11

g:ResourceAccount

字符串

指请求所访问的资源的属主账号ID,仅在支持资源细粒度授权服务的授权项(Action)中,此条件键存在。更多内容请参见SCP授权参考。示例参见12

g:ResourceOrgId

字符串

指请求所访问的资源的属主账号所在的组织ID。仅在支持资源细粒度鉴权的授权项(Action)中,且资源属主账号在组织内时,此条件键存在。更多内容请参见SCP授权参考。示例参见13

g:ResourceOrgPath

字符串

指请求所访问的资源的属主账号在组织中的路径。仅在支持资源细粒度鉴权的授权项(Action)中,且资源属主账号在组织内时,此条件键存在。更多内容请参见SCP授权参考。示例参见14

g:ResourceTag/<tag-key>

字符串

指请求所访问的资源身上携带的标签,标签键<tag-key>不区分大小写。用户可以通过该属性控制只能访问带有特定标签的资源。仅在支持 g:ResourceTag/<tag-key>的授权项(Action)中,当前访问资源携带标签,此条件键存在。更多内容请参见SCP授权参考。示例参见15

g:SecureTransport

布尔值

指请求是否使用了SSL协议。

g:SourceAccount

字符串

指云服务跨服务访问场景下,云服务是为哪一个资源所发起的请求,g:SourceAccount表示的是该资源的所属主账号。仅在支持g:SourceAccount的授权项(Action)中,此条件键存在。仅应在Principal是服务主体的资源策略中使用此条件键。示例参见16

g:SourceUrn

字符串

指云服务跨服务访问场景下,云服务是为哪一个资源所发起的请求,g:SourceUrn表示的是该资源URN。仅在支持g:SourceUrn的授权项(Action)中,此条件键存在。仅应在Principal是服务主体的资源策略中使用此条件键。示例参见17

g:SourceIdentity

字符串

指用户第一次通过STS服务的AssumeAgency API获取IAM临时凭据时指定其中的source_identity字段,且在后续的委托切换中不可再更改。仅在指定了source_identity的STS Security Token版本发出请求时,此条件键存在。示例参见18

g:SourceIp

IP

指发起请求的源IP地址,专指来自公网的请求源IP。示例参见19

说明:

如果请求是从VPC内发起并经过VPC终端节点时,则会使用g:VpcSourceIp来取代g:SourceIp。如果不是通过VPC终端节点发起访问时,此条件键存在,但仅当通过公网发起访问时,该条件键可以作为有效的访问控制条件。云服务使用委托代表用户身份不经过公网发起访问时,此条件键不生效。

g:SourceVpc

字符串

指请求来源的VPC ID。仅当请求从VPC内部通过VPC终端节点访问云服务类型的VPC终端节点服务时,此条件键存在。

g:SourceVpce

字符串

指发起请求使用的VPC终端节点ID。仅当请求从VPC内部通过VPC终端节点访问云服务类型的VPC终端节点服务时,此条件键存在。示例参见20

g:TagKeys

字符串数组

指请求中携带的所有标签的key组成的列表。仅在支持g:TagKeys的授权项(Action)中,当前请求的API传入标签时,此条件键存在。

g:TokenIssueTime

时间

指访问凭据中的STS Security Token的签发时间。仅在STS Security Token发出请求时,此条件键存在。

g:UserAgent

字符串

指请求携带的HTTP User-Agent header,注意该属性是由客户端指定的,故不推荐使用它作为访问控制的安全依赖。

g:PrincipalId

字符串

指请求者的身份主体ID,不同身份类型的ID格式如下:

IAM用户:<user-id>

IAM委托会话:<agency-id>:<session-name>

虚拟联邦用户:<idp-id>:<session-name>

g:UserName

字符串

IAM用户名。仅当请求者为IAM用户时,此条件键存在。

g:UserId

字符串

IAM用户ID。仅当请求者为IAM用户时,此条件键存在。

g:ViaService

布尔值

指该请求是否是由云服务代表身份主体转发访问发起的,当且仅当g:CalledVia属性非空时,该属性值为true。仅在STS Security Token发出请求时,此条件键存在。

g:VpcSourceIp

IP

指从VPC内发起的请求的源IP地址。仅当请求从VPC内部通过VPC终端节点访问云服务类型的VPC终端节点服务时,此条件键存在。

  1. g:CalledVia

    用户身份主体请求服务A,服务A以用户身份主体请求服务B,服务B以用户身份主体请求服务C。在服务A收到的请求中,因为是用户身份主体直接请求,不会包含g:CalledVia属性;在服务B收到的请求中,因为是服务A代表用户身份主体发起,所以g:CalledVia会包含服务A的服务主体;在服务C收到的请求中g:CalledVia属性会包含服务A和服务B的服务主体,并且顺序与转发访问的请求链顺序一致,此时g:CalledViaFirst为服务A的服务主体,g:CalledViaLast则为服务B的服务主体,通过g:CalledViaFirst和g:CalledViaLast两个条件键可指定由哪个服务在转发访问链中第一个及最后一个调用。

    图2 g:CalledVia使用场景

    用户通过管理控制台对云服务发起请求时,其CalledVia中将包含service.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:EnterpriseProjectId

    示例:此条件键为鉴权场景下使用的条件键,如下策略表示限制用户通过企业项目过滤查询虚拟私有云的访问执行操作:不允许用户请求GET /v1/{project_id}/vpcs时指定enterprise_project_id为xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,即请求为/v1/{project_id}/vpcs?enterprise_project_id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx时不可访问。

    {
    	"Version": "5.0",
    	"Statement": [{
    		"Effect": "Deny",
    		"Action": [
    			"vpc:vpcs:list"
    		],
    		"Resource": [
    			"*"
    		],
    		"Condition": {
    			"StringEquals": {
    				"g:EnterpriseProjectId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    			}
    		}
    	}]
    }

    需要注意的是,g:EnterpriseProjectId并非过滤条件,即不会过滤出符合该条件键所指定的企业项目下的资源。仍以请求GET /v1/{project_id}/vpcs为例,当enterprise_project_id为all_granted_eps时,其接口行为是查询当前用户所有企业项目绑定的虚拟私有云。此时如用户已配置如上策略,接口将不会列出用户在策略中编写的g:EnterpriseProjectId所对应的企业项目下的虚拟私有云列表。

  4. g:MFAPresent

    g:MFAPresent仅在STS Security Token版本发出请求时存在,如使用永久凭据发起请求等场景则此条件键不存在。

    示例:表示用户可以通过该属性控制云服务API仅能被经过多因素认证的身份调用。需注意搭配IfExists后缀以包括永久凭据发起请求此类g:MFAPresent条件键不存在的场景。

    {
    	"Version": "5.0",
    	"Statement": [{
    		"Effect": "Deny",
    		"Action": [
    			"*"
    		],
    		"Resource": [
    			"*"
    		],
    		"Condition": {
    			"BoolIfExists": {
    				"g:MFAPresent": "false"
    			}
    		}
    	}]
    }
  5. g:PrincipalUrn

    示例:将以下SCP绑定至账号,不允许用户yyy创建资源共享实例。

    {
    	"Version": "5.0",
    	"Statement": [{
    		"Effect": "Deny",
    		"Action": [
    			"ram:resourceShares:create"
    		],
    		"Condition": {
    			"StringEquals": {
    				"g:PrincipalUrn": "iam::xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:user:yyy"
    			}
    		}
    	}]
    }
  6. g:PrincipalOrgId

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

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

    示例:表示条件键Condition在请求者所在组织的管理账号ID为xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx时视为匹配。

    {
    	"Condition": {
    		"StringEquals": {
    			"g:PrincipalOrgManagementAccountId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    		}
    	}
    }
  8. g:PrincipalOrgPath

    示例:表示条件键Condition在请求者账号属于组织单元ou-qqq时视为匹配。

    {
    	"Condition": {
    		"StringMatch": {
    			"g:PrincipalOrgPath": "o-xxx/r-yyy/ou-zzz/ou-qqq/*"
    		}
    	}
    }

    示例:表示条件键Condition在请求者账号属于组织单元ou-qqq下任意子OU时视为匹配。

    {
    	"Condition": {
    		"StringMatch": {
    			"g:PrincipalOrgPath": "o-xxx/r-yyy/ou-zzz/ou-qqq/ou-*"
    		}
    	}
    }
  9. g:PrincipalServiceName

    示例:表示条件键Condition在请求者是RAM服务时视为匹配。

    {
        "Condition": {
            "StringEquals": {
                "g:PrincipalServiceName": "service.RAM"
            }
        }
    }
  10. g:PrincipalTag/<tag-key>

    示例:表示当IAM用户上携带了{"department": "hr"}标签时,不允许访问IAM相关API。

    {
    	"Version": "5.0",
    	"Statement": [{
    		"Effect": "Deny",
    		"Action": [
    			"iam:*"
    		],
    		"Resource": [
    			"*"
    		],
    		"Condition": {
    			"StringEquals": {
    				"g:PrincipalTag/department": "hr"
    			}
    		}
    	}]
    }
  11. g:RequestTag/<tag-key>

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

    {
        "Version": "5.0",
        "Statement": [
            {
                "Effect": "Deny",
                "Action": ["ram:resourceShares:create"],
                "Resource": ["*"],
                "Condition": {
                    "StringEquals": {
                        "g:RequestTag/team": "engineering"
                    }
                }
            }
        ]
    }
  12. g:ResourceAccount

    示例:表示拒绝用户使用指定用户以外的KMS密钥解密数据。

    {
    	"Version": "5.0",
    	"Statement": [{
    		"Effect": "Deny",
    		"Action": [
    			"kms:cmk:decryptData"
    		],
    		"Resource": [
    			"*"
    		],
    		"Condition": {
    			"StringNotEquals": {
    				"g:ResourceAccount": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    			}
    		}
    	}]
    }
  13. g:ResourceOrgId

    示例:表示拒绝用户使用指定组织以外的KMS密钥解密数据。

    {
    	"Version": "5.0",
    	"Statement": [{
    		"Effect": "Deny",
    		"Action": [
    			"kms:cmk:decryptData"
    		],
    		"Resource": [
    			"*"
    		],
    		"Condition": {
    			"StringNotEquals": {
    				"g:ResourceOrgId": "o-xxxxxxxx"
    			}
    		}
    	}]
    }
  14. g:ResourceOrgPath

    示例:表示不允许用户用组织单元ou-qqq内账号的KMS密钥解密数据。

    {
    	"Version": "5.0",
    	"Statement": [{
    		"Effect": "Deny",
    		"Action": [
    			"kms:cmk:decryptData"
    		],
    		"Resource": [
    			"*"
    		],
    		"Condition": {
    			"StringMatch": {
    				"g:ResourceOrgPath": "o-xxx/r-yyy/ou-zzz/ou-qqq/*"
    			}
    		}
    	}]
    }

    示例:表示不允许用户用组织单元ou-qqq下子OU内账号的KMS密钥解密数据。

    {
    	"Version": "5.0",
    	"Statement": [{
    		"Effect": "Deny",
    		"Action": [
    			"kms:cmk:decryptData"
    		],
    		"Resource": [
    			"*"
    		],
    		"Condition": {
    			"StringMatch": {
    				"g:ResourceOrgPath": "o-xxx/r-yyy/ou-zzz/ou-qqq/ou-*"
    			}
    		}
    	}]
    }
  15. 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"
            }
          }
        }
      ]
    }
  16. g:SourceAccount

    示例:Service A是一个用于记录活动的服务,能帮助用户(Account B)把其设备(Account C)触发的活动日志转储到用户指定的OBS桶里。为了能让Service A正常向桶中写入数据,Account B的管理员会为Service A创建一个委托/信任委托X来操作自己账号下的OBS桶。当用户(Account B)或某个设备(Account C)接入了Service A并触发请求后,Service A切换获取指定委托/信任委托X的临时身份凭据,然后向桶中写入数据。

    图3 混淆代理

    由于委托/信任委托X的名字并非保密内容,如果攻击者(Account D)获取到了委托名并以同样的方式触发Service A,则其活动记录会被错误地记录在用户的OBS桶里。请注意,攻击者利用Service A的委托,间接地修改了用户的OBS桶,Service A的行为即被称为混淆代理。

    g:SourceAccount用于控制云服务为了哪个账号访问此次资源。以下策略仅允许Service A为xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx或yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy切换至对应委托的会话。

    {
    	"Version": "5.0",
    	"Statement": [{
    		"Principal": {
    			"Service": [
    				"Service.A"
    			]
    		},
    		"Action": [
    			"sts:agencies:assume"
    		],
    		"Condition": {
    			"StringEquals": {
    				"g:sourceAccount": [
    					"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    					"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
    				]
    			}
    		}
    	}]
    }
  17. g:SourceUrn

    与g:SourceAccount相同,该条件键也用于解决混淆代理问题。假设用户设备(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)的资源定义分为手表(watch)和手环(bracelet)两种,每种都有若干个。g:SourceUrn用于控制云服务为了哪个资源访问此次资源。以下策略表示仅允许Service A为符合条件的手表或手环切换至对应委托的会话。

    {
    	"Version": "5.0",
    	"Statement": [{
    		"Principal": {
    			"Service": [
    				"Service.A"
    			]
    		},
    		"Action": [
    			"sts:agencies:assume"
    		],
    		"Condition": {
    			"StringEquals": {
    				"g:sourceUrn": [
    					"alarm:*:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:watch:*",
    					"alarm:*:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:bracelet:*"
    				]
    			}
    		}
    	}]
    }
  18. g:SourceIdentity

    示例:表示不允许source_identity为yyyyy的身份切换该委托。

    {
    	"Version": "5.0",
    	"Statement": [{
    		"Effect": "Deny",
    		"Principal": {
    			"IAM": [
    				"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    			]
    		},
    		"Action": [
    			"sts:agencies:assume"
    		],
    		"Condition": {
    			"StringEquals": {
    				"g:SourceIdentity": "yyyyy"
    			}
    		}
    	}]
    }
  19. g:SourceIp

    示例:将以下策略绑定至账号,当该账号源IP地址在xxx.xx.xx.0/24范围内时,不允许通过编程或控制台访问KMS。

    源IP地址需要为公网IP,请勿在该条件键中包含内网地址。

    {
    	"Version": "5.0",
    	"Statement": [{
    		"Effect": "Deny",
    		"Action": [
    			"kms:cmk:decryptData"
    		],
    		"Resource": [
    			"*"
    		],
    		"Condition": {
    			"IpAddress": {
    				"g:SourceIp": "xxx.xx.xx.0/24"
    			}
    		}
    	}]
    }

    需注意:初始请求上下文中的g:SourceIp、g:SourceVpce、g:SourceVpc、g:VpcSourceIp不会在服务代表身份主体转发访问的后续请求中继续传递,因此使用这些条件键控制访问权限时,可能导致云服务需代表身份主体转发访问的请求被拒绝。实际场景中,建议使用g:CalledVia以允许转发访问请求。

    例外:身份主体由控制台发起的公网访问可视为身份主体直接由公网进行编程访问,因此由控制台代表身份主体转发访问的此次请求中将包含有初始的g:SourceIp。

    示例:将以下策略绑定至账号,拒绝该账号源IP地址在xxx.xx.xx.0/24范围外时,通过编程或控制台访问KMS;同时该策略允许云服务代表身份主体转发访问请求,即不会禁用其他云服务访问KMS。

    {
    	"Version": "5.0",
    	"Statement": [{
    			"Effect": "Deny",
    			"Action": [
    				"kms:cmk:decryptData"
    			],
    			"Resource": [
    				"*"
    			],
    			"Condition": {
    				"NotIpAddress": {
    					"g:SourceIp": "xxx.xx.xx.0/24"
    				},
    				"Bool": {
    					"g:ViaService": "false"
    				}
    			}
    		},
    		{
    			"Effect": "Deny",
    			"Action": [
    				"kms:cmk:decryptData"
    			],
    			"Resource": [
    				"*"
    			],
    			"Condition": {
    				"NotIpAddress": {
    					"g:SourceIp": "xxx.xx.xx.0/24"
    				},
    				"StringEqualsIfExists": {
    					"g:CalledViaFirst": "service.console",
    					"g:CalledViaLast": "service.console"
    				}
    			}
    		}
    	]
    }
  20. g:SourceVpce

    示例:将以下策略绑定至账号,拒绝该账号通过VPC终端节点 "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" 外的方式访问KMS;同时该策略允许云服务代表身份主体转发访问请求。

    {
    	"Version": "5.0",
    	"Statement": [{
    		"Effect": "Deny",
    		"Action": [
    			"kms:cmk:decryptData"
    		],
    		"Resource": [
    			"*"
    		],
    		"Condition": {
    			"StringNotEquals": {
    				"g:SourceVpce": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    			},
    			"Bool": {
    				"g:ViaService": "false"
    			}
    		}
    	}]
    }
  • 多值条件键
    1. (请求中的所有值)ForAllValues:测试请求集的每个成员的值是否为条件键集的子集。如果请求中的每个键值均与策略中的至少一个值匹配,则条件返回true。
    2. (请求中的任何值)ForAnyValue:测试请求值集的至少一个成员是否与条件键值集的至少一个成员匹配。如果请求中的任何一个键值与策略中的任何一个条件值匹配,则条件返回true。对于没有匹配的键或空数据集,条件返回false。
      条件键运算逻辑
      图4 条件键运算逻辑示意图
      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。

相关文档