[转载] ACL(Access Control List)访问控制列表

zk做为分布式架构中的重要中间件,通常会在上面以节点的方式存储一些关键信息,默认情况下,所有应用都可以读写任何节点,在复杂的应用中,这不太安全,ZK通过ACL机制来解决访问权限问题,详见官网文档:http://zookeeper.apache.org/doc/r3.4.6/zookeeperProgrammers.html#sc_ZooKeeperAccessControl

总体来说,ZK的节点有5种操作权限:

CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、删、改、查、管理权限,这5种权限简写为crwda(即:每个单词的首字符缩写)

注:这5种权限中,delete是指对子节点的删除权限,其它4种权限指对自身节点的操作权限

身份的认证有4种方式:

world:默认方式,相当于全世界都能访问
auth:代表已经认证通过的用户(cli中可以通过addauth digest user:pwd 来添加当前上下文中的授权用户)
digest:即用户名:密码这种方式认证,这也是业务系统中最常用的
ip:使用Ip地址认证

Cli命令行下可以这样测试:

通过getAcl命令可以发现,刚创建的节点,默认是 world,anyone的认证方式,具有cdrwa所有权限

继续捣鼓:

先给/test增加了user1:+owfoSBn/am19roBPzR1/MfCblE的只读(r)权限控制,

说明:setAcl /test digest:用户名:密码:权限 给节点设置ACL访问权限时,密码必须是加密后的内容,这里的+owfoSBn/am19roBPzR1/MfCblE=,对应的原文是12345 (至于这个密文怎么得来的,后面会讲到,这里先不管这个),设置完Acl后,可以通过

getAcl /节点路径 查看Acl设置

然后get /test时,提示认证无效,说明访问控制起作用了,接下来:

addauth digest user1:12345 给"上下文"增加了一个认证用户,即对应刚才setAcl的设置

然后再 get /test 就能取到数据了

最后 delete /test 成功了!原因是:根节点/默认是world:anyone:crdwa(即:全世界都能随便折腾),所以也就是说任何人,都能对根节点/进行读、写、创建子节点、管理acl、以及删除子节点(再次映证了ACL中的delete权限应该理解为对子节点的delete权限)

刚才也提到了,setAcl /path digest这种方式,必须输入密码加密后的值,这在cli控制台上很不方便,所以下面这种方式更常用:

注意加框的部分,先用addauth digest user1:12345 增加一个认证用户,然后用 setAcl /test auth:user1:12345:r 设置权限,跟刚才的效果一样,但是密码这里输入的是明文,控制台模式下手动输入更方便。

好了,揭开加密规则:


1

2

3

4

5

6

7

static public String generateDigest(String idPassword)

        throws NoSuchAlgorithmException {

    String parts[] = idPassword.split(":"2);

    byte digest[] = MessageDigest.getInstance("SHA1").digest(

            idPassword.getBytes());

    return parts[0] + ":" + base64Encode(digest);

}

就是SHA1加密,然后base64编码  

代码使用:

zookeeper有一个很好用的客户端开源项目zkclient,官网地址为:http://github.com/zkclient ,其最新片0.7-dev已经支持ACL了(旧0.1版无此功能,所以推荐使用最新版),使用方法:

git clone https://github.com/sgroschupf/zkclient (把代码拉到本地)

修改

build.gradle 找到92行

+

把这一段干掉,否则编译时会出错

然后(windows环境,把./gradew 换成gradlew)

./gradlew test (测试)

./gradlew jars (编译生成jar包)

./gradlew install (安装到本机maven仓库)  

新建一个maven项目,pom.xml参考下面设置:

 

然后写一段代码测试一下:

+

输出结果:

test-data
节点创建成功!
---------------------
org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /test
org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /test
test-data
---------------------
org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /test
new-data
---------------------
[31,s{‘digest,‘admin-user:mAlW21Phn07yOvWnKJYq2sCMoZw=}
]
---------------------
节点删除成功!

从zkclient的使用结果看,与cli操作效果一样。  

