# 剖析zookeeper中间件的安全机制

> 作者/来源: UCloud 运营管理员
> 发布时间: 2023-01-11T05:19:00.000Z
> 分类: 解决方案
> 标签: 网络, 安全, 存储
> 原文链接: http://117.50.162.249:3000/yun/articles/1731

---

# 剖析zookeeper中间件的安全机制

> 来源: https://www.ucloud.cn/yun/129131.html
> 作者: IT那活儿
> 发布日期: 发布于2023-01-11 13:19

剖析zookeeper中间件的安全机制

**点击上方“IT那活儿****”公众号，关注后了解更多内容，不管IT什么活儿，干就完了！！！**

## **zookeeper简介**

zookeeper是一个基于paxos算法实现的高可用的的分布式数据管理与系统协调服务。

常用于数据发布和订阅、负载均衡、分布式协调、集群管理与Master选举、分布式锁、分布式队列等场景中，保证分布式应用场景中数据的强一致性。

## ****什么情况下使用zookeeper认证机制呢****

zookeeper作为分布式架构中的一个重要中间件，通常会在其上面以节点的方式存储数据，默认情况下，所有应用都可以在zk读写任何节点，在复杂且对数据敏感性的应用中，这显然不安全，所以此时我们可以对zk做一些安全策略设置，可以使用以下几种手段。

- 修改zk 默认端口，使用其它端口服务；
- 限制访问来源地址；
- 添加访问控制；
- 不要将 zk 暴露在外网；
- 设置 zk 用户认证和 ACL。

## **如何使用zookeeper安全机制**

**1. 对zk做一些初始安全配置**

通常部署完zk服务后，我们可以做一些初始化安全加固配置。

**1.1** 修改zk的默认端口2181为其它服务端口，减少随意的网络端口扫描；只配置必要的参数项。

**1.2**其次限制访问zk的客户端访问源，通过配置主机防火墙策略，只允许指定的客户来源IP访问来zk的端口服务，其它网络连接一律拒绝。

```
Redhat/Centos 6/7：iptables -I INPUT 1 -p tcp -m iprange --src-range 135.50.xxx13-135.50.xxx.16 --dport 2181 -j ACCEPTiptables -I INPUT 2 -p tcp -s 135.10.xxx.155 --dport 2181 -j ACCEPTiptables -I INPUT 3 -p tcp -s 192.168.xxx.112 --dport 2181 -j ACCEPTiptables -I INPUT 4 -p tcp -s 192.168.xxx.113 --dport 2181 -j ACCEPTiptables -I INPUT 5 -p tcp -s 192.168.xxx.114 --dport 2181 -j ACCEPTiptables -I INPUT 6 -p tcp -s 127.0.0.1 --dport 2181 -j ACCEPTiptables -I INPUT 7 -p tcp --dport 2181 -j DROP
```

**1.3** 避免将zk服务端口暴露在外网，避免公网恶意的频繁连接。

**2. zk设置访问指定IP访问数据节点**

这种方式又称IP权限模式，设置指定的ip访问zk。

**2.1 登录zk**

```
zkCli.sh -server 192.168.XXX.112:2181
```

**2.2 查看权限**

```
[zk: 192.168.XXX.114:2181(CONNECTED) 0] getAcl /world,anyone #表示任何人都可以访问: cdrwa
```

**2.3 添加可访问IP**

**注意：**

添加本机的ip地址，以便进行修改，这里遇到一个坑：

**添加一个ip地址后会覆盖之前添加的ip地址，结果把我的本即的ip覆盖了**，修改可访问ip后我自己再次修改的时候无法修改认证失败！只能重装了。

```
[zk: 192.168.XXX.114:2181(CONNECTED) 1] setAcl / ip:192.168.XXX.112:cdrwa,ip:192.168.XXX.114:cdrwa,ip:192.168.XXX.115:cdrwa
```

**2.4 查看是否正常添加**

getAcl /

