更新时间:2024-04-02 GMT+08:00

策略语言说明

策略内容

细粒度授权策略内容包括策略版本号(Version)及策略授权语句(Statement)列表。

  • 策略版本号:Version,标识策略的版本号,主要用于区分Role-Based Access Control策略和细粒度策略。
    • 1.0:Role-Based Access Control(RBAC))策略。RBAC策略是将服务作为一个整体进行授权,授权后,用户可以拥有这个服务的所有权限,RBAC策略只能由系统预置。
    • 1.1:细粒度策略。相比RBAC策略,细粒度策略基于服务的API接口进行权限拆分,授权更加精细。授权后,用户可以对这个服务执行特定的操作。细粒度策略包括系统预置和用户自定义两种:
      • 系统预置策略:系统预置服务常用的权限集,包括服务的只读权限或管理员权限。
      • 用户自定义策略:由用户自己创建和管理的权限集,是对系统策略的扩展和补充。例如:针对ECS服务,控制用户仅能变更云服务器规格。
  • 策略授权语句:Statement,描述的是策略的详细信息,包含作用(Effect)、授权项(Action)、资源类型(Resource)、条件(Condition)。
    • 作用(Effect)

      作用包含两种:允许(Allow)和拒绝(Deny),一个自定义策略中可以同时包含允许和拒绝的授权语句,当策略中既有允许又有拒绝的授权语句时,遵循Deny优先的原则。

    • 授权项(Action)

      对资源的具体操作权限,支持单个或多个操作权限。

      格式为:服务名:资源类型:操作,例如:vpc:ports:create。

    • 资源类型(Resource)

      策略所作用的资源。

      格式为:服务名:region:domainId:资源类型:资源路径, 通配符号*表示所有。

      示例:

      • "obs:*:*:bucket:*": 表示所有的OBS桶。
      • "obs:*:*:object:my-bucket/my-object/*": 表示my-bucket桶my-object目录下的所有对象。
    • 条件(Condition)

      使策略生效的特定条件,包括条件键和运算符。条件键表示策略语句的 Condition 元素中的键值,分为全局级条件键和服务级条件键(由云服务定义,请参见云服务帮助中心)。全局级条件键(前缀为g:)适用于所有操作,服务级条件键(前缀为服务缩写,如obs:)仅适用于对应服务的操作。运算符与条件键一起使用,构成完整的条件判断语句。

      格式为:条件运算符: {条件名:[条件值1, 条件值2]}。

      示例:

      • "StringEndWithIfExists":{"g:UserName":["specialCharactor"]}:表示当用户输入的用户名以"specialCharactor"结尾时该条statement生效。
      表1 全局级请求条件

      全局条件键

      条件类型

      说明

      g:CurrentTime

      时间

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

      g:DomainName

      字符串

      账号名称

      g:ProjectName

      字符串

      项目名称

      g:ServiceName

      字符串

      服务名称

      g:UserId

      字符串

      IAM用户ID

      g:UserName

      字符串

      IAM用户名

    • 服务名:产品名称,例如ecs、evs和vpc等,服务名仅支持小写。
    • 资源类型和操作没有大小写要求,支持通配符号*,用户不需要罗列全部授权项,通过配置通配符号*可以方便快捷地实现授权。

策略样例

  • 支持单个操作权限,例如:查询弹性云服务器详情权限
    {
          "Version": "1.1",
          "Statement": [
                {
                      "Effect": "Allow",
                      "Action": [
                            "ecs:servers:list",
                            "ecs:servers:get",
                            "ecs:serverVolumes:use",
                            "ecs:diskConfigs:use",
                            "ecs:securityGroups:use",
                            "ecs:serverKeypairs:get",
                            "vpc:securityGroups:list",
                            "vpc:securityGroups:get",
                            "vpc:securityGroupRules:get",
                            "vpc:networks:get",
                            "vpc:subnets:get",
                            "vpc:ports:get",
                            "vpc:routers:get"
                      ]
                }
          ]
    }
  • 支持多个操作权限,例如:锁定云服务器和创建云硬盘权限。
    {
        "Version": "1.1",
          "Statement": [
                {
                      "Effect": "Allow",
                      "Action": [
                            "ecs:servers:lock",
                            "evs:volumes:create"
                      ]
                }
          ]
    }
  • 通配符号*用法示例:对IMS服务资源的所有权限。
    {
            "Version": "1.1",
            "Statement": [
                    {
                            "Action": [
                                    "ims:*:*",
                                    "ecs:*:list",
                                    "ecs:*:get",
                                    "evs:*:get"
                            ],
                            "Effect": "Allow"
                    }
            ]
    }
  • 拒绝以TestUser命名开头的用户查看以TestBucket命名开头的桶。
    {
            "Version": "1.1",
            "Statement": [
                    {
                            "Action": [
                                    "obs:bucket:ListAllMybuckets",
                                    "obs:bucket:HeadBucket",
                                    "obs:bucket:ListBucket",
                                    "obs:bucket:GetBucketLocation"
                            ],
                            "Effect": "Deny",
                            "Resource": [
                                "obs:*:*:bucket:TestBucket*"
                            ],
                            "Condition": {
                                "StringStartWith": {
                                    "g:UserName": [
                                        "TestUser"
                        ]
                    }
                }
                    }
            ]
    }

    当前仅部分服务支持资源级授权,对于不支持资源级别授权的服务,若自定义策略中含有资源类型,则无法创建成功。

检查规则

系统根据用户被授予的策略,对用户进行鉴权。系统鉴权逻辑如下:

图1 系统鉴权逻辑图

每条策略做评估时, Action之间是或(or)的关系。

  1. 用户访问系统,发起操作请求。
  2. 系统评估用户被授予的访问策略,鉴权开始。
  3. 在用户被授予的访问策略中,系统将优先寻找显式拒绝指令。如找到一个适用的显式拒绝,系统将返回Deny决定。
  4. 如果没有找到显式拒绝指令,系统将寻找适用于请求的任何Allow指令。如果找到一个显式允许指令,系统将返回Allow决定。
  5. 如果找不到显式允许,最终决定为Deny,鉴权结束。