更新时间:2024-05-11 GMT+08:00

ZooKeeper权限设置指南

操作场景

该操作指导用户对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,即任何用户都有所有权限。

ACL有三部分:

第一部分是认证类型,如world指所有认证类型,sasl是kerberos认证类型;

第二部分是帐号,如anyone指的是任何人;

第三部分是权限,如cdrwa指的是拥有所有权限。

特别的,由于普通模式启动客户端不需要认证,sasl认证类型的ACL在普通模式下将不能使用。本文所有涉及sasl方式的鉴权操作均是在安全集群中进行。

表1 Zookeeper的五种ACL

权限说明

权限简称

权限详情

创建权限

create(c)

可以在当前znode下创建子znode

删除权限

delete(d)

删除当前的znode

读权限

read(r)

获取当前znode的数据,可以列出当前znode所有的子znodes

写权限

write(w)

向当前znode写数据,写入子znode

管理权限

admin(a)

设置当前znode的权限

对系统的影响

修改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信息

  1. 启动ZooKeeper客户端。
  2. 使用getAcl命令,可以查看znode。如下命令,可以查看到之前创建的名为test的znode的ACL权限。

    getAcl /znode名称

    [zk: 192.168.0.151:2181(CONNECTED) 2] getAcl /test
    'world,'anyone
    : cdrwa

增加ZooKeeper znode ACL信息

  1. 启动ZooKeeper客户端。
  2. 查看旧的ACL信息,查看当前帐号是否有权限修改该znode的ACL信息的权限(a权限),如果没有权限,需要kinit登录有权限的用户,并重新启动ZooKeeper客户端。

    getAcl /znode名称
     [zk: 192.168.0.151:2181(CONNECTED) 3] getAcl /test
    'world,'anyone
    : cdrwa

  3. 使用setAcl命令增加权限。设置新权限命令如下:

    setAcl /test world:anyone:cdrwa,sasl:用户名@<系统域名>:权限值

    例如对test的znode,需要增加userA用户的权限:

    setAcl /test world:anyone:cdrwa,sasl:userA@HADOOP.COM:cdrwa

    增加权限时,需要保留已有权限。新增加权限和旧的权限用英文逗号隔开,新增加权限有三个部分:

    • 第一部分是认证类型,如sasl指使用kerberos认证;
    • 第二部分是帐号,如userA@HADOOP.COM指的是userA用户;
    • 第三部分是权限,如cdrwa指的是拥有所有权限。

  4. setAcl后,可以使用getAcl命令查看增加权限是否成功:

    getAcl /znode名称

    [zk: 192.168.0.151:2181(CONNECTED) 4] getAcl /test 
    'world,'anyone
    : cdrwa
    'sasl,'userA@<系统域名>
    : cdrwa

修改ZooKeeper znode ACL信息

  1. 启动ZooKeeper客户端。
  2. 查看旧的ACL信息,查看当前帐号是否有权限修改该znode的ACL信息的权限(a权限),如果没有权限,需要kinit登录有权限的用户,并重新启动ZooKeeper客户端。

    getAcl /znode名称

    [zk: 192.168.0.151:2181(CONNECTED) 5] getAcl /test 
    'world,'anyone
    : cdrwa
    'sasl,'userA@<系统域名>
    : cdrwa

  3. 使用setAcl命令修改权限。设置新权限命令如下:

    setAcl /test sasl:用户名@<系统域名>:权限值

    例如仅保留userA用户的所有权限,删除anyone用户的rw权限。

    setAcl /test sasl:userA@HADOOP.COM:cdrwa

  4. setAcl后,可以使用getAcl命令查看修改权限是否成功:

    getAcl /znode名称

    [zk: 192.168.0.151:2181(CONNECTED) 6] getAcl /test 
    'sasl,'userA@<系统域名>
    : cdrwa

删除ZooKeeper znode ACL信息

  1. 启动ZooKeeper客户端。
  2. 查看旧的ACL信息,查看当前帐号是否有权限修改该znode的ACL信息的权限(a权限),如果没有权限,需要kinit登录有权限的用户,并重新启动ZooKeeper客户端。

    getAcl /znode名称

    [zk: 192.168.0.151:2181(CONNECTED) 5] getAcl /test 
    'world,'anyone
    : rw
    'sasl,'userA@<系统域名>
    : cdrwa

  3. 使用setAcl命令增加权限。设置新权限命令如下:

    setAcl /test sasl:用户名@<系统域名>:权限值

    例如,仅保留userA用户是所有权限,取消anyone用户的rw权限。

    setAcl /test sasl:userA@HADOOP.COM:cdrwa

  4. setAcl后,可以使用getAcl命令查看修改权限是否成功

    getAcl /znode名称

    [zk: 192.168.0.151:2181(CONNECTED) 6] getAcl /test
    'sasl,'userA@<系统域名>
    : cdrwa