问题描述

详细描述 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)

在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