Zookeeper节点ACL权限设置(四)

本文详细介绍了ZooKeeper的ACL(访问控制列表)机制,包括scheme、id和permission三个核心概念,以及world、digest、auth和ip四种常见的授权策略。通过实际操作示例,展示了如何设置和使用不同类型的ACL。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址,转载请注明出处: https://blog.csdn.net/qq_34021712/article/details/82871976     ©王赛超 

官网地址
http://zookeeper.apache.org/doc/current/zookeeperProgrammers.html#sc_ZooKeeperAccessControl

概述

ACL全称为Access Control List(访问控制列表),用于控制资源的访问权限。ZooKeeper使用ACL来控制对其znode(ZooKeeper数据树的数据节点)的访问。ACL实现与UNIX文件访问权限非常相似:它使用权限位来允许/禁止针对节点的各种操作以及位应用的范围。与标准UNIX权限不同,ZooKeeper节点不受用户(文件所有者),组和world(其他)的三个标准范围的限制。
zk利用ACL策略控制节点的访问权限,如节点数据读写、节点创建、节点删除、读取子节点列表、设置节点权限等。
在传统的文件系统中,一个文件拥有某个组的权限即拥有了组里的所有权限,文件或子目录默认会继承自父目录的ACL。而在Zookeeper中,znode的ACL是没有继承关系的,每个znode的权限都是独立控制的,只有客户端满足znode设置的权限要求时,才能完成相应的操作。Zookeeper的ACL,分为三个维度:scheme、id、permission,通常表示为:scheme:id:permission,schema代表授权策略,id代表用户,permission代表权限。下面分别讲述一下这三个属性:

一、scheme

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

  • world:默认方式,相当于全世界都能访问
  • auth:不使用任何id,表示任何经过身份验证的用户。
  • digest:即用户名:密码这种方式认证,这也是业务系统中最常用的,使用username:password字符串生成MD5哈希,然后将其用作ACL的ID标识。通过以明文形式发送 例如:wangsaichao:123456 来完成身份验证。在ACL中使用时,表达式将是wangsaichao:G2RdrM8e0u0f1vNCj/TI99ebRMw=。
  • ip:使用Ip地址认证
1> world

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

## 创建新的节点 /node01
[zk: localhost:2181(CONNECTED) 10] create /node01 234
Created /node01
# 查看ACL
[zk: localhost:2181(CONNECTED) 11] getAcl /node01
'world,'anyone
: cdrwa
[zk: localhost:2181(CONNECTED) 12] 
2> digest

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

java -Djava.ext.dirs=/Users/wangsaichao/Desktop/zookeeper-3.4.6/lib -cp /Users/wangsaichao/Desktop/zookeeper-3.4.6/zookeeper-3.4.6.jar org.apache.zookeeper.server.auth.DigestAuthenticationProvider wangsaichao:123456
wangsaichao:123456->wangsaichao:G2RdrM8e0u0f1vNCj/TI99ebRMw=

本文的Zookeeper安装在:/Users/wangsaichao/Desktop/zookeeper-3.4.6

下面是演示创建节点,并添加授权信息操作节点的示例:
## 查看/根节点
[zk: localhost:2181(CONNECTED) 1] ls /
[zookeeper]
## 创建节点/node
[zk: localhost:2181(CONNECTED) 2] create /node 123
Created /node
## 设置权限
[zk: localhost:2181(CONNECTED) 3] setAcl /node digest:wangsaichao:G2RdrM8e0u0f1vNCj/TI99ebRMw=:cdrwa
cZxid = 0x2
ctime = Sun Sep 09 16:25:51 CST 2018
mZxid = 0x2
mtime = Sun Sep 09 16:25:51 CST 2018
pZxid = 0x2
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
## 获取节点刚刚设置的权限
[zk: localhost:2181(CONNECTED) 4] getAcl /node
'digest,'wangsaichao:G2RdrM8e0u0f1vNCj/TI99ebRMw=
: cdrwa
## 没有授权,创建子节点失败
[zk: localhost:2181(CONNECTED) 5] create /node/child_01 234
Authentication is not valid : /node/child_01
## 为当前session添加授权信息
[zk: localhost:2181(CONNECTED) 6] addauth digest wangsaichao:123456
## 添加授权信息后,创建子节点成功
[zk: localhost:2181(CONNECTED) 7] create /node/child_01 234        
Created /node/child_01
[zk: localhost:2181(CONNECTED) 8] 
3> auth

scheme为auth时,不需要id。说的不需要id,但是还需要使用一个username:password的expression来表示这个权限,你也可以理解其实就是id,哈哈.

