ZooKeeper(六)权限管理机制

2023-11-17

一、ZooKeeper权限管理机制 

1.1 权限管理ACL(Access Control List) 

ZooKeeper 的权限管理亦即ACL 控制功能,使用ACL来对Znode进行访问控制。ACL的实现和Unix文件访问许可非常相似:它使用许可位来对一个节点的不同操作进行允许或禁止的权 限控制。但是和标准的Unix许可不同的是,Zookeeper对于用户类别的区分,不止局限于所有者(owner)、组 (group)、所有人(world)三个级别。Zookeeper中,数据节点没有"所有者"的概念。访问者利用id标识自己的身份,并获得与之相应的 不同的访问权限。

ZooKeeper 的权限管理通过Server、Client 两端协调完成:

(1) Server端

一个ZooKeeper 的节点存储两部分内容:数据状态,状态中包含ACL 信息。创建一个znode 会产生一个ACL 列表,列表中每个ACL 包括:

 权限perms

 验证模式scheme

 具体内容expression:Ids

例如,当scheme="digest" 时, Ids 为用户名密码, 即"root :J0sTy9BCUKubtK1y8pkbL7qoxSw"。ZooKeeper 提供了如下几种验证模式:

① Digest: Client 端由用户名和密码验证,譬如user:pwd

② Host: Client 端由主机名验证,譬如localhost

③ Ip:Client 端由IP 地址验证,譬如172.2.0.0/24

④ World :固定用户为anyone,为所有Client 端开放权限

当会话建立的时候,客户端将会进行自我验证。

权限许可集合如下:

① Create 允许对子节点Create 操作

 Read 允许对本节点GetChildren 和GetData 操作

 Write 允许对本节点SetData 操作

 Delete 允许对子节点Delete 操作

 Admin 允许对本节点setAcl 操作

另外,ZooKeeper Java API支持三种标准的用户权限,它们分别为:

 ZOO_PEN_ACL_UNSAFE:对于所有的ACL来说都是完全开放的,任何应用程序可以在节点上执行任何操作,比如创建、列出并删除子节点。
 ZOO_READ_ACL_UNSAFE:对于任意的应用程序来说,仅仅具有读权限。
 ZOO_CREATOR_ALL_ACL:授予节点创建者所有权限。需要注意的是,设置此权限之前,创建者必须已经通了服务器的认证。

Znode ACL 权限用一个int 型数字perms 表示,perms 的5 个二进制位分别表示setacl、delete、create、write、read。比如adcwr=0x1f,----r=0x1,a-c-r=0x15。

注意的是,exists操作和getAcl操作并不受ACL许可控制,因此任何客户端可以查询节点的状态和节点的ACL。

(2) 客户端

Client 通过调用addAuthInfo()函数设置当前会话的Author信息针对Digest 验证模式。Server 收到Client 发送的操作请求除exists、getAcl 之外,需要进行ACL 验证:对该请求携带的Author 明文信息加密,并与目标节点的ACL 信息进行比较,如果匹配则具有相应的权限,否则请求被Server 拒绝。

下面演示一个通过digest(用户名:密码的方式)为创建的节点设置ACL的例子,代码如下:

复制代码

    import org.apache.Zookeeper.*;
    import org.apache.Zookeeper.server.auth.DigestAuthenticationProvider;
    import org.apache.Zookeeper.data.*;
    import java.util.*;
    public class NewDigest {
        public static void main(String[] args) throws Exception {//new一个acl
            List<ACL> acls = new ArrayList<ACL>();
         //添加第一个id,采用用户名密码形式
            Id id1 = new Id("digest",DigestAuthenticationProvider.generateDigest("admin:admin"));
            ACL acl1 = new ACL(ZooDefs.Perms.ALL, id1);
            acls.add(acl1);
         //添加第二个id,所有用户可读权限
            Id id2 = new Id("world", "anyone");
            ACL acl2 = new ACL(ZooDefs.Perms.READ, id2);
            acls.add(acl2);
            // Zk用admin认证,创建/test ZNode。
         ZooKeeper Zk = new ZooKeeper("host1:2181,host2:2181,host3:2181",2000, null);
         Zk.addAuthInfo("digest", "admin:admin".getBytes());
         Zk.create("/test", "data".getBytes(), acls, CreateMode.PERSISTENT);
       }
    }

复制代码

1.2 ZooKeeper SuperDigest

(1) 一次Client 对Znode 进行操作的验证ACL 的方式为:

a) 遍历znode的所有ACL:

 对于每一个ACL,首先操作类型与权限(perms)匹配

② 只有匹配权限成功才进行session 的auth 信息与ACL 的用户名、密码匹配

