• 配置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--

  • 相关阅读:
    Autofac 学习简易教程随笔(一)
    实现Entity Framework SQLite Code First 开发
    Entity Framework SQLite 开发及实现简单的自定义Migration Engine
    MSSQLServer和SQL Server Express、LocalDB的区别
    .gitignore文件
    Entity Framework MSSQL Code First 开发
    页面为要加<!DOCTYPE html>
    数字图像处理(下)
    数字图像处理(上)
    列表
  • 原文地址:https://www.cnblogs.com/quchunhui/p/13214699.html
Copyright © 2020-2023  润新知