一:Zookeeper权限控制
在zk集群中,不同的应用之间一般不会存在共享数据,为了避免某一个数据被不同的进程修改,这就需要进行相应的权限控制。
二:ACL介绍
Zookeeper使用ACL机制来实现权限的控制,ACL机制主要分为3个方面,权限模式,权限ID和权限
2.1 权限模式
1)IP
ip模式是指权限针对这个ip而设置的,比如"ip:192.168.0.00",即允许这个ip方法数据节点
2)digest
digest模式是最常用的一种模式,形如"username:password"的方式。设置成digest模式后,zk会使用如下的方式进行加密
public static void main(String[] args) {
try {
System.out.println(DigestAuthenticationProvider.generateDigest("tanjie:123"));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
结果:
tanjie:Q7FWxEJF7trsn2KKyWNOf1yqbKs=
3)World
World模式其实是一种开放的模式,即对所以用户开放,设置格式是"world:anyone",事实上这种模式没什么效果,因为设置了也对所有人开放
4)Super
Super模式是超级管理员模式,超级管理员可以对任何节点进行操作,想象一下,如果创建某个持久节点的进程已经不再使用了,那这个持久的节点该怎么处理呢,这就需要
使用超级管理员模式了
要使用超级管理员模式,需要在zk的启动脚本zkServer.sh里面配置一下,可以配置形如"super:password",其中super是用户名,password是密码,这个可以根据需要随便设置
配置完成后,然后重启zkServer即可,然后在你的程序中,就可以以超级管理员的方法给zk客户端添加权限然后就可以访问任何节点了。
2.2 授权对象ID
zk的授权对象是指将权限赋予谁,比如ip就是赋予一个ip地址,digest形式就是服务指定的用户名,super模式就是超级管理员,world默认就是anyone
2.3权限
权限就是通过设置被允许的操作,常见的就是CRUD和ADMIN
三:举例说明
通过上面的介绍,大家已经对zk的ACL权限是如何控制对节点数据的访问,下面通过一些例子来加深认识
例一:不同的客户端去获取设置了权限的同一个节点的数据
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import com.zookeeper.utils.CommonParams;
public class Zookeeper_Acl_Create extends CommonParams implements Watcher {
private static CountDownLatch latch = new CountDownLatch(1);
private static CountDownLatch countDownLatch = new CountDownLatch(1);
private static ZooKeeper zk = null;
public void syncInit() {
try {
zk = new ZooKeeper(CONNECTION_IP, 5000,
new Zookeeper_Acl_Create());
latch.await();
zk.addAuthInfo("digest", "username:password".getBytes());
zk.create("/act", "init".getBytes(), Ids.CREATOR_ALL_ACL, CreateMode.EPHEMERAL);
ZooKeeper zk3 = new ZooKeeper(CONNECTION_IP, 5000,
null);
zk3.addAuthInfo("digest", "username:password".getBytes());
String value2 = new String(zk3.getData("/act", false, null));
System.out.println("zk3有权限进行数据的获取" + value2);
ZooKeeper zk2 = new ZooKeeper(CONNECTION_IP, 5000,
null);
zk2.addAuthInfo("digest", "super:123".getBytes());
zk2.getData("/act", false, null);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (KeeperException e) {
System.out.println("异常:" + e.getMessage());
System.out.println("zk2没有权限进行数据的获取");
countDownLatch.countDown();
}
}
@Override
public void process(WatchedEvent event) {
if (KeeperState.SyncConnected == event.getState()) {
if (event.getType() == EventType.None && null == event.getPath()) {
latch.countDown();
}
}
}
public static void main(String[] args) throws InterruptedException {
Zookeeper_Acl_Create acl_Create = new Zookeeper_Acl_Create();
acl_Create.syncInit();
countDownLatch.await();
}
}
运行结果如下:
zk3有权限进行数据的获取init 异常:KeeperErrorCode = NoAuth for /act zk2没有权限进行数据的获取
可以看到,路径"/act"我们使用digest模式添加了权限,zk3使用正确的用户名密码进行节点访问可以获取到节点数据,但是zk2使用了错误的权限,zk就会报错
例二:删除节点权限特殊说明
对于节点的删除,如果一个节点存在其子节点,需要注意的是,权限是不能被继承的.看下面的程序:
import java.util.concurrent.CountDownLatch;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
/**
* 对一个节点添加权限后,作用范围是其子节点,
*
* @author tanjie
*
*/
public final class Zookeeper_Acl_delete implements Watcher {
private static CountDownLatch latch = new CountDownLatch(1);
private static CountDownLatch countDownLatch = new CountDownLatch(1);
private static ZooKeeper zk = null;
private static ZooKeeper zk2 = null;
private static ZooKeeper zk3 = null;
private static ZooKeeper zk4 = null;
final static String PATH = "/acl-delete";
final static String PATH2 = "/acl-delete/child";
public static void syncInit() {
try {
zk = new ZooKeeper("host:2181", 5000,
new Zookeeper_Acl_delete());
latch.await();
zk.addAuthInfo("digest", "true".getBytes());
zk.create(PATH, "init".getBytes(), Ids.CREATOR_ALL_ACL,
CreateMode.PERSISTENT);
zk.create(PATH2, "init".getBytes(), Ids.CREATOR_ALL_ACL,
CreateMode.EPHEMERAL);
zk2 = new ZooKeeper("192.168.8.88:2181", 5000,
null);
try{
zk2.delete(PATH2, -1);
}catch(Exception e){
System.out.println("异常:" + e.getMessage());
}
zk3 = new ZooKeeper("host:2181", 5000,
null);
zk3.addAuthInfo("digest", "true".getBytes());
zk3.delete(PATH2, -1);
System.out.println("删除节点成功:" + PATH2);
zk4 = new ZooKeeper("host:2181", 5000,
null);
zk4.delete(PATH, -1);
System.out.println("删除节点成功:" + PATH);
countDownLatch.countDown();
} catch (Exception e) {
System.out.println("异常:" + e.getMessage());
}
}
@Override
public void process(WatchedEvent event) {
if (KeeperState.SyncConnected == event.getState()) {
if (event.getType() == EventType.None && null == event.getPath()) {
latch.countDown();
}
}
}
public static void main(String[] args) throws InterruptedException {
syncInit();
countDownLatch.await();
}
}
运行结果如下:
异常:KeeperErrorCode = NoAuth for /acl-delete/child 删除节点成功:/acl-delete/child 删除节点成功:/acl-delete
可以看到,第一次我们使用无权限的zk2去删除,显然会报错,第二次我们使用带权限的zk3去操作,子节点被删除成功,但是当我们使用zk4去执行删除操作的时候并没有指定任何权限,依然能够删除其父节点,说明zk在进行删除操作的时候,其权限的作用范围是其子节点。也就是说,当我们对一个节点添加了权限之后我们依然可以随意删除该节点但是对于这个节点的子节点,就必须拥有相应的权限才能删除。而且zk原生api不支持递归删除,即在存在子节点的情况下,不允许删除其父节点。
相关推荐
《Zookeeper实战详解》 Apache ZooKeeper是一款分布式协调服务,它是集群管理的基石,用于解决分布式环境中的命名、配置管理、分布式同步等问题。本篇将深入探讨Zookeeper的实战应用,包括安装配置、集群搭建以及...
2. **ACLs(Access Control Lists)**:Zookeeper提供了对Znode访问控制的支持,允许设置权限列表来控制节点的访问。ACL包括四种权限:读取(READ)、写入(WRITE)、创建(CREATE)、删除(DELETE)和管理(ADMIN)...
**深入探索Zookeeper:实战应用与高效策略** Zookeeper是一个分布式的、开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终将简单易用的...
- **权限管理**:显示并编辑节点的ACL(访问控制列表),控制对节点的访问权限。 - **集群监控**:显示服务器状态,包括连接状态、会话信息、内存和磁盘使用情况等。 - **事件日志**:记录客户端的操作日志,便于...
ACL用于实现对ZNode的访问控制,通过权限ID和策略组合实现细粒度的权限管理。Watcher是事件监听器,可以注册在ZNode上,当ZNode发生变化时,Watcher会被触发并通知客户端。会话是客户端与ZooKeeper服务器之间的一段...
2. 安全性增强:增加了更完善的权限控制和认证机制,保障了服务的安全性。 3. API稳定:这一版本的API已经相对成熟,开发者可以更加稳定地使用Zookeeper提供的接口进行开发。 4. 监控与诊断:提供了更丰富的监控指标...
Znode是Zookeeper数据存储的基本单元,具有版本号、ACL权限控制和临时/持久两种类型。会话是客户端与Zookeeper服务器之间的通信链接,会话期间可以发送请求并接收响应,同时支持超时和重新连接机制。Watcher是...
**Stat状态信息**:每个ZNode包含数据内容及状态信息,如版本号、权限信息等,可用于实现乐观锁机制。乐观锁通过版本号确保数据更新的原子性,防止并发冲突。 **Watcher**是Zookeeper提供的一种分布式事件通知机制...
6. **访问控制**:Zookeeper提供了细粒度的权限控制,即ACL(Access Control Lists)。每个Znode都有自己的ACL,用于控制哪些用户或角色可以进行读、写、删除等操作。 7. **可插拔的认证**:Zookeeper支持多种认证...
2. 数据模型:Zookeeper的数据模型是一个树形结构,每个节点称为ZNode,可以存储数据,也可以设置权限和Watcher。 3. ZAB协议:Zookeeper原子广播协议,用于保证分布式环境中数据的一致性。 五、Zookeeper部署与...
12. **安全机制**:Zookeeper支持ACL(Access Control List)权限控制,可以为不同的znode设置不同的访问权限,以保障数据的安全性。 通过深入学习上述内容,开发者不仅能掌握Zookeeper的基本原理,还能具备在实际...
4. Zookeeper的架构设计,包括服务器角色(Leader、Follower、Observer)、数据模型(Znode的类型、权限控制)和会话机制。 5. ZAB协议的工作流程,包括崩溃恢复和原子广播,以及如何保证分布式系统的一致性。 6. ...
10. **实战案例**:通过实际项目案例,如Hadoop、Kafka、Storm等大数据框架中Zookeeper的应用,来加深对Zookeeper理解,并提升解决实际问题的能力。 通过这个《Zookeeper学习视频》压缩包的学习,开发者不仅可以...
这个“springcloudalibaba微服务dubbo+sentinel+gateway+zookeeper+nacos的demo”压缩包文件,显然是一个实战示例,旨在帮助开发者理解并实践这些关键组件的集成与使用。下面将详细解析这些组件以及它们在微服务架构...
Zookeeper提供了细粒度的权限控制机制,可以通过设置ACL来管理节点的访问权限。ACL包括scheme、id和permission三个部分。客户端中通过`org.apache.zookeeper.data.ACL`类表示ACL,其中`ACL`类包含`Id`类和`perms`...
- ACL(Access Control Lists):允许对Znode设置访问权限,保障数据安全。 8. 实战应用: - 在Hadoop中,Zookeeper用于协调NameNode和DataNode,管理HDFS的元数据。 - 在Kafka中,Zookeeper负责管理Brokers的...
分布式实战涉及到的内容更广泛,包括分布式事务(Seata、TCC等)、分布式ID(Snowflake、UUID等)、分布式锁(Redis、Zookeeper等)、分布式日志追踪(Zipkin、Sleuth)等。这些技术的合理应用能够提高系统的稳定性...
etcd支持权限控制,可以设置用户、角色和权限,确保系统安全。 【etcd核心原理分析】 3.1 etcd概念词汇表 理解etcd的核心概念,如raft、MVCC、Lease等,有助于深入掌握其工作原理。 3.2 etcd读请求执行流程 读...
【标题】"baojun521-zookeeper-master_java_" 暗示了这是一个关于 ZooKeeper 的项目,由 Java 语言实现,并且可能是基于某个特定版本的 ZooKeeper(可能是 "baojun521" 版本),它可能是一个学习或者实战案例。...
"提权"(Privilege Escalation)是一种常见的技术,指的是攻击者在获取了系统或网络中的初步访问权限后,通过利用软件漏洞、配置错误或其他手段,进一步提升自己的权限,最终可能达到管理员(Admin)级别的控制。...