b) 如果两次匹配都成功,则允许操作;否则,返回权限不够error(rc=-102)

(2) 如果Znode ACL List 中任何一个ACL 都没有setAcl 权限,那么就算superDigest 也修改不了它的权限;再假如这个Znode 还不开放delete 权限,那么它的所有子节点都将不会被删除。唯一的办法是通过手动删除snapshot 和log 的方法,将ZK 回滚到一个以前的状态,然后重启,当然这会影响到该znode 以外其它节点的正常应用。

(3) superDigest 设置的步骤:

① 启动ZK 的时候( zkServer.sh ) , 加入参数: Java"-Dzookeeper .DigestAuthenticationProvider.superDigest=super:D/InIHSb7yEEbrWz8b9l71RjZJU=" (无空格)。

 在客户端使用的时候, addAuthInfo("digest", "super:test", 10, 0, 0); " super:test" 为"super:D/InIHSb7yEEbrWz8b9l71RjZJU="的明文表示,加密算法同setAcl。

二、 Watch机制

Zookeeper客户端在数据节点上设置监视,则当数据节点发生变化时,客户端会收到提醒。ZooKeeper中的各种读请求,如getDate(),getChildren(),和exists(),都可以选择加"监视点"(watch)。"监视点"指的是一种一次性的触发器(trigger),当受监视的数据发生变化时,该触发器会通知客户端。

(1) 监视机制有三个关键点:

① "监视点"是一次性的,当触发过一次之后,除非重新设置,新的数据变化不会提醒客户端。

② "监视点"将数据改变的通知客户端。如果数据改变是客户端A引起的,不能保证"监视点"通知事件会在引发数据修改的函数返回前到达客户端A

 对于"监视点",ZooKeeper有如下保证:客户端一定是在接收到"监视"事件(watch event)之后才接收到数据的改变信息。

(2) "监视点"保留在ZooKeeper服务器上,则当客户端连接到新的ZooKeeper服务器上时,所有需要被触发的相关"监视点"都会被触发。当客户端断线后重连,与它的相关的"监视点"都会自动重新注册,这对客户端来说是透明的。在以下情况,"监视点"会被错过:客户端B设置了关于节点A存在性的"监视点",但B断线了,在B断线过程中节点A被创建又被删除。此时,B再连线后不知道A节点曾经被创建过。

(3) ZooKeeper的"监视"机制保证以下几点:

 "监视"事件的触发顺序和事件的分发顺序一致。

 客户端将先接收到"监视"事件,然后才收到新的数据

 "监视"事件触发的顺序与ZooKeeper服务器上数据变化的顺序一致

(4) 关于ZooKeeper"监视"机制的注意点:

 "监视点"是一次性的。

② 由于"监视点"是一次性的,而且,从接收到"监视"事件到设置新"监视点"是有延时的,所以客户端可能监控不到数据的所有变化。

 一个监控对象,只会被相关的通知触发一次。如果一个客户端设置了关于某个数据点exists和getData的监控,则当该数据被删除的时候,只会触发"文件被删除"的

通知。

④ 当客户端断开与服务器的连接时,客户端不再能收到"监视"事件,直到重新获得连接。所以关于Session的信息将被发送给所有ZooKeeper服务器。由于当连接断开时收不到"监视",所以在这种情况下,模块行为需要容错方面的设计。

三、Session机制

3.1 会话概述

每个ZooKeeper客户端的配置中都包括集合体中服务器的列表。在启动时,客户端会尝试连接到列表中的一台服务器。如果连接失败,它会尝试连接另一台服务器,以此类推,直到成功与一台服务器建立连接或因为所有ZooKeeper服务器都不可用而失败。

图 3.1 ZooKeeper体系结构

一旦客户端与一台ZooKeeper服务器建立连接,这台服务器就会为该客户端创建一个新的会话。每个会话都会有一个超时的时间设置,这个设置由创建会话的应用来设定。如果服务器在超时时间段内没有收到任何请求,则相应的会话会过期。一旦一个会话已经过期,就无法重新打开,并且任何与该会话相关联的短暂znode都会丢失。会话通常长期存在,而且会话过期是一种比较罕见的事件,但对应用来说,如何处理会话过期仍是非常重要的。

只要一个会话空闲超过一定时间,都可以通过客户端发送ping请求(也称为心跳)保持会话不过期。ping请求由ZooKeeper的客户端库自动发送,因此在我们的代码中不需要考虑如何维护会话。这个时间长度的设置应当足够低,以便能档检测出服务器故障(由读超时体现),并且能够在会话超时的时间段内重新莲接到另外一台服务器。

