文章目录
- 1. zk的鉴权设计
- 2. zk鉴权应用范围
- 3. zk鉴权的常用方法
- 4. 推荐配置
- 5. 参考文档
鉴权,分别由鉴和权组成
- 鉴: 表示身份认证,认证相关用户是否存在以及相关的用户名和密码是否一致
- 权: 完成身份的鉴后,还需要判断用户是否有相关操作的权限。
因此对于某一个用户来说,通常情况下,需要完成鉴和权才能够满足一个完整的业务场景,因此通常将鉴权放在一起考量。本文探讨zk的鉴权常用的鉴权方式以及相关鉴权设计方式。
1. zk的鉴权设计
鉴: 身份认证
身份的认证有4种方式:
- world:默认方式,相当于全世界都能访问
- auth:代表已经认证通过的用户(cli中可以通过addauth digest user:pwd 来添加当前上下文中的授权用户)
- digest:即用户名:密码这种方式认证,这也是业务系统中最常用的
- ip:使用Ip地址认证。
权: 操作权限
5种操作权限:
CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、删、改、查、管理权限,这5种权限简写为crwda(即:每个单词的首字符缩写)
注:这5种权限中,delete是指对子节点的删除权限,其它4种权限指对自身节点的操作权限。
2. zk鉴权应用范围
zk的数据模型,呈现树形,类似linux的文件目录系统。
zk的鉴权作用范围是针对节点,子节点没有影响,如针对/kafka设置了鉴权,但是/kafka的子目录(/kafka/brokers)无影响,除非针对子目录单独设置了鉴权。
3. zk鉴权的常用方法
给目录创建权限的操作如下
- 增加一个认证用户
addauth digest 用户名:密码明文
# 当前会话,进行身份认证
addauth digest user1:password1
- 设置权限
setAcl /path auth:用户名:密码明文:权限
setAcl /test auth:user1:password1:cdrwa
- 查看Acl设置
getAcl /path
getAcl /test
- 客户端登录后,不认证用户,无法查看
ls /path
ls /test
5. 客户端登录后,认证用户,可以根据权限进行相关操作
addauth digest 用户名:密码明文
# 当前会话,进行身份认证
addauth digest user1:password1
- 客户端重新登录后,查看子目录不影响
addauth digest 用户名:密码明文
ls /test
ls /test/test1
4. 推荐配置
为了方便管理,业务方会根据需要进行鉴权设置,但是由于一些监控指标等需要,因此通常需要设置一个管理员权限,能够便于运维和监控的需求。相关的设置方法如下。
- 设置需要配置的用户名和密码,本文以super:super123为例
# 设置zk的classpath,相关路径根据实际情况调整
export ZK_CLASSPATH=/usr/local/apache-zookeeper-3.6.4-bin/conf/:/usr/local/apache-zookeeper-3.6.4-bin/lib/*
# 获取用户名和加密密码
java -cp $ZK_CLASSPATH org.apache.zookeeper.server.auth.DigestAuthenticationProvider super:super123
# 获取
super:super123->super:UdxDQl4f9v5oITwcAsO9bmWgHSI=
2. 配置超级用户和密码
vim zoo.cfg
# 配置
DigestAuthenticationProvider.superDigest=super:UdxDQl4f9v5oITwcAsO9bmWgHSI=
- 重启zk集群
./zkServer.sh restart
- 登录zk集群并认证super用户
# 当前会话进行认证
addauth digest super:super123
# 查看目录,验证是否有权限
ls /test
5. 至此超级用户权限添加完成,使用的账号和密码可以根据情况进行调整
5. 参考文档
- Zookeeper - Super User Authentication and Authorization
- ZooKeeper Administrator’s Guide