Zookeeper ACL 权限控制

Zookeeper ACL 权限可以对指定的节点设置相关的操作权限,保障数据的安全性。

在 zkCli 中,ACL 权限的相关操作命令如下:

1
2
3
4
5
# 获取节点的ACL信息
getAcl /node

# 设置节点的ACL信息
setAcl /node schema:operator[可选]:permissions

认证模式(schema)

Zookeeper 提供了以下五种认证模式类型:

  • 无认证的开放权限(world)

  • IP白名单认证(ip)

  • 明文用户密码认证(auth)

  • 密文用户密码认证(digest)

  • 超级管理员认证(super)

如果设置了用户密码权限,使用 zkCli 连接上 Zookeeper 后可以使用 addauth 命令进行认证。

无认证开放权限:

默认情况下,Zookeeper 所有的节点均为开放权限,无需认证就可以操作。

1
2
3
4
5
6
7
8
# 将已设置权限的节点改为开放
setAcl /node world:anyone:cdrwa

# 不允许开放权限删除子节点
setAcl /node world:anyone:crwa

# 不允许开放权限的任何操作
setAcl /node world:anyone:

IP白名单:

设置指定IP的访问权限,多个IP之间可以用逗号分隔。

1
2
setAcl /node ip:10.230.5.150:cdrwa
setAcl /node ip:10.230.5.150:cdrw,ip:10.230.5.151:cdrwa

用户密码认证(auth):

auth方式为明文密码认证,需要先使用 addauth 命令添加认证用户。然后再使用 setAcl 命令设置权限。

1
2
3
4
5
# addauth digest [username]:[password]
addauth digest haha:123456
addauth digest admin:123456
# setAcl /node auth:[username]:[permissions]
setAcl /test auth:admin:cdrwa

需要注意的是,auth设置权限会将所有使用 addauth 认证的用户全部添加入权限。
如上命令使用 addauth 添加了 hahaadmin 两个认证用户,
然后使用 setAcl 为节点添加 admin 用户的权限, 使用 getAcl 查询节点的 ACL 权限会发现该节点设置了 hahaadmin 用户两个用户的权限。

1
2
3
4
5
getAcl /test
'digest,'haha:3RTWRMbFGscZqJBONcrAlMYMrv0=
: cdrwa
'digest,'admin:B7K2jHME3iDni4HdYDSnqUnH2DM=
: cdrwa

用户密码认证(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
2
# setAcl /node digest:[username]:[base64(sha1(password))]:[permissions]
setAcl /node digest:admin:0uek/hZ/V9fgiM35b0Z2226acMQ=:cdrwa

摘要密码设置权限与明文密码设置权限有所差异,不需要先使用 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,可能会导致注册中心不可用,在生产环境中要谨慎操作,尤其是清空重置数据。

  1. 配置文件 zoo.cfg ,增加如下跳过 ACL 认证的配置,重启 Zookeeper 后重新设置权限。
1
skipACL=yes
  1. 清空 Zookeeper 数据或重置 Zookeeper。删除配置文件中 dataDir 指定的目录下的文件,该路径下存储了 Zookeeper 的数据。

  2. 使用 super 超级管理员重新设置权限。