最后:关于多级节点之间的ACL,并非继承关系,但是也有些一联系,这是初次接触ACL中比较难理解的地方:

从这张图上可以发现,子节点/a/b的控制权限范围(全世界都能做任何事)可以超出父节点的范围(仅限:user-a:pwd:a具有read/admin权限)

继续,看上面的这4条红线标注的地方,从上向下一个个解释:

红线1:因为/a只有user-a:pwd-a有ra权限,即:没用户具有c(create)权限,所以不能创建子节点

红线2:因为/a/b为world:anyone:cdrwa权限,即无限制,所以在/a/b下创建子节点b1,地球人已经无法阻止,创建成功

红线3:给/a/b/b1指定了user-b1:pwd-b1的da权限(即:delete+admin)

(注:重温下前面提到的setAcl 二种模式,

一种是setAcl /path digest:username:encrypedpwd:crwda 用这种方式时,encrypedpwd用户必须是密文,

另一种方式是先addauth digest:usrname:password 先把授权信息加入上下文,这里password用的是明文,然后再setAcl /pathauth:username:password:crdwa

所以如果在cli控制台测试,强烈建议用第二种方式,否则象上图中的方式用错了方式,pwd-b1在zk中被认为是密文,要解密出来几乎不可能,所以设置后,相当于这个节点就废了,因为你不知道密码,要操作该节点时,提供不了正确的认证信息)

红线4:还是刚才的理由,因为/a/b为world:anyone:cdrwa,没有限制,所以删除其下的子节点不受阻挡。

从上图可以看出,无法get父节点的内容,但是可以get子节点的内容,再次说明父、子节点的权限没直接关系,但是做delete时,上面的例子却遇到了麻烦:

想删除/a/b时,由于父节点/a的ACL列表里,只有ra权限,没有d权限,所以无法删除子节点。想删除/a时,发现下面还有子节点b,节点非空无法删除,所以这个示例就无解了(因为根据前面的操作,密码也还原不出来,也就无法修改ACL属性),而根节点/也无法删除,解决办法,只能到data目录里清空所有数据,再重启zk,但是这样就相当于所有数据全扔了,所以在设计ACL时,对于delete权限,要谨慎规划,在测试zk集群上做好测试,再转到生产环境操作。

最后给一些权限组合的测试结果:

要修改某个节点的ACL属性,必须具有read、admin二种权限

要删除某个节点下的子节点,必须具有对父节点的read权限,以及父节点的delete权限

参考文章:
https://ihong5.wordpress.com/2014/07/10/apache-zookeeper-acl-access-control-list-getting-permission-sets/

https://ihong5.wordpress.com/2014/07/24/apache-zookeeper-setting-acl-in-zookeeper-client/

https://ihong5.wordpress.com/2014/06/24/znode-types-and-how-to-create-read-delete-and-write-in-zookeeper-via-zkclient/

http://zookeeper.apache.org/doc/r3.4.6/zookeeperProgrammers.html#sc_ZooKeeperAccessControl

时间: 2024-10-13 03:20:45

[转载] ACL(Access Control List)访问控制列表的相关文章

Oracle ACL (Access Control List)详解

在Oracle11g中,Oracle在安全方面有了很多的改进,而在网络权限控制方面,也有一个新的概念提出来,叫做ACL(Access Control List), 这是一种细粒度的权限控制.在ACL之前,我们对于有一些程序包,例如UTL_MAIL, UTL_SMTP等这些包,你可以利用这些包连接到外部的主机,而默认情况下,这些包都是都是赋予了public角色,所以可能会导致利用这些PL/SQL程序包的恶意工具,所以Oracle提出了一个新的概念来解决这个问题,那就是ACL. 在开始展开ACL之前

ACL的三种访问控制列表的概述及实验配置

ACL的概述 在路由器上读取OSI七层模型的第三层及第四层包头的信息根据定义好的规则,对包进行过滤 ACL的工作原理 有两个方向出:已经过路由器的处理,正离开路由器接口的数据包入:已经到达路由器接口的数据包,将被路由器处理 列表应用到接口方向与数据方向有关 访问控制列表的类型 1 标准访问控制列表基于源IP地址过滤数据包白哦准访问控制列表的访问控制列表号是1~99 2 扩展访问控制列表基于源IP地址.目的ip地址.指定协议.端口和标志来过滤数据包扩展访问控制列表的访问控制列表号是100~199