3.2 故障切换

ZooKeeper客户端可以自动地进行故障切换,切换至另一台ZooKeeper服务器。并且关键的一点是,在另一台服务器接替故障服务器之后,所有的会话和相关的短暂Znode仍然是有效的。在故障切换过程中,应用程序将收到断开连接和连接至服务的通知。当客户端断开连接时,观察通知将无法发送;但是当客户端成功恢复连接后,这些延迟的通知会被发送。当然,在客户端重新连接至另一台服务器的过程中,如果应用程序试图执行一个操作,这个操作将会失败。这充分体现了在真实的ZooKeeper应用中处理连接丢失异常的重要性。

四、ZooKeeper实例状态

(1) ZooKeeper状态

ZooKeeper对象在其生命周期中会经历几种不同的状态。你可以在任何时刻通过getState()方法来查询对象的状态:

public States getState()

States被定义成代表ZooKeeper对象不同状态的枚举类型值(不管是什么枚举值,一个ZooKeeper的实例在一个时刻只能处于一种状态)。在试图与ZooKeeper服务建立连接的过程中,一个新建的ZooKeeper实例处于CONNECTING状态。一旦建立连接,它就会进入CONNECTED状态。 

图 3.2 ZooKeeper状态转换

通过注册观察对象,使用了ZooKeeper对象的客户端可以收到状态转换通知。在进入CONNECTED状态时,观察对象会收到一个WatchedEvent通知,其中KeeperState的值是SyncConnected。

(2) Watch与ZooKeeper状态

ZooKeeper的观察对象肩负着双重责任:

 可以用来获得ZooKeeper状态变化的相关通知;

 可以用来获得Znode变化的相关通知。

监视ZooKeeper状态变化:可以使用ZooKeeper对象默认构造函数的观察。

监视Znode变化:可以使用一个专用的观察对象,将其传递给适当的读操作。也可以通过读操作中的布尔标识来设定是否共享使用默认的观察。

ZooKeeper实例可能失去或重新连接ZooKeeper服务,在CONNECTED和CONNECTING状态中切换。如果连接断 开,watcher得到一个Disconnected事件。学要注意的是,这些状态的迁移是由ZooKeeper实例自己发起的,如果连接断开他将自动尝 试自动连接。

如果任何一个close()方法被调用,或是会话由Expired类型的KeepState提示过期时,ZooKeeper可能会转变成第三种状态 CLOSED。一旦处于CLOSED状态,ZooKeeper对象将不再是活动的了(可以使用states的isActive()方法进行测试),而且不 能被重用。客户端必须建立一个新的ZooKeeper实例才能重新连接到ZooKeeper服务。

如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
如果,您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是【Sunddenly】。

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ZooKeeper(六)权限管理机制 的相关文章

  • 微信html5活动页面制作,完整的微信H5活动页面设计规范

    微信火了H5的专题页面设计也越来越多了 经常有朋友问H5专题设计按什么尺寸来做 有没有统一的规范 这里就给大家分享一套非常完整的关于微信H5活动页面设计的UI视觉设计规范教程 希望对那些刚刚从事微信H5界面设计的小伙伴们提供一些帮助 微信H