## 创建一个新的节点 /test_node1
[zk: localhost:2181(CONNECTED) 23] create  /test_node1 121
Created /test_node1
## 添加授权账号
[zk: localhost:2181(CONNECTED) 24] addauth digest zookeeper:zookeeper
## 然后设置节点的ACL
[zk: localhost:2181(CONNECTED) 25] setAcl /test_node1 auth:zookeeper:zookeeper:cdrwa
cZxid = 0x13
ctime = Sun Sep 09 17:46:26 CST 2018
mZxid = 0x13
mtime = Sun Sep 09 17:46:26 CST 2018
pZxid = 0x13
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
## 查看刚才设置的ACL
[zk: localhost:2181(CONNECTED) 26] getAcl /test_node1
'digest,'zookeeper:4lvlzsipXVaEhXMd+2qMrLc0at8=
: cdrwa
[zk: localhost:2181(CONNECTED) 27]
这里有一个坑,在使用auth授权时,一定要先执行addauth digest zookeeper:zookeeper然后再授权,否则将使用上一次的授权expression。下面举个例子。执行多次addauth digest 用户名:密码 操作,在新的节点设置auth时,将都会生效。具体例子如下:
## 创建一个新的节点 /test_node2
[zk: localhost:2181(CONNECTED) 27] create /test_node2 234
Created /test_node2
## 设置auth授权, 使用一个并不存在的 hello用户,依然成功了
[zk: localhost:2181(CONNECTED) 28] setAcl /test_node2 auth:hello:hello:cdrwa
cZxid = 0x15
ctime = Sun Sep 09 17:50:10 CST 2018
mZxid = 0x15
mtime = Sun Sep 09 17:50:10 CST 2018
pZxid = 0x15
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
## 查看ACL 竟然是之前的zookeeper用户
[zk: localhost:2181(CONNECTED) 29] getAcl /test_node2
'digest,'zookeeper:4lvlzsipXVaEhXMd+2qMrLc0at8=
: cdrwa
## 这个时候添加 hello 用户
[zk: localhost:2181(CONNECTED) 30] addauth digest hello:hello    
## 创建新的节点 /test_node3
[zk: localhost:2181(CONNECTED) 31] create /test_node3 456                   
Created /test_node3
## 查看ACL 这个时候还是world
[zk: localhost:2181(CONNECTED) 32] getAcl /test_node3
'world,'anyone
: cdrwa
## 设置auth ACL
[zk: localhost:2181(CONNECTED) 33] setAcl /test_node3 auth:hello:hello:cdrwa
cZxid = 0x17
ctime = Sun Sep 09 17:53:14 CST 2018
mZxid = 0x17
mtime = Sun Sep 09 17:53:14 CST 2018
pZxid = 0x17
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
## 查看ACL 发现之前的zookeeper用户也存在
[zk: localhost:2181(CONNECTED) 34] getAcl /test_node3
'digest,'zookeeper:4lvlzsipXVaEhXMd+2qMrLc0at8=
: cdrwa
'digest,'hello:uXpRvPoy9gsHHSCo8uMtZmaXPIA=
: cdrwa
[zk: localhost:2181(CONNECTED) 35] 
4> ip

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

## 给node节点添加新的ACL权限
[zk: localhost:2181(CONNECTED) 8] setAcl /node ip:127.0.0.1:cdrwa 
cZxid = 0x2
ctime = Sun Sep 09 16:25:51 CST 2018
mZxid = 0x2
mtime = Sun Sep 09 16:25:51 CST 2018
pZxid = 0x5
cversion = 1
dataVersion = 0
aclVersion = 2
ephemeralOwner = 0x0
dataLength = 3
numChildren = 1
## 查看ACL
[zk: localhost:2181(CONNECTED) 9] getAcl /node
'ip,'127.0.0.1
: cdrwa
[zk: localhost:2181(CONNECTED) 10] 

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

二、id

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

三、permission

znode可以拥有的权限还记得之前的授权语句,如:
digest:username:BASE64(SHA1(password)):cdrwa中的cdrwa即是permission。

  1. CREATE(r):创建子节点的权限
  2. DELETE(d):删除节点的权限
  3. READ(r):读取节点数据的权限
  4. WRITE(w):修改节点数据的权限
  5. ADMIN(a):设置子节点权限的权限
