# 分布式服务管理框架-Zookeeper节点ACL

> 来源：梦飞idc云平台 | 原文：https://www.mfisp.com/12124.html | 发布：2022-11-03 | 更新：2022-11-03 | 分类：建站教程、投稿分享

概述  
ACL全称为Access Control List（访问控制列表），用于控制资源的访问权限。zk利用ACL策略控制节点的访问权限，如节点数据读写、节点创建、节点删除、读取子节点列表、设置节点权限等。

 

在传统的文件系统中，ACL分为两个维度，一个是属组，一个是权限，一个属组包含多个权限，一个文件或目录拥有某个组的权限即拥有了组里的所有权限，文件或子目录默认会继承自父目录的ACL。而在Zookeeper中，znode的ACL是没有继承关系的，每个znode的权限都是独立控制的，只有客户端满足znode设置的权限要求时，才能完成相应的操作。Zookeeper的ACL，分为三个维度：scheme、id、permission，通常表示为：scheme:id:permission，schema代表授权策略，id代表用户，permission代表权限。下面从这三个维度分别来介绍。

 

一、scheme  
scheme即采取的授权策略，每种授权策略对应不同的权限校验方式。下面是zk常用的几种scheme：

 

1> digest  
语法：digest:username:BASE64(SHA1(password)):cdrwa  
digest：是授权方式  
username:BASE64(SHA1(password))：是id部分  
cdrwa：权限部份  
用户名+密码授权访问方式，也是常用的一种授权策略。id部份是用户名和密码做sha1加密再做BASE64加密后的组合，比如设置一个节点的用户名为yangxin，密码为123456，则表示方式为：yangxin:BASE64(SHA1(123456)) ⇒ yangxin:ACFm5rWnnKn9K9RN/Oc8qEYGYDs=。密码加密需要用到zk的一个工具类来生成，如下所示：

 

shell> java -Djava.ext.dirs=/usr/local/zookeeper/lib -cp /usr/local/zookeeper/zookeeper-3.4.9.jar org.apache.zookeeper.server.auth.DigestAuthenticationProvider yangxin:123456

 

yangxin:123456->yangxin:ACFm5rWnnKn9K9RN/Oc8qEYGYDs=

 

**下面是演示创建节点，并添加授权信息操作节点的示例：**

  

## 创建节点/node_05  
shell> create /node_05 data  
Created /node_05  
## 设置权限  
shell> setAcl /node_05 digest:yangxin:ACFm5rWnnKn9K9RN/Oc8qEYGYDs=:cdrwa  
cZxid = 0x8e  
ctime = Mon Nov 14 21:38:52 CST 2016  
mZxid = 0x8e  
mtime = Mon Nov 14 21:38:52 CST 2016  
pZxid = 0x8e  
cversion = 0  
dataVersion = 0  
aclVersion = 1  
ephemeralOwner = 0x0  
dataLength = 3  
numChildren = 0  
## 获取节点刚刚设置的权限  
shell> getAcl /node_05  
'digest,'yangxin:ACFm5rWnnKn9K9RN/Oc8qEYGYDs=  
: cdrwa

 

## 没有授权，创建节点失败  
shell> create /node_05/node_05_01 data  
Authentication is not valid : /node_05/node_05_01

 

## 添加授权信息  
shell> addauth digest yangxin:123456

 

## 添加授权信息后，就可以正常操作了  
shell> create /node_05/node_05_01 data  
Created /node_05/node_05_01

 

## 2> ip

 

基于客户端IP地址校验，限制只允许指定的客户端能操作znode。  
比如，设置某个节点只允许IP为`192.168.1.100`的客户端能读写该写节点的数据：`ip:192.168.1.100:rw`

 

shell> setAcl /node_08 ip:192.168.1.100:rw

 

## 3> world

 

语法：`world:anyone:cdrwa`  
创建节点默认的scheme，所有人都可以访问。如下所示：

 

shell> create /node_06 data  
Created /node_06  
shell> getAcl /node_06  
'world,'anyone  
: cdrwa

 

上面主要介绍了平时常用的三种scheme，除此之外，还有host、super、auth授权策略。

 

二、id  
id是验证模式，不同的scheme，id的值也不一样。scheme为digest时，id的值为：username:BASE64(SHA1(password))，scheme为ip时，id的值为客户端的ip地址。scheme为world时，id的值为anyone。

 

三、permission  
在介绍scheme的时候，提到了acl的权限，如：digest:username:BASE64(SHA1(password)):cdrwa中的cdrwa即是permission。  
1> CREATE(r)：创建子节点的权限  
2> DELETE(d)：删除节点的权限  
3> READ(r)：读取节点数据的权限  
4> WRITE(w)：修改节点数据的权限  
5> ADMIN(a)：设置子节点权限的权限

 

## 创建/node_8节点，acl为cd（只能创建和删除子节点）  
shell> create /node_08 data digest:yangxin:ACFm5rWnnKn9K9RN/Oc8qEYGYDs=:cd  
Created /node_08

 

## 没有WRITE的权限，修改/node_8节点的数据失败  
shell> set /node_8 update_data  
Authentication is not valid : /node_08

 

## 没有READ的权限，读取子节点数据及查询子节点列表失败  
shell> get /node_8  
Authentication is not valid : /node_08   
shell> ls /node_8  
Authentication is not valid : /node_08

 

## 没有ADMIN权限，设置节点权限失败  
shell> setAcl /node_08 ip:192.168.1.100:cdrwa  
Authentication is not valid : /node_08

 

## 具备WRITE权限，可以创建节点  
shell> create /node_08/node_08_01 abc  
Created /node_08/node_08_01

 

## 具备DELETE权限，可以删除子节点  
shell> delete /node_08/node_08_01

 

![分布式服务管理框架-Zookeeper节点ACL](https://www.mfisp.com/wp-content/uploads/2022/10/11323-Wc0EAu.jpg)

 

``

---
本页由 梦飞idc云平台（https://www.mfisp.com）提供。站点导航见 https://www.mfisp.com/llms.txt
