使用ZooKeeper ACL特性进行znode控制

Zookeeper作为配置管理服务,因为配置数据有很高的安全要求,需要有权限控制,客户端需要进行登录认证才操作(查看数据,修改数据,创建children znode等等)Zookeeper上面对应znode。

1. 简单的客户端认证zkCli.sh 命令如下:

[zk: localhost:2181(CONNECTED) 23] ls /tom
Authentication is not valid : /tom
#添加认证之后,即可查看znode /tom
[zk: localhost:2181(CONNECTED) 27] addauth digest tom:tom
[zk: localhost:2181(CONNECTED) 28] ls /tom
[]

2. Zookeeper提供的认证方式

Zookeeper对权限的控制是znode级别的,不继承即对父节点设置权限,其子节点不继承父节点的权限。 
  world:有个单一的ID,anyone,表示任何人。
  auth:不使用任何ID,表示任何通过验证的用户(验证是指创建该znode的权限)。 
  digest:使用 用户名:密码 字符串生成MD5哈希值作为ACL标识符ID。权限的验证通过直接发送用户名密码字符串  的方式完成, 
  ip:使用客户端主机ip地址作为一个ACL标识符,ACL表达式是以 addr/bits 这种格式表示的。ZK服务器会将addr的前bits位与客户端地址的前bits位来进行匹配验证权限。

3. auth认证方式

Perm:ALL, Id:("auth","") 即创建者拥有访问权限。

/auth的数据是“auth”, auth认证方式,读写权限。

[zk: localhost:2181(CONNECTED) 37] create /auth auth auth::rw
Created /auth

查看/auth的访问控制列表可以看出需要通过digest模式用户名密码是tom/tom认证才可以访问,不对id做限制。

[zk: localhost:2181(CONNECTED) 42] getAcl /auth
‘digest,‘tom:GcSMsIa2MmdW+zdSJKAv8gcnrpI=
: rw

成功的认证:

[zk: localhost:2181(CONNECTED) 0] ls /auth    
Authentication is not valid : /auth
[zk: localhost:2181(CONNECTED) 1] addauth digest tom:tom
[zk: localhost:2181(CONNECTED) 2] ls /auth
[]

失败的认证:

[zk: localhost:2181(CONNECTED) 2] addauth digest supper:admin
[zk: localhost:2181(CONNECTED) 3] ls /auth
Authentication is not valid : /aut

4.通过zkCli.sh 创建znode,并设置ACL

4.1 创建设置ACL的znode

图1 - 用户/密码super/admin创建/supper:

图2-用户/密码tom/tom创建/tom:

图3-查看/supper和/tom的ACL:

4.2 使用如下代码来生成用户名和密码的摘要:

java -cp $ZK_CLASSPATH org.apache.zookeeper.server.auth.DigestAuthenticationProvider amy:secret
....
amy:secret->amy:Iq0onHjzb4KyxPAp8YWOIC8zzwY=

注:在启动Zookeeper服务是指定

-Dzookeeper.DigestAuthenticationProvider.superDigest=super:<base64encoded(SHA1(password))

将启用超级用户,通过该supper:密码认证的客户端访问将不受ACL列表限制。

5. 客户端验证

5.1验证supper/admin

ZooKeeper zooKeeper1 = new ZooKeeper("192.168.88.153:2181", 10000, new Watcher() {
    @Override
    public void process(WatchedEvent event) {
        System.out.println(event);
    }
});
//zooKeeper1.addAuthInfo("digest", "supper:admin".getBytes());
Stat stat = new Stat();
byte[] supperData = zooKeeper1.getData("/supper", true, stat);
System.out.println(new String(supperData) + "," + stat);

运行上面代码,读(r)znode "/supper" :

去掉注释代码,为客户端添加认证信息之后:

0,8589940093,8589940093,1439970090902,1439970090902,0,0,0,0,1,0,8589940093

数据是0,符合4中图1设置的值。

5.2验证tom/tom

ZooKeeper zooKeeper2 = new ZooKeeper("192.168.88.153:2181", 10000, new Watcher() {
    @Override
    public void process(WatchedEvent event) {
        System.out.println(event);
    }
});
zooKeeper2.addAuthInfo("digest", "tom:tom".getBytes());
stat = new Stat();
byte[] tomData = zooKeeper2.getData("/tom", true, stat);
System.out.println(new String(tomData) + "," + stat);

结果似同5.1.

通过zkCli.sh客户端连接,认证和读取

6.使用zkCli.sh 验证acl(点击查看大图)

Zookeeper提供的权限信息表:

权限 描述 setAcl中的简写
write 能够设置znode的值 w
read 能够读取znode的值和列出它的children znode r
create 能够创建children znode c
delete 能够删除children znode d
admin 能够执行setAcl即设置访问控制列表 a
all 所有权限 wrcda

7:注意问题:

7.1 通过zkCli.sh设置acl的格式是scheme:id:perm,perm的写法是简写字母连接,如读写权限rw和Linux的文件系统的权限相似。有些版本可能是:READ|WRITE, 所以需要注意命令行提示信息。

7.2 通过zkCli.sh设置acl时,scheme是digest的时候,id需要密文,具体生成参见文4.2

