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目前支持create,delete,read,write,admin五种权限,且ZooKeeper对权限的控制是znode级别的,而且不继承,即对父znode设置权限,其子znode不继承父znode的权限。ZooKeeper中znode的默认权限为world:anyone:cdrwa,即任何用户都有所有权限。
ACL有三部分:
第一部分是认证类型,如world指所有认证类型,sasl是kerberos认证类型;
第二部分是账号,如anyone指的是任何人;
第三部分是权限,如cdrwa指的是拥有所有权限。
特别的,由于普通模式启动客户端不需要认证,sasl认证类型的ACL在普通模式下将不能使用。本文所有涉及sasl方式的鉴权操作均是在安全集群中进行。
权限说明 |
权限简称 |
权限详情 |
---|---|---|
创建权限 |
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客户端
- 以root用户登录安装了ZooKeeper客户端的服务器。
- 进入客户端安装目录。
cd /opt/client
- 执行以下命令配置环境变量。
source bigdata_env
- 执行以下命令认证用户身份,并输入用户密码(任意有权限的用户,这里以userA为例,普通模式不涉及)。
kinit userA
- 在ZooKeeper客户端执行以下命令,进入ZooKeeper命令行。
sh zkCli.sh -server ZooKeeper任意实例所在节点业务平面IP:clientPort
默认的“clientPort”为“2181”
例如:sh zkCli.sh -server 192.168.0.151:2181
- 登录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信息
- 启动ZooKeeper客户端。
- 使用getAcl命令,可以查看znode。如下命令,可以查看到之前创建的名为test的znode的ACL权限。
getAcl /znode名称
[zk: 192.168.0.151:2181(CONNECTED) 2] getAcl /test 'world,'anyone : cdrwa
增加ZooKeeper znode ACL信息
- 启动ZooKeeper客户端。
- 查看旧的ACL信息,查看当前账号是否有权限修改该znode的ACL信息的权限(a权限),如果没有权限,需要kinit登录有权限的用户,并重新启动ZooKeeper客户端。
getAcl /znode名称
[zk: 192.168.0.151:2181(CONNECTED) 3] getAcl /test 'world,'anyone : cdrwa
- 使用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指的是拥有所有权限。
- setAcl后,可以使用getAcl命令查看增加权限是否成功:
getAcl /znode名称
[zk: 192.168.0.151:2181(CONNECTED) 4] getAcl /test 'world,'anyone : cdrwa 'sasl,'userA@<系统域名> : cdrwa
修改ZooKeeper znode ACL信息
- 启动ZooKeeper客户端。
- 查看旧的ACL信息,查看当前账号是否有权限修改该znode的ACL信息的权限(a权限),如果没有权限,需要kinit登录有权限的用户,并重新启动ZooKeeper客户端。
getAcl /znode名称
[zk: 192.168.0.151:2181(CONNECTED) 5] getAcl /test 'world,'anyone : cdrwa 'sasl,'userA@<系统域名> : cdrwa
- 使用setAcl命令修改权限。设置新权限命令如下:
setAcl /test sasl:用户名@<系统域名>:权限值
例如仅保留userA用户的所有权限,删除anyone用户的rw权限。
setAcl /test sasl:userA@HADOOP.COM:cdrwa
- setAcl后,可以使用getAcl命令查看修改权限是否成功:
getAcl /znode名称
[zk: 192.168.0.151:2181(CONNECTED) 6] getAcl /test 'sasl,'userA@<系统域名> : cdrwa
删除ZooKeeper znode ACL信息
- 启动ZooKeeper客户端。
- 查看旧的ACL信息,查看当前账号是否有权限修改该znode的ACL信息的权限(a权限),如果没有权限,需要kinit登录有权限的用户,并重新启动ZooKeeper客户端。
getAcl /znode名称
[zk: 192.168.0.151:2181(CONNECTED) 5] getAcl /test 'world,'anyone : rw 'sasl,'userA@<系统域名> : cdrwa
- 使用setAcl命令增加权限。设置新权限命令如下:
setAcl /test sasl:用户名@<系统域名>:权限值
例如,仅保留userA用户是所有权限,取消anyone用户的rw权限。
setAcl /test sasl:userA@HADOOP.COM:cdrwa
- setAcl后,可以使用getAcl命令查看修改权限是否成功
getAcl /znode名称
[zk: 192.168.0.151:2181(CONNECTED) 6] getAcl /test 'sasl,'userA@<系统域名> : cdrwa