Zookeeper ACL 权限可以对指定的节点设置相关的操作权限,保障数据的安全性。
在 zkCli 中,ACL 权限的相关操作命令如下:
1 | # 获取节点的ACL信息 |
认证模式(schema)
Zookeeper 提供了以下五种认证模式类型:
无认证的开放权限(world)
IP白名单认证(ip)
明文用户密码认证(auth)
密文用户密码认证(digest)
超级管理员认证(super)
如果设置了用户密码权限,使用 zkCli 连接上 Zookeeper 后可以使用 addauth
命令进行认证。
无认证开放权限:
默认情况下,Zookeeper 所有的节点均为开放权限,无需认证就可以操作。
1 | # 将已设置权限的节点改为开放 |
IP白名单:
设置指定IP的访问权限,多个IP之间可以用逗号分隔。
1 | setAcl /node ip:10.230.5.150:cdrwa |
用户密码认证(auth):
auth方式为明文密码认证,需要先使用 addauth
命令添加认证用户。然后再使用 setAcl
命令设置权限。
1 | # addauth digest [username]:[password] |
需要注意的是,auth设置权限会将所有使用 addauth
认证的用户全部添加入权限。
如上命令使用 addauth
添加了 haha
和 admin
两个认证用户,
然后使用 setAcl
为节点添加 admin
用户的权限, 使用 getAcl
查询节点的 ACL 权限会发现该节点设置了 haha
和 admin
用户两个用户的权限。
1 | getAcl /test |
用户密码认证(digest)
digest方式为摘要密码认证,设置权限时的密码需要经过SHA1消息摘要算法和base64编码处理,可借助 OpenSSL 获取处理后的密码。
1 | echo -n [username]:[password] | openssl dgst -binary -sha1 | openssl base64 |
例如需要为节点设置 username 为 admin ,password 为 123456 的用户的权限,通过 OpenSSL 获取到处理后的密码为 0uek/hZ/V9fgiM35b0Z2226acMQ=
1 | # setAcl /node digest:[username]:[base64(sha1(password))]:[permissions] |
摘要密码设置权限与明文密码设置权限有所差异,不需要先使用 addauth
命令添加认证用户,也不会将所有已认证的用户设置到节点权限中。
超级管理员认证(super)
超级管理员是特殊的认证模式,可以对 Zookeeper 上的所有节点进行任何操作。要使用此认证方式,需要在启动 Zookeeper 时附加JVM启动参数。
1 | ./zkServer.sh -Dzookeeper.DigestAuthenticationProvider.superDigest=[username]:[base64(SHA1(username:password))] |
其中摘要密码的获取方式与 digest 方式相同, 密码串s为 username:password
,处理后的密码串为 base64(SHA1(s))。
权限类型(permissions)
Zookeeper 提供了以下五种权限类型:
创建权限(c: create):可以在数据节点下创建子节点
删除权限(d: delete),可以删除该数据节点的子节点
读取权限(r: read),可以读取该节点的内容以及子节点的列表信息
更新权限(w: wirte),可以更新该数据节点
管理权限(a: admin),可以对该数据节点体进行 ACL 权限设置
其中,除了创建权限(c: create)、删除权限(d: delete)是指对子节点进行操作的权限,其他的均为对该节点的操作权限。
忘记密码
如果不慎忘记了认证密码,可以使用以下三种方式重新设置认证。重新设置的过程中可能需要重启 Zookeeper,可能会导致注册中心不可用,在生产环境中要谨慎操作,尤其是清空重置数据。
- 配置文件
zoo.cfg
,增加如下跳过 ACL 认证的配置,重启 Zookeeper 后重新设置权限。
1 | skipACL=yes |
清空 Zookeeper 数据或重置 Zookeeper。删除配置文件中 dataDir 指定的目录下的文件,该路径下存储了 Zookeeper 的数据。
使用 super 超级管理员重新设置权限。