随机推荐

  • Caddy2学习笔记——Caddy2反向代理docker版本的DERP中继服务器

    一 个人环境概述 本人拥有一个国内云服务商的云主机和一个备案好的域名 通过caddy2来作为web服务器 我的云主机系统是Ubuntu 我的云主机是公网ip 地址为 43 126 100 78 我备案好的域名是 hotgirl com 后面
  • the “scope“ attribute for scoped slots have been deprecated and replaced by “slot-scope“ since 2.5

    在 VSCode 中运行 Vue 关于作用域插槽时的问题 报出警告 Module Warning from node modules vue vue loader v15 lib loaders templateLoader js Emit
  • (支付宝支付)Spring实现一个项目配置多个信息、付款给对应商户

    如何实现一个项目配置多个商户信息付款给对应商户 最近在对接支付宝支付时 遇到了一个问题 用户在付款时 需要直接付款到指定支付宝账户 这个需求也无可厚非 就像我们公司有四个分公司 分别在北京 上海等地 如果钱只能到总公司的账户上 那在财务结算
  • linux c do while循环,C语言do-while循环

    要执行程序或代码的一部分几次或多次 我们可以使用C语言的do while循环 在do和while之间给出的代码将被执行 直到条件 condition 成为true 在do while循环中 语句在条件之前给出 所以语句或代码将至少有一次执行
  • Wav2lip-GAN 环境配置

    首先使用 conda 创建新的虚拟环境 然后激活这个环境 conda create n myenv python 3 8 activate myenv 使用 git 克隆代码 或者直接下载源码压缩包解压 安装依赖 我使用的豆瓣源 git c
  • 热部署,未测试

    package agent import java lang instrument Instrumentation import java lang instrument UnmodifiableClassException import
  • 在子类的override方法中调用父类的父类的未被重写的方法

    今天做一个自定义控件 扩展TableLayoutPanel这个控件加一些自己的属性 重写OnPaintBackground这个虚方法 控件的继承关系是这样的 Control ScrollableControl Panel TableLayo
  • 5_spring-cloud-zuul-网关

    文章目录 网关 链路追踪 Zuul zuul 原理 负载均衡设置 配置指定服务的路由 重定向 忽略服务 禁止直接请求 前缀配置 暴露路由端点 网关 链路追踪 Zuul Sleuth https start aliyun com Zuul是N
  • 软件测试学习规划路线

    现如今互联网行业飞速发展 IT行业也是水涨船高 软件行业的未来发展也是越来越好 而软件测试在软件行业可谓是一个必不可少的职业 它不仅算得上一个长青工作 而且也是一个在需求持续增长的职业 如果你已经入行软件测试了 那就沉住气继续努力下去 保持
  • MyEclipse新建Maven webapp项目

    MyEclipse中创建新的Maven项目 webapp目录结构 过程如下 1 New gt Project gt Maven Project 2 Next 3 Next 选择 maven archetype webapp 创建一个weba
  • 编程教育案例

    1 Osmo Coding早教玩具 可以编代码的智能版乐高 https www playosmo com zh cn schools https digi tech qq com a 20160527 055566 htm https ww
  • BUUCTF Misc [GXYCTF2019]SXMgdGhpcyBiYXNlPw== & 间谍启示录 & Mysterious & [UTCTF2020]docx

    目录 GXYCTF2019 SXMgdGhpcyBiYXNlPw 间谍启示录 Mysterious UTCTF2020 docx GXYCTF2019 SXMgdGhpcyBiYXNlPw 下载文件 base64隐写 使用脚本 base64
  • linux下apt-get install软件出现,E: 未发现软件包

    在debian虚拟机中安装库时 总是提示E 未发现软件包 libXtst dev 搜索后发现可能是缺少软件源 打开 etc apt sources list 发现所有语句均被注释 搜索了很多 最后使用的Debian镜像使用帮助的使用样例 在
  • ps如何把人物扣下来

    做前端的难免会自己用上ps 我在网上看了很多关于ps如何把人物扣下来的 我给大家分享一下自己的一些见解 首先打开ps工具 里面放上一张图片 放进去图片之后什么东西都不用动 第二步 shift 键可以扩大选取 ail键可以减小选取 第三步 完
  • 区块链学习笔记(一)

    https zhuanlan zhihu com p 23243289 1 区块的数据结构 区块高度 每个区块的唯一ID 块高度为0的创世块 一段时间生成一个块 高度加1 头哈希 每个区块的唯一哈希值 根据父哈希 数据块哈希 随机数生成 父
  • 程序人生-Hello’s P2P[HITICS-大作业]

    计算机系统 大作业 题 目 程序人生 Hello s P2P 专 业 计算机科学与技术学院 学 号 1180301006 班 级 1803010 学 生 宋永玺 指 导 教 师 史先俊 计算机科学与技术学院 2019年12月 摘 要 一个简
  • Java 中j+=i 和 j=+i 的区别

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 一 j i 意思就是 把i获取到的值与j相加 之后再把值赋给j 更新j的值 换句话说 j j i 写下代码更好的理解一下 Test pu
  • 静态绑定和动态绑定

    对于非虚成员函数 是静态绑定的 而虚函数都是动态绑定 如此才可实现多态性 这也是 语言和其它语言Java Python的一个显著区别 几个名词定义 静态类型 对象在声明时采用的类型 在编译期既已确定 动态类型 通常是指一个指针或引用目前所指
  • vscode按住ctrl+鼠标左键无法跟踪跳转方法名【带vscode编辑PHP的配置教程】

    今天刚装好vscode 发现vscode按住ctrl 鼠标左键无法跟踪跳转方法名 其实就是装一个插件就好了 vscode elm jump 常规的代码跳转定义 Vue CSS Peek 按ctrl可以跳转css定义 vue helper 变
  • ZooKeeper(六)权限管理机制

    一 ZooKeeper权限管理机制 1 1 权限管理ACL Access Control List ZooKeeper 的权限管理亦即ACL 控制功能 使用ACL来对Znode进行访问控制 ACL的实现和Unix文件访问许可非常相似 它使用