
# 配置ZooKeeper ZNode ACL
#### 操作场景
该操作指导用户对ZooKeeper的znode设置权限。
ZooKeeper通过访问控制列表（ACL）来对znode进行访问控制。ZooKeeper客户端为znode指定ACL，ZooKeeper服务器根据ACL列表判定某个请求znode的客户端是否有对应操作的权限。ACL设置涉及如下四个方面。
- 查看ZooKeeper中znode的ACL。
- 增加ZooKeeper中znode的ACL。
- 修改ZooKeeper中znode的ACL。
- 删除ZooKeeper中znode的ACL。 ZooKeeper的ACL权限说明：
  ZooKeeper目前支持create，delete，read，write，admin五种权限，且ZooKeeper对权限的控制是znode级别的，而且不继承，即对父znode设置权限，其子znode不继承父znode的权限。ZooKeeper中znode的默认权限为**world:anyone:cdrwa**，即任何用户都有所有权限。
  
![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
ACL有三部分：
第一部分是认证类型，如world指所有认证类型，sasl是kerberos认证类型；
第二部分是账号，如anyone指的是任何人；
第三部分是权限，如cdrwa指的是拥有所有权限。
特别的，由于普通模式启动客户端不需要认证，sasl认证类型的ACL在普通模式下将不能使用。本文所有涉及sasl方式的鉴权操作均是在安全集群中进行。
表1Zookeeper的五种ACL 
| 权限说明 | 权限简称      | 权限详情                               |
|:---|:---|:---|
| 创建权限 | create(c) | 可以在当前znode下创建子znode                |
| 删除权限 | delete(d) | 删除当前的znode                         |
| 读权限  | read(r)   | 获取当前znode的数据，可以列出当前znode所有的子znodes |
| 写权限  | write(w)  | 向当前znode写数据，写入子znode               |
| 管理权限 | admin(a)  | 设置当前znode的权限                       |
   
#### 对系统的影响
![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/notice_3.0-zh-cn.png)
修改ZooKeeper的ACL是高危操作。修改ZooKeeper中znode的权限，可能会导致其他用户无权限访问该znode，导致系统功能异常。另外在3.5.6及以后版本，用户对于getAcl操作需要有读权限。
#### 前提条件
- 已安装ZooKeeper客户端。例如安装目录为"/opt/client"。
- 已获取MRS集群管理员用户和密码。
 
#### 操作步骤
**启动ZooKeeper客户端**
1. 以**root**用户登录安装了ZooKeeper客户端的服务器。
2. 进入客户端安装目录。 
   **cd /opt/client**
   
   
3. 执行以下命令配置环境变量。 
   **source bigdata_env**
   
   
4. 执行以下命令认证用户身份，并输入用户密码（任意有权限的用户，这里以userA为例，普通模式不涉及）。 
   **kinit userA**
   
   
5. 在ZooKeeper客户端执行以下命令，进入ZooKeeper命令行。 
   **sh zkCli.sh -server** *ZooKeeper* *任意实例所在节点业务平面IP* :*clientPort*
   默认的"clientPort"为"2181"
   例如：**sh zkCli.sh -server 192.168.0.151:** **2181**
   
   
6. 登录ZooKeeper客户端后，使用**ls** 命令，可以查看ZooKeeper中的znode列表。例如，可以查看根目录znode列表。
   
   **ls /**
   ```
   [zk: 192.168.0.151:2181(CONNECTED) 1] ls /
   [hadoop-flag, hadoop-ha, test, test2, test3, test4, test5, test6, zookeeper]
   ```
   
   
**查看ZooKeeper znode ACL信息**
7. 启动ZooKeeper客户端。
8. 使用**getAcl** 命令，可以查看znode。如下命令，可以查看到之前创建的名为test的znode的ACL权限。
   
   **getAcl** /*znode名称*
   ```
   [zk: 192.168.0.151:2181(CONNECTED) 2] getAcl /test
   'world,'anyone
   : cdrwa
   ```
   
   
**增加ZooKeeper znode ACL信息**
9. 启动ZooKeeper客户端。
10. 查看旧的ACL信息，查看当前账号是否有权限修改该znode的ACL信息的权限（a权限），如果没有权限，需要kinit登录有权限的用户，并重新启动ZooKeeper客户端。 
    **getAcl** */znode名称*
    ```
    [zk: 192.168.0.151:2181(CONNECTED) 3] getAcl /test
    'world,'anyone
    : cdrwa
    ```
    
    
11. 使用**setAcl** 命令增加权限。设置新权限命令如下：
    
    **s** **etAcl /test world:anyone:cdrwa,sasl:** *用户名@*\<系统域名\>** :*权限值*
    例如对test的znode，需要增加userA用户的权限：
    **setAcl /test world:anyone:cdrwa,sasl:userA@HADOOP.COM:cdrwa**
    ![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
    增加权限时，需要保留已有权限。新增加权限和旧的权限用英文逗号隔开，新增加权限有三个部分：
    - 第一部分是认证类型，如sasl指使用kerberos认证；
    
    - 第二部分是账号，如userA@HADOOP.COM指的是userA用户；
    
    - 第三部分是权限，如cdrwa指的是拥有所有权限。
     
    
    
12. setAcl后，可以使用**getAcl** 命令查看增加权限是否成功：
    
    **getAcl** */znode名称*
    ```
    [zk: 192.168.0.151:2181(CONNECTED) 4] getAcl /test 
    'world,'anyone
    : cdrwa
    'sasl,'userA@<系统域名>
    : cdrwa
    ```
    
    
**修改ZooKeeper znode ACL信息**
13. 启动ZooKeeper客户端。
14. 查看旧的ACL信息，查看当前账号是否有权限修改该znode的ACL信息的权限（a权限），如果没有权限，需要kinit登录有权限的用户，并重新启动ZooKeeper客户端。 
    **getAcl** */znode名称*
    ```
    [zk: 192.168.0.151:2181(CONNECTED) 5] getAcl /test 
    'world,'anyone
    : cdrwa
    'sasl,'userA@<系统域名>
    : cdrwa
    ```
    
    
15. 使用**setAcl** 命令修改权限。设置新权限命令如下：
    
    s**etAcl /test sasl:** *用户名* *@* *\<系统域名\>* :*权限值*
    例如仅保留userA用户的所有权限，删除anyone用户的rw权限。
    **setAcl /test sasl:userA@HADOOP.COM:cdrwa**
    
    
16. setAcl后，可以使用**getAcl** 命令查看修改权限是否成功：
    
    **getAcl** */znode名称*
    ```
    [zk: 192.168.0.151:2181(CONNECTED) 6] getAcl /test 
    'sasl,'userA@<系统域名>
    : cdrwa
    ```
    
    
**删除ZooKeeper znode ACL信息**
17. 启动ZooKeeper客户端。
18. 查看旧的ACL信息，查看当前账号是否有权限修改该znode的ACL信息的权限（a权限），如果没有权限，需要kinit登录有权限的用户，并重新启动ZooKeeper客户端。 
    **getAcl** */znode名称*
    ```
    [zk: 192.168.0.151:2181(CONNECTED) 5] getAcl /test 
    'world,'anyone
    : rw
    'sasl,'userA@<系统域名>
    : cdrwa
    ```
    
    
19. 使用**setAcl** 命令增加权限。设置新权限命令如下：
    
    s**etAcl /test sasl:** *用户名* *@* *\<系统域名\>* :*权限值*
    例如，仅保留userA用户是所有权限，取消anyone用户的rw权限。
    **setAcl /test sasl:userA@HADOOP.COM:cdrwa**
    
    
20. setAcl后，可以使用**getAcl** 命令查看修改权限是否成功
    
    **getAcl** */znode名称*
    ```
    [zk: 192.168.0.151:2181(CONNECTED) 6] getAcl /test
    'sasl,'userA@<系统域名>
    : cdrwa
    ```
    
    
 
