1 zk的权限控制
2 概述:
3 zk类似文件系统,client可以创建节点,更新节点,删除节点,使用zk的access control list 访问控制列表可以做到这一点。
4 acl权限控制,使用scheme:id:permission来标识,主要涵盖3个方面:
5 -权限模式(scheme):授权的策略
6 -授权对象(id):授权的对象
7 -权限(permission):授予的权限
8 其特性如下:
9 -zk的权限控制是基于每个znode节点,需要对每个接待你设置权限
10 -每个znode支持设置多种权限控制方案和多个权限
11 -子节点不会继承父节点的权限,客户端无权访问某节点,但可能可以访问它的字节带你
12 eg:
13 setAcl /test2 ip:192.11.11.11:crwda #将节点权限设置为ip:192.11.11.11的客户端对节点执行增、删、改、查、管理权限
14 权限模式:
15 采用何种方式授权
16 -world:只有一个用户:anyone,代表zookeeper所有人(默认)
17 -ip:对客户端使用ip地址认证
18 -auth:使用已添加认证的用户认证
19 -digest:使用"用户名:密码"方式认证
20 授权对象:
21 给谁授予权限;
22 授权对象是指权限赋予的实体,例如ip地址或者用户;
23 授予的权限:
24 create,delete,read,write,admin;即创建,删除,读,写,管理权限。这五种权限简写为cdrwa。注意:这五种权限中,delete是指对子节点的删除权限,其它四种权限是指对自身节点的操作权限。
25 -create:可以创建子节点
26 -delete:可以删除子节点(仅下一级节点)
27 -read:可以读取节点数据及显示子节点列表
28 -write:可以设置节点数据
29 -admin:可以设置节点访问控制列表权限
30 授权的相关命令:
31 -getAcl: getAcl [path] 读取acl权限
32 -setAcl: setAcl [path] [acl] 设置acl权限
33 -addauth: addauth [scheme] [auth] 添加认证用户
34 案例:
35 -world 授权模式:
36 命令:setAcl [path] world:anyone:[acl]
37 -ip 授权模式:
38 命令:setAcl [path] ip:[ipAddress]:[acl]
39 -auth授权模式:
40 命令:
41 addauth digest [user]:[password] #添加认证用户
42 setAcl [path] auth:[user]:[acl]
43 -digest授权模式:
44 命令:
45 setAcl [path] digest:[user]:[password]:[acl]
46 这里的密码是经过SHA1及BASE64处理的密文,在SHELL中可以通过以下命令计算:
47 echo -n [user]:[password] | openssl dgst -binary -sha1 | openssl base64
48 eg:
49 [gdc@cent701 bin]$ echo -n gdc:Lang..123 | openssl dgst -binary -sha1 | openssl base64
50 dpWvWLODJkDYlzYvUE1tEbGXA5o=
51 其中生成的密文为:dpWvWLODJkDYlzYvUE1tEbGXA5o=
52 演示:
53 -对节点/hadoop/node2/test1设置acl:
54 setAcl /hadoop/node2/test1 digest:gdc:dpWvWLODJkDYlzYvUE1tEbGXA5o=:cdrwa
55 -此时使用get获取节点信息时:get /hadoop/node2/test1:
56 Authentication is not valid : /hadoop/node2/test1
57 -添加认证用户:
58 addauth digest gdc:Lang..123
59 -添加认证用户后获取节点信息:get /hadoop/node2/test1:
60 test1111
61 cZxid = 0x4b
62 ctime = Thu Jul 16 13:53:03 CST 2020
63 mZxid = 0x4b
64 mtime = Thu Jul 16 13:53:03 CST 2020
65 pZxid = 0x4b
66 cversion = 0
67 dataVersion = 0
68 aclVersion = 1
69 ephemeralOwner = 0x0
70 dataLength = 8
71 numChildren = 0
72 即可以正常访问
73 -多种模式授权:
74 同一个节点可以同时使用多种模式授权,其中用逗号分开即可:
75 setAcl /node5 ip:192.168.1.1:cdra,auth:gdc:cdrwa,digest:jdc:jiasjefoiaej+=:cdrwa
76 acl超级管理员:
77 -zk的权限管理模式提供一个超管可以方便的访问任何权限的节点,假设这个超管是:super:admin
78 -需要先为超管生成密码的密文:
79 echo -n super:admin | openssl dgst -binary -sha1 | openssl base64
80 生成的密文为:xQJmxLMiHGwaqBvst5y6rkB6HQs=
81 -打开zk目录下的bin/zkServer.sh服务器脚本文件,找到如下一行:
82 nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}"\
83 -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &
84 -这是脚本中启动zk的命令,默认只有以上两个配置项,我们需要加一个超管的配置项:
85 "-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs="
86 -添加后为:(注意添加时在行尾添加,勿回车另起一行,否则服务启动异常)
87 nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}"
88 "-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs="\
89 -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &
90 -重启zk,输入命令添加权限:
91 addauth digest super:admin