策略语法

ACL语法简介

背景

百度智能云支持基于用户角色的权限校验和基于资源的权限校验。对用户请求,会根据请求身份得到与用户角色关联的accessControlList,进行鉴权;还会根据用户请求的资源路径,得到与资源关联的ACL(Access Control List 访问控制列表),进行鉴权。

名词解释

Access Control List (ACL):附加在用户角色或资源上的一个权限控制列表。用户对于资源的权限控制,可以是resource-based也可以是user-based。用户可以通过设置ACL,来对各个服务进行访问上的细粒度控制。ACL是一个列表,由一条或多条entry组成。

User-based ACL:附加于用户的权限控制列表。添加用户或组到特定的权限策略,在策略中指定此角色对不同资源的权限。请求到来时,通过用户及其所在组所附加的权限列表集合,遍历权限描述进行鉴权。

Resource-based ACL:附加于资源的权限控制列表。对特定level的资源(如BOS的bucket级别),在创建资源的同时指定其适用的策略,并在策略描述中指定对不同用户的权限。用户请求资源时,得到资源上所关联的权限策略,遍历策略中的权限描述进行鉴权。

IAM ACL语法

IAM ACL使用JSON格式的策略描述语言基于user或resource进行细粒度的访问控制。命名方法使用首字母小写的驼峰命名法。

字段总览

字段名称 是否必选 字段含义
Id 可选 本ACL的标识符,用来标识本ACL的id或对ACL进行描述
accessControlList 必选 ACL的主元素,标识ACL主体的开始,由一组statement组成
eid 可选 标识子acl entry的id,或者对该entry进行描述
service 必选 本条entry影响的服务组件,"*"表示所有服务
region 必选 本entry影响的区域,""表示所有区域(对全局服务,强制为"")
effect 必选 指定能够与本条entry匹配上的request,是否允许其继续执行
grantee 可选 指明本entry的受影响人,只适用于resource ACL且必选
permission 必选 指明本entry所影响的权限
resource 必选 指明本entry所影响的资源
condition 可选 指明策略生效的条件,该字段下存在子字段
  • Grantee子字段:
grantee子字段 字段含义 示例
id 授权(或禁止)的accountid b124deeaf6f641c9ac27700b41a350a8
user 授权(或禁止)的用户 bob
group 授权(或禁止)的组 developers
saml-provider 上传的IDP名称 developers
  • Condition子字段:
Condition子字段 字段含义
ipAddress 本statement生效的ip地址范围
Time 本statement生效的时间范围
Referer 本statement生效的referer

ACL与entry之间的关系:

  • 每个resource具有一条独立的ACL
  • 每条ACL由一条或多条entry组成

entry之间的关系:

  • entry之间是相互独立的关系
  • 相互独立的含义即:每个entry相互独立,entry逻辑判断与在ACL中的位置无关

综合示例

{
    "id": "id or description",
    "accessControlList": [
        {
            "eid": "eid or description",
            "service": "bce:bos",
            "region": "bj",
            "effect": "Allow",
            "permission": [
                "CreateBucket",
                "READ"
            ],
            "resource": [
                "bucketname/objectname"
            ],
            "grantee": [
                {
                    "id": "accountid",
                    "user": "bob",
                    "saml-provider":"saml.xml"
                }
            ],
            "condition": {
                "ipAddress": [
                    "192.168.0.0/16",
                    "192.169.0.0/16"
                ],
                "time": {
                "in": [
                        {
                            "greaterThan":"2010-06-01T23:00:00Z",
                            "lessThan":"2010-07-01T23:00:00Z "
                        },
                        {
                            "greaterThan":"2010-08-01T23:00:00Z "
                        }
                    ]
                },
                "referer": {
                    "stringEquals": [
                        "www.abc.com",
                        "www.example.com"
                    ],
                    "stringLike": [
                        "www.baidu.com/*"
                    ]
                }
            }
        }
    ]
}