WebGoat系列のAccess Control Flaws(访问控制缺陷)

Using an Access Control Matrix 用户权限: Moe--> public share Larry--> Time Card Entry,Performance Review,Time Card Approval,Account Manager Curly--> public share,Performance Review,Time Card Approval Shemp->Site Manager,Account Manager Bypass a Pa

ACL(Access Control List)

Network designers use firewalls to protect networks from unauthorized use. Consider a lock on a door to a room inside a building. The lock allows only authorized users with a key or access card to pass through the door. Similarly, a firewall filters

linux文件权限管理与ACL访问控制列表

一.文件属性 1.文件属性: 文件属性操作 chown : change owner  ,设置文件所有者 chgrp : change group  ,设置文件的属组 文件属主修改: chown 格式:chown [OPTION]- [OWNER][:[GROUP]] FILE- 用法: OWNER OWNER:GROUPNAME    (同时修改属主.属组) :GROUPNAME                (默认属主,修改属组) ( 命令中的冒号可用.替换:) chown  –refere

CCNA网络工程师学习进程(8)访问控制列表ACL

前面几节我们介绍了路由器的路由配置,接下来几节我们将介绍路由器的高级配置应用,包括ACL.NAT.DHCP.PPP.VPN和远程连接等的配置.     (1)ACL概述:   ACL(Access Control List)是一系列运用到路由器接口的指令列表.这些指令告诉路由器如何接收和丢弃数据包,按照一定的规则进行,如源地址.目的地址和端口号等.路由器将根据ACL中指定的条件,对经过路由器端口的数据包进行检查,ACL可以基于所有的Routed Protocols(被路由协议)对经过路由器的数据

文件的权限和访问控制列表(ACL)

前言 文件的权限以及访问控制列表贯穿在整个的Linux使用过程中.我们知道,在Linux 中一切皆文件,因而文件的权限,就自然而然地成为了Linux使用过程中需要频繁接触到的知识内容.而文件权限这一部分地内容,又非常地复杂,因为我们将在这篇文章当中详细地介绍文件的权限,加深自己的理解,同时留作备忘. 本文将通过以下几个方面的内容来介绍文件的权限. 1.文件权限 主要介绍文件的权限,以及每种权限代表着哪些含义. 2.修改文件权限  介绍如何修改文件的权限 3.Linux 系统上特殊文件权限 介绍L

Cisco PT模拟实验(17) 路由器IP访问控制列表配置

Cisco PT模拟实验(17) 路由器IP访问控制列表配置 实验目的: 理解两种IP访问控制列表的原理及功能 掌握常见IP访问控制列表的配置方法 实验背景: 公司的经理部.财务部们和销售部门分属于不同的3个网段,三部门之间用路由器进行信息传递,为了安全起见,公司领导要求销售部门不能对财务部进行访问,但经理部可以对财务部进行访问. 技术原理: 路由器能提供防火墙的功能,根据一些预设置的ACL过滤规则对任何经过接口的流量进行过滤,说明哪些具体的通信(来自设备.协议或端口等)是被允许或拒绝,该功能是

ACM(访问控制模型),Security Identifiers(SID),Security Descriptors(安全描述符),ACL(访问控制列表),Access Tokens(访问令牌)【转载】

对于<windows核心编程>中的只言片语无法驱散心中的疑惑.就让MSDN中的解释给我们一盏明灯吧.如果要很详细的介绍,还是到MSDN仔细的看吧,我只是大体用容易理解的语言描述一下. windows的安全访问控制(ACM,access control mode)是由两部分组成的.一个是访问令牌(access tokens),另一个是安全描述符(security identifiers). 访问令牌是欲进行访问的进程使用的表明自己身份和特权的信息数据. 安全描述符是欲被访问的安全对象的相关安全信