此时如果使用localhost登录zk，虽然未授权也可以连接，但是查看节点时会报错KeeperErrorCode = NoAuth for /，所以此时要从已添加的可访问IP才能正常的访问zk。

**3. 配置zk访问控制列表**

**3.1 zk ACL访问控制规则原理**

zk可以使用ACL访问控制列表来对节点的权限进行控制, 它与UNIX 文件访问权限非常相似，zk的节点类比文件，客户端可以删除节点、创建节点、修改节点：它使用权限位来允许/禁止对节点的各种操作以及这些位适用的范围。

ACL 指定一组 id 和与这些 id 关联的权限。acl权限控制使用scheme/id/permission来标志，**主要包括三个方面**：

- ·scheme     #权限模式
- ·id：       #权限对象
- ·permission   #权限类型

**zk ACL访问控制流程图：**

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129131/images/129131_000.png)

**zookeeper acl的特性：**

- zookeeper的权限控制是基于znode节点的，需要对每个节点设置权限。
- 每个znode支持设置多种权限控制方案和多个权限。
- 子节点不会继承父节点的权限。客户端无法访问某个节点，但是可以访问他的子节点。

**常用的授权acl规则的命令：**

|  |  |  |
| --- | --- | --- |
| **命令** | **用法** | **描述** |
| getAcl | getAcl path | 读取节点的ACL |
| setAcl | setAcl path acl | 设置节点的ACL |
| create | create path data acl | 创建节点时设置acl |
| addAuth | addAuth scheme auth | 添加认证用户，类似于登录操作 |

**3.2 使用zk ACL访问控制规则**

**1）world权限模式**

world权限模式只有一种设置模式。就是 setAcl world:anyone:[r][w][c][d][a]

其中id:为固定的anyone，表示任何用户。

示例：

设置所有人对节点具有读写删除及创建子节点的权限：

```
[zk: localhost:2181(CONNECTED) 1] setAcl /chg1 world:anyone:rwdc
```

**2）IP模式**

该模式使用的acl方式是 ip:192.168.XXX.12:[a][d][c][w][r]

示例：

设置只有ip为192.168.XXX.112/114/115的客户端连接才能进行adc操作，其他ip啥操作都做不了。因为图中设置ACL的客户端不是这个ip，所以设置了后，他就失去对该节点的权限了，所以getAcl命令会没有权限。

```
[zk: localhost:2181(CONNECTED) 0] setAcl / ip:192.168.XXX.112:cdrwa,ip:192.168.XXX.114:cdrwa,ip:192.168.XXX.115:cdrwa
```

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129131/images/129131_001.png)

设置以后尝试读取/node1节点将是没有权限 Authentication is not valid，需使用192.168.XXX.112/114/115登录查看。

```
[root@master2 ~]# zkCli.sh  -server 192.168.XXX.112:2181
```

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129131/images/129131_002.png)

**3）设置auth方式的身份认证机制**

- 增加一个授权认证用户

```
[zk: 192.168.XXX.112:2181(CONNECTED) 11] addauth digest chg2:123456
```

- 设置权限

```
[zk: 192.168.XXX.112:2181(CONNECTED) 11] setAcl /chg2 auth:chg2:cdrwa
```

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129131/images/129131_003.png)

kEX71…是账号chg2 和密码123456 经过sha1和base64加密后的密文密码。

把客户端quit退出重新连接后：

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129131/images/129131_004.png)

失去了对该节点的权限。需要使用addauth命令添加授权才行。类似登录之后才能对该节点有权限。

```
[zk: 192.168.XXX.112:2181(CONNECTED) 0] addauth digest chg2:123456
```

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129131/images/129131_005.png)

**总 结**

生产环境中为zk配置安全策略可有效的保证数据的安全性，为指定的节点指定访问访问IP以及配置身份验证机制可防止误删数据的可能性，保障某些敏感数据的私密性，但是需要客户端程序更改代码，增加开发的复杂度。

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129131/images/129131_006.png)

## 本文作者：陈洪刚(上海新炬中北团队）

## 本文来源：“IT那活儿”公众号

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129131/images/129131_007.png)