ACL访问控制列表
Zookeeper作为一个分布式协调框架,其内部存储的都是一些关于分布式系统运行时状态的元数据,尤其是涉及到一些分布式锁,Master
选举和协调等应用场景,这就需要保障ZooKeeper的节点数据安全。因此ZooKeeper使用ACL
来控制节点的访问。
ACL
实现与UNIX
文件访问权限非常相似:它使用权限位来允许/禁止针对节点的各种操作及范围。与标准UNIX
权限不同,ZooKeeper节点不受user
,group
和world
的三个标准范围的限制。 ZooKeeper没有节点所有者的概念。相反,节点ACL
指定一组ID
集合及这些ID
的权限。
另外请注意, ACL
不是递归的,仅适用于特定的节点,它不适用于该节点的子节点。例如,如果/app
只能通过ip:172.16.16.1
读取,那么其他ip
不能读取该节点数据,但是/app/status
节点权限为world
(任意用户可读的),那么任何用户都可以读取/app/status
,不能读取/app
(除ip:172.16.16.1
以外)。
ZooKeeper支持可插拔身份验证方案。ID
通常表示为scheme:id
,其中scheme
表示id
的认证方式,id
表示用户。例如,host:host1.corp.com
是名为host1.corp.com
的主机的ID
。
当客户端连接到ZooKeeper并对其自身进行身份验证时,ZooKeeper会与客户端对应的所有ID
与客户端连接相关联。当客户端尝试访问节点时,将根据节点的ACL
检查这些ID
。 ACL
由(scheme:expression,perms
)对组成。每种scheme
拥有特定的expression
格式。例如,ACL
对(ip:19.22.0.0/16
,READ
)表示为任何IP
地址以19.22
开头的客户端提供READ
权限。
ACL权限
ZooKeeper支持以下权限:
CREATE
:创建子节点。
READ
:获取数据并列出其子节点。
WRITE
:设置数据。
DELETE
:删除子节点。
ADMIN
:设置权限。
总体来说,ZooKeeper的节点有5
种操作权限就是增、删、改、查、管理权限,这5
种权限简写为crwda
(即:每个单词的首字符缩写)。
注:这5
种权限中,delete
是指对子节点的删除权限,其它4
种权限指对自身节点的操作权限。
身份认证方式
身份认证有以下4
种方式:
world
:默认方式,相当于每个用户都能访问(cli
中以world:anyone:cdrwa
设置,其中权限可修改)。
auth
:代表已经认证通过的用户(cli
中可以通过addauth digest user:pwd
来添加当前上下文中的授权用户)。
digest
:即用户名:密码这种方式认证,这也是业务系统中最常用的(cli
中以digest:username:password:cdrwa
设置,其中权限可修改)。
ip
:使用Ip
地址认证(cli
中以ip:xxx.xxx.xxx.xxx:cdrwa
设置,其中权限可修改)。
权限设置
首先,需要添加认证,添加认证才可以进行节点权限的设置。这里我们以用户名、密码的方式为例。使用以下命令:
addauth digest user1:12345
创建具有ACL控制权限的节点。例如, 创建/auth
节点,数据是auth
, auth
认证方式(代表已经认证通过的用户),读写权限。使用以下命令:
create /auth "auth" auth::rw
使用getAcl
命令,可以查看当前节点控制权限。例如,查看/auth
节点控制权限,使用以下命令:
getAcl /auth
由于第一步中添加了认证,这里会显示该节点的权限是user1
的读
setAcl /auth auth::rwca
编程要求
本关任务是使用命令行,进行以下操作:
开启ZooKeeper服务器。
使用客户端(zkCli.sh
)连接客户端(IP:127.0.0.1
,端口号:2181
)。
- zkServer.sh start
- zkCli.sh -server 127.0.0.1:2181
-
-
添加digest
认证,用户名testZK
,密码testZK
。
addauth digest testZK:testZK
创建/zknode
持久节点(节点数据为ZK
),ACL
设置为用户testZK
的密码认证,用户testZK
对该节点拥有读,写,管理权限。
- create /zknode "ZK" digest:testZK:testZK:rwa
-
-
- getAcl /zknode
-
- setAcl /zknode zknode::rwca
断开客户端(zkCli.sh
)与客服端连接。
quit