【漏洞修复】亲测有用,解决 ZooKeeper 未授权访问漏洞(附python客户端连接示例)
Zookeeper 权限控制 ACL/ Zookeeper 未授权访问漏洞修复/ kazoo python 授权连接 zk 服务/ kazoo.exceptions.NoAuthError 异常处理
问题描述
详细描述 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
在通常情况下,zookeeper允许未经授权的访问。
解决办法
为ZooKeeper配置相应的访问权限。
方式一:
1)增加一个认证用户
addauth digest 用户名:密码明文
eg. addauth digest user1:password1
2)设置权限
setAcl /path auth:用户名:密码明文:权限
eg. setAcl /test auth:user1:password1:cdrwa
3)查看Acl设置
getAcl /path
方式二:
setAcl /path digest:用户名:密码密文:权限
Zookeeper 权限控制 ACL
zookeeper 的 ACL(Access Control List,访问控制表)权限在生产环境是特别重要的,所以本章节特别介绍一下。
ACL 权限可以针对节点设置相关读写等权限,保障数据安全性。
permissions 可以指定不同的权限范围及角色。
ACL 命令行
- getAcl 命令:获取某个节点的 acl 权限信息。
- setAcl 命令:设置某个节点的 acl 权限信息。
- addauth 命令:输入认证授权信息,注册时输入明文密码,加密形式保存。
ACL 构成
zookeeper 的 acl 通过 [scheme🆔permissions] 来构成权限列表。
- 1、scheme:代表采用的某种权限机制,包括 world、auth、digest、ip、super 几种。
- 2、id:代表允许访问的用户。
- 3、permissions:权限组合字符串,由 cdrwa 组成,其中每个字母代表支持不同权限, 创建权限 create( c)、删除权限 delete( d)、读权限 read( r)、写权限 write( w)、管理权限admin( a)。
Zookeeper-3.5 授权配置实践
zk 服务端设置权限
# 运行一个 zookeeper 容器
docker run -d --name zookeeper_acl -p 2181:2181 -p 2888:2888 -p 3888:3888 -e --restart always zookeeper:3.5
# 进入 zookeeper 容器
docker exec -it zookeeper_acl bash
# 进入 zk 的 bin
cd bin
# 连接 zk 服务
./zkCli.sh -server 127.0.0.1:2181
# 命令行 分别执行 下面的操作
addauth digest user:password
setAcl / auth:user:password:cdrwa
# 查看Acl设置
getAcl /
python客户端配置用户
未配置用户尝试通过zkCli连接到zookeeper服务器时会提示 kazoo.exceptions.NoAuthError
from kazoo.client import KazooClient
import json
zk = KazooClient(
hosts="127.0.0.1:2181",
auth_data=[("digest", "lijian:miao170206")]
)
zk.start()
print(zk.get("/"))
# 创建根节点
zk.ensure_path('/test')
value = json.dumps({'host': "127.0.0.1", 'port': 8000})
# 创建服务子节点
zk.create(
path=f'/test/service',
value=value.encode(),
ephemeral=True,
sequence=True
)
servers = zk.get_children(path=f'/test')
print(servers)
更多推荐
所有评论(0)