示例
## 先在当前session中添加 wangsaichao:123456 用户
[zk: localhost:2181(CONNECTED) 35] addauth digest wangsaichao:123456
## 创建一个新的节点,并添加digest ACL(只能创建和删除) 因为是digest 所以密码为加密之后的
[zk: localhost:2181(CONNECTED) 36] create /test_node5 123 digest:wangsaichao:G2RdrM8e0u0f1vNCj/TI99ebRMw=:cd
Created /test_node5
## 没有WRITE权限, 设置节点数据 失败
[zk: localhost:2181(CONNECTED) 37] set /test_node5 234
Authentication is not valid : /test_node5
## 没有ADMIN权限,设置ACL失败
[zk: localhost:2181(CONNECTED) 38] setAcl /test_node5 auth:wangsaichao:123456:cdrwa
Authentication is not valid : /test_node5
## 没有READ权限, 读取节点 失败
[zk: localhost:2181(CONNECTED) 39] get /test_node5 
Authentication is not valid : /test_node5
## 具备CREATE权限,创建子节点成功
[[zk: localhost:2181(CONNECTED) 40] create /test_node5/child_01 123
Created /test_node5/child_01
## 具备DELETE权限,可以删除子节点
[zk: localhost:2181(CONNECTED) 41] delete /test_node5/child_01
[zk: localhost:2181(CONNECTED) 42] 
<think>嗯,用户现在问的是Zookeeper节点ACL是什么。之前他们问过关于Windows端口查看进程的命令,看来用户可能是在处理分布式系统的问题,或者在搭建某个需要Zookeeper协调的服务,比如Kafka之类的。这时候突然问ACL,可能是遇到了权限管理的问题,或者是在配置Zookeeper时遇到了安全相关的挑战。 首先,我需要回忆ZookeeperACL机制。ACL是访问控制列表,用来控制节点的访问权限。每个节点都可以有自己的ACL,定义谁可以执行哪些操作。ZookeeperACL由三部分组成:权限模式(scheme)、授权对象(id)和权限(permissions)。比如,使用world认证模式时,授权对象是anyone,允许所有用户访问。而digest模式则是基于用户名和密码的认证。 接下来要考虑用户可能的背景。他们可能已经对Zookeeper有基本的了解,现在需要深入权限管理。或许他们在配置多节点集群时,遇到了未经授权的访问问题,或者需要限制某些客户端的操作权限。用户可能想知道如何设置ACL来保护他们的数据,防止未授权的修改或访问。 用户的真实需求可能不仅仅是了解ACL的概念,而是如何具体实施。比如,如何为节点设置ACL,或者如何修改现有节点权限。此外,用户可能对不同的权限模式(如ip、auth等)不太清楚,需要解释每种模式的应用场景。 需要确保回答覆盖ACL的组成、权限类型、常用模式,以及实际操作的例子。比如,使用命令行工具设置ACL,或者通过编程接口实现。同时,要提醒用户注意权限继承的问题,因为ZookeeperACL不具有继承性,每个节点都需要单独设置。 另外,用户可能遇到的问题包括ACL配置错误导致客户端无法访问,或者权限不足引发的异常。这时候需要指导他们如何检查和修正ACL设置,比如使用getAcl命令查看当前权限,或者使用addauth进行认证。 最后,要确保语言通俗易懂,避免过多专业术语,结合实际应用场景举例,帮助用户更好地理解和应用ACL机制。可能还需要提到最佳实践,比如避免使用world:anyone开放所有权限,以提升系统安全性。</think>在 ZooKeeper 中,**节点ACL(Access Control List,访问控制列表)** 是一种用于控制客户端对节点(ZNode)的访问权限的机制。通过 ACL,可以指定哪些用户或实体能够执行特定的操作(如读取、写入、删除等)。 --- ### **ACL 的组成** 每个 ACL 规则由以下三部分组成: 1. **权限模式(Scheme)** 定义权限的验证方式(例如 `world`、`auth`、`digest`、`ip` 等)。 2. **授权对象(ID)** 表示被授权的实体,具体含义取决于 Scheme。例如: - `world` 模式下,ID 固定为 `anyone`(所有用户)。 - `digest` 模式下,ID 是用户名和密码的哈希值(如 `user:password`)。 3. **权限(Permissions)** 定义允许的操作类型,包括: - `CREATE`:创建子节点。 - `READ`:读取节点数据及子节点列表。 - `WRITE`:修改节点数据。 - `DELETE`:删除子节点。 - `ADMIN`:修改 ACL 权限。 --- ### **常用权限模式(Scheme)** 1. **`world`** - 默认模式,允许所有客户端访问。 - 示例:`scheme:world, id:anyone, permissions:cdrwa`(所有权限)。 2. **`auth`** - 仅允许经过认证的客户端访问(客户端需通过 `addauth` 命令认证)。 - 示例:`scheme:auth, id:<any-user>, permissions:cdrwa`。 3. **`digest`** - 基于用户名和密码的认证(密码需经过 SHA1 哈希)。 - 示例:`scheme:digest, id:user:base64(sha1(password)), permissions:cdrwa`。 4. **`ip`** - 基于客户端 IP 地址限制访问。 - 示例:`scheme:ip, id:192.168.1.100, permissions:cdrwa`。 --- ### **ACL 操作示例** #### 1. 查看节点ACL ```bash # 查看 /my_node 的 ACL getAcl /my_node ``` #### 2. 设置节点ACL ```bash # 使用 digest 模式设置 ACL setAcl /my_node digest:user:base64(sha1(password)):cdrwa ``` #### 3. 客户端认证(针对 `auth` 或 `digest` 模式) ```bash # 在客户端连接后,添加认证信息 addauth digest user:password ``` --- ### **ACL 特性** 1. **无继承性** 父节点ACL 不会自动继承到子节点,需手动设置。 2. **临时节点限制** 临时节点(Ephemeral Node)不能设置 ACL。 3. **权限优先级** 多个 ACL 规则时,只要有一个规则允许操作,即可执行。 --- ### **最佳实践** - 避免使用 `world:anyone:cdrwa`(默认开放所有权限),尤其是在生产环境。 - 优先使用 `digest` 或 `auth` 模式进行用户认证。 - 结合 `ip` 模式限制访问来源,增强安全性。 通过合理配置 ACL,可以有效保护 ZooKeeper节点的数据安全。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值