ACL(access control lists)权限控制
- 针对节点可以设置相关读写等权限,目的为了保障数据安全性
- 权限permissions可以指定不同的权限范围以及角色(可以针对很多不同的角色去制造很多不同的组合,这些不同的组合其实也是类似)
ACL命令行
ACL命令行主要有三块
- getAcl:获取某个节点的acl权限信息
- setAcl:设置某个节点的acl权限信息
- addauth:输入认证授权信息,注册时输入明文密码(登录)但是在zk的系统里,密码是以加密的形式存在的(注册某一个用户,要把某一个用户的密码输入到系统里进行注册,然后在某一个时间的时候,用户需要针对某一个指定的节点去登录,那么用户就必须使用addauth去注册,如果不进行这样的注册,是无法进行登录的)
ACL的构成 一
- zk的acl通过[scheme?permissions]来构成权限列表
scheme:代表采用的某种权限机制(5种权限机制,有一种是不太认,可以说是4种)
id:代表允许访问的用户
permissions:权限组合字符串(指定的一些权限)
scheme和id是捆绑使用的
ACL的构成 二 - scheme
- world:world下只有一个id,既只有一个用户,也就是anyone,那么组合的写法是 world:anyone:[permissions]
- auth:代表认证登录,需要注册用户有权限就可以,形式为:auth:user:passwork:[permissions]
- digest:需要对密码加密才能访问,组合形式为:digest:username:BASE64(SHA1(password)):[permissions] (需要输入加密后的设置密码的字符串才可以访问,不然会抛出异常)
- auth与digest区别是,前者明文,后者密文,setAcl /path auth:lee:lee:cdrwa与setAcl /path digest:lee:BASE64(SHA1(lee)) cdrwa是等价的,在通过addauth digest lee:lee 后都能操作指定节点的权限,在真实的环境中,都是用加密的
- ip:当设置为ip指定的ip地址,此时限制ip进行访问,比如ip:192.168.1.12:[permissions]
- super:代表超级管理员,拥有所有的权限(这个一般是给运维人员用的,权限是最大的,这个需要修改相应的文档进行配置才可以,设置这个权限是很危险的,不可以随便给某个人开通这个权限)
ACL的构成 三 - permissions
权限字符串缩写 crdwa
- CREATE:创建子节点权限 (是crdwa中的c)
- READ:获取当前节点/子节点的权限(是crdwa中的r)
- WRITE:设置节点数据的权限(是crdwa中的w)
- DELETE:删除子节点的权限(是crdwa中的d)
- ADMIN:设置节点权限的权限(是crdwa中的a),当某个用户设置了此权限后,就可以拥有了设置该节点权限的权利
ACL命令行
ACL命令行 -第一种scheme - world
- world:anyone:cdrwa
world:anyone:cdrwa 默认权限是指:所有的用户拥有所有的权限操作
setAcl /test/abc world:anynoe:crwa 设置所有用户对/test/abc目录下的所有节点不能删除
setAcl /test/abc world:anyone:rwad 设置所有用户对该节点下不能创建子节点
可以组合crwda来分配不同的权限
acl命令行 - 第二种scheme - auth
- auth:user:pwd:cdrwa
digest: use:BASE64(SHA1(pwd)):cdrwa
addauth digest user:pwd
pwd密码auth可以使用明文,digest可以使用密文方式,平时项目中一般都是使用digest
'digest,'imoocUser:zOdpTsuaE/uRFQt8ZIBQXUAA7a8= 这里是用BASE64(SHA1(‘imoocPw’))加密后的字符串
: cdrwa
acl命令行 - 第三种scheme - digest
setAcl /names/test digest:imoocUser:zOdpTsuaE/uRFQt8ZIBQXUAA7a8=:cdra
acl命令行 - 第四种scheme - ip
ip:192.168.142.1:cdrwa
第三种scheme是用ip控制某个网段是否有权限访问某个目录节点,这种方式主要用来控制客户端对某个目录节点是否有权限
acl命令行 - 第五种scheme - super超级管理员
当某个节点使用ip或者用户名登录权限,如果没有使用ip客户端登录或者密码忘记了,登录不上,这个时候又需要更改节点信息,就可以使用super(超级权限),它可以操作任何权限的节点
- Super
- 修改zkServer.sh增加super管理员
- 重启zkServer.sh
修改zkServer.sh文件
进入zookeeper安装目录\bin目录下,输入命令: ** vi ./zkServer.sh**
演示思路:因为/name/ip的节点设置了只有使用ip客户端为192.168.142.1才可以访问,我们可以通过设置imoocUser用户为super超级管理员,就可以访问该ip节点。
没有设置之前不能访问该节点,如下:
进入zookeeper安装目录\bin目录下,输入命令: ** vi ./zkServer.sh**
根据源码信息,配置super管理员:
将zookeeper-3.4.11.jar包添加到项目中
根据superDigest上面的注释可以得知:需要在zkServer.sh文件里设置"zookeeper.DigestAuthenticationProvider.superDigest"这样的一个key,value是:“用户名:<base64encoded(SHA1(密码))>”,用户名后面是使用base64encoded(SHA1())加密后的字符串
"-Dzookeeper.DigestAuthenticationProvider.superDigest=imoocUser:zOdpTsuaE/uRFQt8ZIBQX
UAA7a8=" 添加好后,按Esc键,输入 :wq 退出保存,重启zkServer.sh,重启命令:zkServer.sh restart
注意: 前面有一个-D,如果没有加,有可能报以下错误:
设置好super后,按Esc进入命令模式,输入:wq保存退出,重启zkServer.sh,再次访问/names/ip,因为没有登录,没有权限访问
再次登录,可以访问该节点
ACL的常用使用场景
ACL是权限管理,根据不同的权限分配给不同的人,用权限字符串可以组合成不同的权限,例如使用场景如下:
- 开发/测试环境分离,开发者无权操作测试库的节点,只能看
在zookeeper里有命名空间的说法,例如:测试环境只能连到测试节点,开发环境连的是另外的一个节点,还有一个是生产环境节点,可以设置一到两个用户可以访问生产环境节点,但用户的权限不建议设置成super超级管理员权限。一般运维人员设置成super超级管理员 - 生产环境上控制指定ip的服务可以访问相关节点,防止混乱
这种方式有好有坏,好处是:非常有序,防止混乱;缺点是:如果集群里的ip为动态IP,一旦IP改变,就需要频繁的修改IP的配置