前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >谷歌统一权限系统Zanzibar

谷歌统一权限系统Zanzibar

作者头像
itliusir
发布2021-06-25 09:45:24
2.2K0
发布2021-06-25 09:45:24
举报
文章被收录于专栏:刘君君刘君君

摘要: Google Zanzibar 权限服务

Zanzibar

1. 介绍

Zanzibar 是一个用于存储和评估访问控制列表的全球系统。 Zanzibar 提供统一的数据模型和配置语言,用于表达来自 Google 数百个客户端服务的广泛访问控制策略,包括Calendar、Cloud、 Drive、Maps、Photos、YouTube。

image-20210616114929969
image-20210616114929969
  • Consistent 保证用户操作ACL的因果顺序,提供外部一致性。
  • Flexible 支持丰富的访问控制策略
  • Scalable 数以万亿计的 ACL 条目,百万check qps
  • Fast 95%请求小于10ms,99.9%请求小于100ms
  • Available 过去 3 年 可用率99.999%

2. 模型

2.1 Relation Tuples

ACL 表示为关系元组的对象-用户或对象-对象关系的集合。组只是具有成员资格语义的 ACL。关系元组具有高效的二进制编码,我们使用方便的文本符号表示它们:

代码语言:javascript
复制
⟨*tuple*⟩ ::= ⟨*object*⟩‘#’⟨*relation*⟩‘@’⟨*user*⟩ 

⟨*object*⟩ ::= ⟨*namespace*⟩‘:’⟨*object id*⟩ 

⟨*user*⟩ ::= ⟨*user id*⟩ | ⟨*userset*⟩ 

⟨*userset*⟩ ::= ⟨*object*⟩‘#’⟨*relation*⟩

Simple Example

代码语言:javascript
复制
// user1 has access on dir1
dir1#access@user1
// Have a look on the subjects concept page if you don't know the empty relation.
dir1#parent@(file1#)
// Everyone with access to dir1 has access to file1. This would probably be defined
// through a subject set rewrite that defines this inherited relation globally.
// In this example, we define this tuple explicitly.
file1#access@(dir1#access)
// Direct access on file2 was granted.
file2#access@user1
// user2 is owner of file2
file2#owner@user2
// Owners of file2 have access to it; possibly defined through subject set rewrites.
file2#access@(file2#owner)
image-20210617160709202
image-20210617160709202

2.2 Consistency Model

Example Tuple

Semantics

doc:readme#owner@10

User 10 is an owner of doc:readme

group:eng#member@11

User 11 is a member of group:eng

doc:readme#viewer@group:eng#member

Members of group:eng are viewers of doc:readme

doc:readme#parent@folder:A#…

doc:readme is in folder:A

2.3 Relation Configs

为了减少关系元组在表达关系上会出现很多条的关系组,客户端通过关系配置中的用户集重写规则来定义对象不可知的关系。

代码语言:javascript
复制
name: "doc"
relation { name: "owner" }
relation {
 name: "editor"
 userset_rewrite {
  union {
   child { _this {} }
   child { computed_userset { relation: "owner" } }
}}}
relation {
 name: "viewer"
 userset_rewrite {
  union {
   child { _this {} }
   child { computed_userset { relation: "editor" } }
   child { tuple_to_userset {
     tupleset { relation: "parent" }
     computed_userset {
       object: $TUPLE_USERSET_OBJECT  # parent folder
relation: "viewer" }}}
}}}
child 节点
  • _this 返回所有用户集合,默认行为
  • computed_userset 计算出一个新的用户集合,例如使 viewer 用户引用 editor 用户。
  • tuple_to_userset 从输入对象中获取匹配的关系组,例如匹配其父级文件夹并继承其 viewer 权限

一个用户集表达式也可以由多个子表达式组成,通过并集、交集和排除等操作组合。

3. 架构

image-20210616233003291
image-20210616233003291

3.1 aclserver

aclservers 是主要的服务器类型。它们被组织成集群并响应 Check、Read、Expand 和 Write 请求。请求到达集群中的任何服务器,并且该服务器根据需要将工作分发到集群中的其他服务器。这些服务器可以依次联系其他服务器以计算中间结果。初始服务器收集最终结果并将其返回给客户端。

3.2 watchserver

watchservers 是一种特殊的服务器类型,可以响应 Watch 请求。他们跟踪更改日志并近乎实时地为客户端提供命名空间更改流。

3.2 Storage

  • Namespace Config Storage 命名空间配置存储在具有两个表的数据库中。一张表包含配置并以命名空间 ID 为键。另一个是配置更新的更改日志.
  • Relation Tuple Storage 每个命名空间的关系元组存储在一个单独的数据库中,其中每一行都由主键(分片 ID、对象 ID、关系、用户、提交时间戳)标识。主键的排序允许我们查找给定对象 ID 或(对象 ID,关系)对的所有关系元组。 我们的客户端根据其数据模式配置命名空间的分片。通常,分片 ID 仅由对象 ID 确定。在某些情况下,例如,当命名空间存储具有大量成员的组时,分片 ID 是根据对象 ID 和用户计算得出的。
  • change log 用于存储 Watch API 的元组更新历史记录。主键是(更改日志分片 ID、时间戳、唯一更新 ID),其中每次写入随机选择一个更改日志分片。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-06-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Zanzibar
    • 1. 介绍
      • 2. 模型
        • 2.1 Relation Tuples
        • 2.2 Consistency Model
        • 2.3 Relation Configs
      • 3. 架构
        • 3.1 aclserver
        • 3.2 watchserver
        • 3.2 Storage
    相关产品与服务
    对象存储
    对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档