配置Zookeeper ACL权限
==背景==
阿里云ECS服务器提示“ZooKeeper未授权访问高危风险”
==相关组件及版本==
Linux:Centos 8.0
Zookeeper:3.5.6
Hadoop:2.8.3
Flink:1.10.0
==Zookeeper ACL介绍==
网上随便找一个网站看看就应该可以了解了,我看的是:https://blog.csdn.net/qq_34021712/article/details/82871976
【ACL 权限控制】
使用:scheme:id:perm 来标识,主要涵盖 3 个方面:
权限模式(Scheme):授权的策略
授权对象(ID):授权的对象
权限(Permission):授予的权限
其特性如下:
ZooKeeper的权限控制是基于每个znode节点的,需要对每个节点设置权限
每个znode支持设置多种权限控制方案和多个权限
子节点不会继承父节点的权限,客户端无权访问某节点,但可能可以访问它的子节点
《scheme》
采用何种方式授权
world:默认方式,相当于全部都能访问
auth:代表已经认证通过的用户(cli中可以通过addauth digest user:pwd 来添加当前上下文中的授权用户)
digest:即用户名:密码这种方式认证,这也是业务系统中最常用的。用username:password 字符串来产生一个MD5串,然后该串被用来作为ACL ID。
认证是通过明文发送username:password 来进行的,当用在ACL时,表达式为username:base64 ,base64是password的SHA1摘要的编码。
ip:使用客户端的主机IP作为ACL ID 。这个ACL表达式的格式为addr/bits ,此时addr中的有效位与客户端addr中的有效位进行比对。
《ID》
给谁授予权限
授权对象ID是指,权限赋予的用户或者一个实体,例如:IP 地址或者机器。
授权模式 | 授权对象 |
IP | 通常是一个IP地址或IP段,例如“192.168.29.100”或“192.168.29.100/110” |
Digest | 自定义,通常是“username:BASE64(SHA-1(username:password))”,例如"foo:kWN6aNsbjcKWpqjiV7cg0N24raU=" |
Word | 只有一个ID:“anyone” |
Super | 与Digest模式一致 |
《permission》
授予什么权限
CREATE c 可以创建子节点
DELETE d 可以删除子节点(仅下一级节点)
READ r 可以读取节点数据及显示子节点列表
WRITE w 可以设置节点数据
ADMIN a 可以设置节点访问控制列表权限
注意:这5种权限中,delete是指对子节点的删除权限,其它4种权限指对自身节点的操作权限
==设置ACL权限(Digest模式)==
ACL语法:
digest:username:BASE64(SHA1(password)):cdrwa
1、生成密文
提前准备好用户名和密码的密文:
echo -n zk_admin:RexelZkAdmin#982 | openssl dgst -binary -sha1 | openssl base64
生成的密文为:
ohtM2mRqgIWcdWOUvA6Cc9lUQrY=
2、启动Zookeeper
在3个节点上分别执行命令:
sh /home/radmin/zookeeper-3.5.6/bin/zkServer.sh start
3、进入zkCli命令行
在任意一个几点上执行命令,启动zk客户端
命令:
sh /home/radmin/zookeeper-3.5.6/bin/zkCli.sh
4、查看目标节点的Acl
命令:
getAcl /
5、设置ACL
命令:
setAcl / digest:zk_admin:ohtM2mRqgIWcdWOUvA6Cc9lUQrY=:cdrwa
6、验证ACL
setAcl之后,可以尝试getAcl查看权限,会发现权限失败,通过addauto为当前session添加授权信息之后,就可以查看了。
命令:
getAcl / addauth digest zk_admin:RexelZkAdmin#982 getAcl /
getAcl /yarn-leader-election
7、取消acl权限设置。(如果需要)
命令:
setAcl / world:anyone:cdrwa
==设置Hadoop ACL==
1、配置core-site.xml
在原有配置基础之上,增加以下4个配置:
ha.zookeeper.auth
ha.zookeeper.acl
配置之后的core-site.xml如下:
<configuration> <property> <name>hadoop.tmp.dir</name> <value>/home/radmin/data/hadoop/tmp</value> </property> <property> <name>fs.defaultFS</name> <value>hdfs://ns</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/home/radmin/data/hadoop/journal</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>vm1:2181,vm2:2181,vm3:2181</value> </property> <property> <name>ha.zookeeper.auth</name> <value>@/home/radmin/hadoop-2.8.3/etc/hadoop/zk-auth.txt</value> </property> <property> <name>ha.zookeeper.acl</name> <value>@/home/radmin/hadoop-2.8.3/etc/hadoop/zk-acl.txt</value> </property> </configuration>
zk-auth.txt内容如下:
digest:zk_admin:RexelZkAdmin#982
zk-acl.txt内容如下:
digest:zk_admin:ohtM2mRqgIWcdWOUvA6Cc9lUQrY=:cdrwa
【小贴士】
可以通过以下命令来获取acl。命令:
java -cp /home/radmin/zookeeper-3.5.6/lib/*:/home/radmin/zookeeper-3.5.6/lib/zookeeper-3.5.6.jar org.apache.zookeeper.server.auth.DigestAuthenticationProvider zk_admin:RexelZkAdmin#982
2、配置yarn-site.xml
增加两个配置:
yarn.resourcemanager.zk-acl
yarn.resourcemanager.zk-auth
配置之后的yarn-site.xml为:
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value> </property> <property> <name>yarn.resourcemanager.cluster-id</name> <value>ns</value> </property> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>rexel-ids001</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>rexel-ids002</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>rexel-ids001:8289</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>rexel-ids002:8289</value> </property> <property> <name>yarn.resourcemanager.zk-address</name> <value>rexel-ids001:2181,rexel-ids002:2181,rexel-ids003:2181</value> </property> <property> <name>yarn.resourcemanager.zk-acl</name> <value>@/home/radmin/hadoop-2.8.3/etc/hadoop/zk-acl.txt</value> </property> <property> <name>yarn.resourcemanager.zk-auth</name> <value>@/home/radmin/hadoop-2.8.3/etc/hadoop/zk-auth.txt</value> </property> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>8192</value> <description>default is 8192(MB).</description> </property> <property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>1024</value> </property> <property> <name>yarn.scheduler.maximum-allocation-mb</name> <value>8192</value> <description>default is 8192(MB).</description> </property> <property> <name>yarn.resourcemanager.am.max-attempts</name> <value>10</value> <description>The maximum number of application master execution attempts.</description> </property> </configuration>
3、重新启动Hadoop集群
##hadoop首次启动(需要按顺序) [1]hdfs zkfc -formatZK [1][2][3]hadoop-daemon.sh start journalnode [1]hdfs namenode -format [1]hadoop-daemon.sh start namenode [2]hdfs namenode -bootstrapStandby [2]hadoop-daemon.sh start namenode [1][2]hadoop-daemon.sh start zkfc [1][2][3]hadoop-daemon.sh start datanode [1][2]yarn-daemon.sh start resourcemanager [1][2][3]yarn-daemon.sh start nodemanager ##hadoop正常启动(需要按顺序) [1][2][3]hadoop-daemon.sh start journalnode [1][2]hadoop-daemon.sh start namenode [1][2]hadoop-daemon.sh start zkfc [1][2][3]hadoop-daemon.sh start datanode [1][2]yarn-daemon.sh start resourcemanager [1][2][3]yarn-daemon.sh start nodemanager
备注:[1][2][3]表示在第几个节点执行命令
4、确认Yarn和Hdfs的web页面是否可用。
http://192.168.29.100:8088
http://192.168.29.100:50070
==Flink Zookeeper ACL==
目前试了一下,不需要对配置进行任何的修改,运行了一个实时流任务,没有发现任何问题。
猜测是因为任务委托给yan执行的原因。
==一个小坑==
验证的时候对/yarn-leader-election目录也执行了setAcl,结果yarn的resourcemanager就无论如何也启动不起来了。
后来取消了/yarn-leader-election的acl,只在根节点上设置了acl之后,集群就可以启动起来了。
--END--
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)