7.3 通过Zookeeper的客户端编码方式添加认证,digest对应的auth数据是明文,参见文5.1

8.Zookeeper认证的扩展

实现AuthenticationProvider接口提供自定义的认证方式。

org.apache.zookeeper.server.auth.AuthenticationProvider

比如自定义实现AuthenticationProvider类是secondriver.MyProvier,可以通过两种方式注册Zookeeper认证体系中去。

第一种:启动Zookeeper服务是通过-Dzookeeper.authPorivder.X=secondriver.MyProvider

第二种:添加到配置文件(zoo.conf)中如:

zookeeper.authProvider.1=secondriver.MyProvider

注:上面X是对authProvider实现提供编号用来区别不同的authProvider。

时间: 2025-01-04 10:37:47

使用ZooKeeper ACL特性进行znode控制的相关文章

zookeeper java调用及权限控制

import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.List; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEven

Zookeeper ACL(使用node-zookeeper-client)

再分布式系统中.ACL(Access Control)十分重要:Zookeeper也提供了十分好用的ACL接口,以下我记录一下在nodejs下怎样实现zookeeper的訪问控制. Zookeeper的ACL通常表示为:Scheme:Id:Permission,即Scheme,Id,Permission三个部分. 当中,Scheme表示使用何种方式来进行訪问控制.Id代表用户.Permission表示有什么权限. ZooKeeeper has the following built in sch

zookeeper基本特性与基于Linux的ZK客户端命令行学习

zookeeper常用命令行操作 通过 zkCli.sh 来打开zk客户端: [[email protected] ~]# zkCli.sh [zk: localhost:2181(CONNECTED) 0] ls 与 ls2 命令: [zk: localhost:2181(CONNECTED) 0] ls / # ls命令用于查看节点,类似于Linux中的查看目录 [zookeeper] [zk: localhost:2181(CONNECTED) 1] ls2 / # ls2命令用于查看节点

RHEL7/CENTOS7 新特性(服务控制和防火墙)

一 服务控制 1 简介  RHEL7 监视和控制 systemd 的主要命令是 systemctl,该命令可以    用于查 看系统状态和管理系统及服务.         RHEL7 的服务 systemctl 脚本存放在: /usr/lib/systemd/,有系统 ( system)          和用户( user)之分,像需要开机不登陆就能运行的程序, 存在系统服务 里,即:/usr/lib/systemd/system 目录下. 每一个服务以.service 结尾 ,一般会分为 3

Linux7/Centos7新特性之服务控制

Rhel7服务控制 Systemd对linux来说,就是一个init程序,可以作为sysVinit和Upstat的替代 RHEL7监视和控制systemd的主要命令是systemctl,该命令可以用于查看系统状态和管理系统及服务. RHEL7的服务systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和用户(user)之分,像需要开机不登陆就能运行的程序,存在系统服务里,即:/usr/lib/systemd/system目录下.每一个服务以.service结尾,

zookeeper 常用命令及znode简介

1. 进入zookeeper 安装目录下的bin目录, 运行脚本, ip + clientPort (这里注意, clientPort是在zoo.cfg文件里边的一个配置, 而不是 server.1=168.72.230.27:2888:3888 这种server配置里边的端口) ./zkCli.sh -server 168.72.230.27:2181 Welcome to ZooKeeper!2018-08-19 23:50:08,320 [myid:] - INFO [main-SendT

2 weekend110的zookeeper的原理、特性、数据模型、节点、角色、顺序号、读写机制、保证、API接口、ACL、选举、 + 应用场景:统一命名服务、配置管理、集群管理、共享锁、队列管理

在hadoop生态圈里,很多地方都需zookeeper. 启动的时候,都是普通的server,但在启动过程中,通过一个特定的选举机制,选出一个leader. 只运行在一台服务器上,适合测试环境:Zookeeper 的启动脚本在 bin 目录下:在启动脚本之前,还有几个基本的配置项需要配置一下, tickTime :这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个  tickTime  时间就会发送一个心跳:dataDir:顾名思义就是 Zookee

ZooKeeper 特性

ZooKeeper 拥有一个层次的命名空间.(like distributed) 注意:ZooKeeper 中不许使用相对路径. 一    ZooKeeper 数据模型 1)    Znode ZooKeeper 目录树中的每一个节点对应着一个 Znode 每个 Znode 维护者一个属性结构. dataVersion       版本号 ctime                  创建时间 mtime                 修改时间 每当 Znode 的数据改变时,它相应的版本号会

重新想象 Windows 8.1 Store Apps (90) - 通信的新特性: 通过 HttpBaseProtocolFilter 实现 http 请求的缓存控制,以及 cookie 读写; 自定义 HttpFilter; 其他

[源码下载] 作者:webabcd 介绍重新想象 Windows 8.1 Store Apps 之通信的新特性 通过 HttpBaseProtocolFilter 控制缓存逻辑,以及如何通过 HttpBaseProtocolFilter 管理 cookie 自定义 HttpFilter 其他 示例HTTP 服务端WebServer/HttpDemo.aspx.cs /* * 用于响应 http 请求 */ using System; using System.IO; using System.T