005、zookeeper的acl权限控制实战案例
本文最后更新于 67 天前,其中的信息可能已经过时,如有错误请发送邮件到wuxianglongblog@163.com

zookeeper的acl权限控制实战案例

一.zookeeper的acl权限控制概述

1.zookeeper的ACL简介

    zookeeper类似文件系统,client可以创建节点,更新节点,删除节点,那么如何做到节点的权限的控制呢?

    zookeeper的Access Control List(访问控制列表,简称ACL)可以做到这一点。

    zookeeper的ACL权限控制使用"scheme:id:permission"来标识,主要涵盖如下三个方面:
        权限模式(scheme):
            指的是授权的策略。
        授权的对象(id):
            指的是授权的对象。
        权限(permission):
            指的是授权的权限。

    zookeeper的ACL的特点如下:
        (1)zookeeper的权限控制是基于每个znode节点的,需要对每个节点设置权限;
        (2)每个znode支持设置多种权限控制方案和多个权限;
        (3)子节点不会继承父节点的权限,也就是说,客户端无权访问某个znode,并不代表无法访问它的子节点;

    例如:
        setAcl /oldboy ip:172.200.1.103:crwda
    说明如下:
        将节点权限设置为IP:172.200.1.103的客户端可以对节点进行增,删,改,查,管理权限。

2.权限模式(scheme)

    所谓的权限模式指的是采用何种方式授权。

    zookeeper支持以下几种权限模式:
        world:
            只有一个用户,即"anyone",代表登录zookeeper的所有人,这也是默认的权限模式。
        ip:
            对客户端使用IP地址认证。
        auth:
            使用已添加认证的用户认证。
        digest:
            使用"用户名:密码"方式进行认证。

3.授权的对象(id)

    所谓的授权对象指的是给谁授予权限。授权对象ID是指权限赋予的实体,例如: IP地址或用户。

4.权限(permission)

    zookeeper支持以下几种权限:
        create(简写"c"):
            表示可以创建子节点。
        delete(简称"d"):
            可以删除子节点。
        read(简称"r"):
            可以读取节点数据及显示子节点列表。
        write(简称"w"):
            可以修改节点数据。
        admin(简称"a"):
            可以设置节点访问控制列表权限。

5.授权的相关命令

    getAcl:
        读取ACL权限,使用语法:"getAcl [-s] path"。

    setAcl:
        设置ACL权限,使用语法:"setAcl [-s] [-v version] [-R] path acl"。

    addauth 
        添加认证用户,使用语法:"addauth scheme auth"。

二.world授权模式实战案例

1.创建测试数据

[zk: localhost:2181(CONNECTED) 208] ls /
[k8s0000000001, oldboy, zookeeper]
[zk: localhost:2181(CONNECTED) 209] 
[zk: localhost:2181(CONNECTED) 209] create /hadoop "Hadoop"
Created /hadoop
[zk: localhost:2181(CONNECTED) 210] 
[zk: localhost:2181(CONNECTED) 210] create /hadoop/hdfs "HDFS"
Created /hadoop/hdfs
[zk: localhost:2181(CONNECTED) 211] 
[zk: localhost:2181(CONNECTED) 211] create /hadoop/yarn "YARN"
Created /hadoop/yarn
[zk: localhost:2181(CONNECTED) 212] 
[zk: localhost:2181(CONNECTED) 212] create /hadoop/mapreduce "MapReduce"
Created /hadoop/mapreduce
[zk: localhost:2181(CONNECTED) 213] 
[zk: localhost:2181(CONNECTED) 213] ls -R /hadoop 
/hadoop
/hadoop/hdfs
/hadoop/mapreduce
/hadoop/yarn
[zk: localhost:2181(CONNECTED) 214] 

2.使用"setAcl"指令移除"create"(简称"c")权限

[zk: localhost:2181(CONNECTED) 214] getAcl /hadoop 
'world,'anyone
: cdrwa
[zk: localhost:2181(CONNECTED) 215] 
[zk: localhost:2181(CONNECTED) 215] setAcl /hadoop world:anyone:drwa
[zk: localhost:2181(CONNECTED) 216] 
[zk: localhost:2181(CONNECTED) 216] getAcl /hadoop 
'world,'anyone
: drwa
[zk: localhost:2181(CONNECTED) 217] 
[zk: localhost:2181(CONNECTED) 217] ls /hadoop 
[hdfs, mapreduce, yarn]
[zk: localhost:2181(CONNECTED) 218] 
[zk: localhost:2181(CONNECTED) 218] create /hadoop/hive "Hive"  # Duang~很明显,此处我们没法创建子znode啦~
Insufficient permission : /hadoop/hive
[zk: localhost:2181(CONNECTED) 219] 

3.使用"setAcl"指令移除"delete"(简称"d")权限

[zk: localhost:2181(CONNECTED) 219] ls /hadoop 
[hdfs, mapreduce, yarn]
[zk: localhost:2181(CONNECTED) 220] 
[zk: localhost:2181(CONNECTED) 220] getAcl /hadoop 
'world,'anyone
: drwa
[zk: localhost:2181(CONNECTED) 221] 
[zk: localhost:2181(CONNECTED) 221] setAcl /hadoop world:anyone:rwa
[zk: localhost:2181(CONNECTED) 222] 
[zk: localhost:2181(CONNECTED) 222] getAcl /hadoop 
'world,'anyone
: rwa
[zk: localhost:2181(CONNECTED) 223] 
[zk: localhost:2181(CONNECTED) 223] delete /hadoop/hdfs  # Duang~很明显,我们无法删除子znode啦~
Insufficient permission : /hadoop/hdfs
[zk: localhost:2181(CONNECTED) 224] 

4.使用"setAcl"指令移除"read"(简称"r")权限

[zk: localhost:2181(CONNECTED) 224] getAcl /hadoop 
'world,'anyone
: rwa
[zk: localhost:2181(CONNECTED) 225] 
[zk: localhost:2181(CONNECTED) 225] get /hadoop  # 注意哈,在移除read权限之前,我们是可以获取到对应znode的数据哟~
Hadoop
[zk: localhost:2181(CONNECTED) 226] 
[zk: localhost:2181(CONNECTED) 226] setAcl /hadoop world:anyone:wa
[zk: localhost:2181(CONNECTED) 227] 
[zk: localhost:2181(CONNECTED) 227] getAcl /hadoop 
'world,'anyone
: wa
[zk: localhost:2181(CONNECTED) 228] 
[zk: localhost:2181(CONNECTED) 228] get /hadoop  # Duang~很明显,我们无法读取znode的数据啦~
org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /hadoop
[zk: localhost:2181(CONNECTED) 229] 

5.使用"setAcl"指令移除"write"(简称"w")权限

[zk: localhost:2181(CONNECTED) 235] getAcl /hadoop 
'world,'anyone
: wa
[zk: localhost:2181(CONNECTED) 236] 
[zk: localhost:2181(CONNECTED) 236] set /hadoop "Hadoop2021"  # 注意哈,在移除当前znode的w权限之前,我们是可以修改该znode的数据哟~
[zk: localhost:2181(CONNECTED) 237] 
[zk: localhost:2181(CONNECTED) 237] setAcl /hadoop world:anyone:a  # 此处我移除了"w"权限,仅保留了"a"权限
[zk: localhost:2181(CONNECTED) 238] 
[zk: localhost:2181(CONNECTED) 238] getAcl /hadoop 
'world,'anyone
: a
[zk: localhost:2181(CONNECTED) 239] 
[zk: localhost:2181(CONNECTED) 239] set /hadoop "Hadoop"  # Duang~由于我们移除了"w"权限,因此无法修改znode的数据啦~
Insufficient permission : /hadoop
[zk: localhost:2181(CONNECTED) 240] 

6.使用"setAcl"指令移除"admin"(简称"a")权限(生产环境中要慎用,一旦znode被移除了"a"权限,则我们将无法为其重新分配任何权限啦!)

[zk: localhost:2181(CONNECTED) 240] getAcl /hadoop  # 在移除管理权限之前,我们是可以获取znode的权限信息的!
'world,'anyone
: a
[zk: localhost:2181(CONNECTED) 241] 
[zk: localhost:2181(CONNECTED) 241] setAcl /hadoop world:anyone:
[zk: localhost:2181(CONNECTED) 242] 
[zk: localhost:2181(CONNECTED) 242] getAcl /hadoop  # 当我们移除了"a"权限后,既无法查看znode的权限,也无法为znode重新分配权限!
Insufficient permission : /hadoop
[zk: localhost:2181(CONNECTED) 243] 
[zk: localhost:2181(CONNECTED) 243] setAcl /hadoop world:anyone:cdrwa  # Duang~我们无法为znode重新分配权限了,因为该"znode"并没有"a"权限!
Insufficient permission : /hadoop
[zk: localhost:2181(CONNECTED) 244] 

7.当znode被移除"admin"(简称"a")权限,若想要重新分配权限解决方案

    (1)修改zookeeper服务的配置文件,添加如下两行
        [root@elk101.oldboyedu.com ~]# vim /oldboy/softwares/zookeeper/conf/zoo.cfg 
        [root@elk101.oldboyedu.com ~]# 
        [root@elk101.oldboyedu.com ~]# tail -2 /oldboy/softwares/zookeeper/conf/zoo.cfg 
        # add by yinzhengjie for ACL
        skipACL=yes
        [root@elk101.oldboyedu.com ~]# 

    (2)重启zookeeper服务
        [root@elk101.oldboyedu.com ~]# zkServer.sh stop
        /oldboy/softwares/jdk/bin/java
        ZooKeeper JMX enabled by default
        Using config: /oldboy/softwares/zookeeper/bin/../conf/zoo.cfg
        Stopping zookeeper ... STOPPED
        [root@elk101.oldboyedu.com ~]# 
        [root@elk101.oldboyedu.com ~]# zkServer.sh start
        /oldboy/softwares/jdk/bin/java
        ZooKeeper JMX enabled by default
        Using config: /oldboy/softwares/zookeeper/bin/../conf/zoo.cfg
        Starting zookeeper ... STARTED
        [root@elk101.oldboyedu.com ~]# 
        [root@elk101.oldboyedu.com ~]# zkServer.sh status
        /oldboy/softwares/jdk/bin/java
        ZooKeeper JMX enabled by default
        Using config: /oldboy/softwares/zookeeper/bin/../conf/zoo.cfg
        Client port found: 2181. Client address: localhost. Client SSL: false.
        Mode: standalone
        [root@elk101.oldboyedu.com ~]# 

    (3)重新分配权限
        [root@elk101.oldboyedu.com ~]# zkCli.sh 

        ...

        [zk: localhost:2181(CONNECTED) 1] ls /
        [hadoop, k8s0000000001, oldboy, zookeeper]
        [zk: localhost:2181(CONNECTED) 2] 
        [zk: localhost:2181(CONNECTED) 2] get /hadoop 
        Hadoop2021
        [zk: localhost:2181(CONNECTED) 3] 
        [zk: localhost:2181(CONNECTED) 3] getAcl /hadoop  # 由于我们启动zookeeper跳过了权限认证,因此此处是可以查看znode的权限哟~
        'world,'anyone
        : 
        [zk: localhost:2181(CONNECTED) 4] 
        [zk: localhost:2181(CONNECTED) 4] setAcl /hadoop world:anyone:cdrwa  # 既然跳过了权限认证,那自然我们就可以为当前的znode重新分配权限啦~
        [zk: localhost:2181(CONNECTED) 5] 
        [zk: localhost:2181(CONNECTED) 5] getAcl /hadoop   # Duang~当前的znode又重新恢复到所有权限都拥有啦~
        'world,'anyone
        : cdrwa
        [zk: localhost:2181(CONNECTED) 6] 

    温馨提示:
        当重新分配权限后,记得再次重启服务哟~否则当前zookeeper集群始终会跳过权限认证哟~

三.ip授权模式实战案例

1.设置zookeeper服务的监听地址

    (1)修改zookeeper监听的IP地址
        [root@elk101.oldboyedu.com ~]# vim /oldboy/softwares/zookeeper/conf/zoo.cfg 
        [root@elk101.oldboyedu.com ~]# 
        [root@elk101.oldboyedu.com ~]# tail -1 /oldboy/softwares/zookeeper/conf/zoo.cfg 
        clientPortAddress=172.200.1.101
        [root@elk101.oldboyedu.com ~]# 

    (2)重启zookeeper服务
        [root@elk101.oldboyedu.com ~]# zkServer.sh stop
        /oldboy/softwares/jdk/bin/java
        ZooKeeper JMX enabled by default
        Using config: /oldboy/softwares/zookeeper/bin/../conf/zoo.cfg
        Stopping zookeeper ... STOPPED
        [root@elk101.oldboyedu.com ~]# 
        [root@elk101.oldboyedu.com ~]# zkServer.sh start
        /oldboy/softwares/jdk/bin/java
        ZooKeeper JMX enabled by default
        Using config: /oldboy/softwares/zookeeper/bin/../conf/zoo.cfg
        Starting zookeeper ... STARTED
        [root@elk101.oldboyedu.com ~]# 
        [root@elk101.oldboyedu.com ~]# zkServer.sh status
        /oldboy/softwares/jdk/bin/java
        ZooKeeper JMX enabled by default
        Using config: /oldboy/softwares/zookeeper/bin/../conf/zoo.cfg
        Client port found: 2181. Client address: 172.200.1.101. Client SSL: false.
        Mode: standalone
        [root@elk101.oldboyedu.com ~]# 

    (3)禁用防火墙,若不禁用防火墙,则该服务将无法访问哟~
        [root@elk101.oldboyedu.com ~]# systemctl stop firewalld
        [root@elk101.oldboyedu.com ~]# 
        [root@elk101.oldboyedu.com ~]# systemctl disable firewalld
        Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
        Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
        [root@elk101.oldboyedu.com ~]# 

    温馨提示:
        若不修改zookeeper监听的地址,则默认监听的是"[::]:2181"。

2.设置仅"172.200.1.102"这个节点来访问zookeeper的某个znode

    (1)在"172.200.1.101"节点设置"/hadoop"的znode仅对"172.200.1.102"这个IP地址有"cdrwa"权限。
        [root@elk101.oldboyedu.com ~]# ifconfig ens33 | sed -nr '2s/^[^0-9]+([0-9.]+).*/\1/p'
        172.200.1.101
        [root@elk101.oldboyedu.com ~]# 
        [root@elk101.oldboyedu.com ~]# zkCli.sh -server 172.200.1.101  # 基于zookeeper服务监听的IP地址进行登录!

        ...

        [zk: localhost:2181(CONNECTED) 3] getAcl /hadoop 
        'world,'anyone
        : cdrwa
        [zk: localhost:2181(CONNECTED) 4] 
        [zk: localhost:2181(CONNECTED) 4] setAcl /hadoop ip:172.200.1.102:cdrwa  # 注意哈,授权的对象是给"172.200.1.102"这个IP地址的哟~
        [zk: localhost:2181(CONNECTED) 5] 
        [zk: localhost:2181(CONNECTED) 5] getAcl /hadoop  # Duang~很明显,权限是立即生效的!当前节点无权限访问
        Insufficient permission : /hadoop
        [zk: localhost:2181(CONNECTED) 6] 
        [zk: 172.200.1.101(CONNECTED) 6] ls /hadoop 
        Insufficient permission : /hadoop
        [zk: 172.200.1.101(CONNECTED) 7] 

    (2)在"172.200.1.102"这个节点来连接zookeeper服务端(该节点需要安装zookeeper的环境,但可以不启用zookeeper服务,因为其要使用到"zkCli.sh"工具来连接zookeeper服务端哟~)
        [root@kafka102.yinzhengjie.com ~]# ifconfig ens33 | sed -nr '2s/^[^0-9]+([0-9.]+).*/\1/p'
        172.200.1.102
        [root@kafka102.yinzhengjie.com ~]# 
        [root@kafka102.yinzhengjie.com ~]# zkCli.sh -server 172.200.1.101  # 基于zookeeper服务监听的IP地址进行登录!

        ...

        [zk: 172.200.1.101(CONNECTED) 5] ls /
        [hadoop, k8s0000000001, oldboy, zookeeper]
        [zk: 172.200.1.101(CONNECTED) 6] 
        [zk: 172.200.1.101(CONNECTED) 6] ls /hadoop 
        [hdfs, mapreduce, yarn]
        [zk: 172.200.1.101(CONNECTED) 7] 
        [zk: 172.200.1.101(CONNECTED) 7] getAcl /hadoop  # 当前节点是可以查看当前znode的权限,并且可以对该节点进行相应的"cdrwa"权限哟~
        'ip,'172.200.1.102
        : cdrwa
        [zk: 172.200.1.101(CONNECTED) 8] 
        [zk: 172.200.1.101(CONNECTED) 8] ls /hadoop 
        [hdfs, mapreduce, yarn]
        [zk: 172.200.1.101(CONNECTED) 9] 
        [zk: 172.200.1.101(CONNECTED) 9] get /hadoop/hdfs 
        HDFS
        [zk: 172.200.1.101(CONNECTED) 10] 

3.设置仅"172.200.1.101"和"172.200.1.102"这两个节点来访问zookeeper的某个znode

    (1)在"172.200.1.102"这个节点来连接zookeeper服务端
        [root@kafka102.yinzhengjie.com ~]# zkCli.sh -server 172.200.1.101  # 基于zookeeper服务监听的IP地址进行登录!

        ...

        [zk: 172.200.1.101(CONNECTED) 11] getAcl /hadoop  # 注意观察修改之前的权限信息
        'ip,'172.200.1.102
        : cdrwa
        [zk: 172.200.1.101(CONNECTED) 12] 
        [zk: 172.200.1.101(CONNECTED) 12] setAcl /hadoop ip:172.200.1.102:cdrwa,ip:172.200.1.101:cdr
        [zk: 172.200.1.101(CONNECTED) 13] 
        [zk: 172.200.1.101(CONNECTED) 13] getAcl /hadoop  # 注意观察修改后的权限信息
        'ip,'172.200.1.102
        : cdrwa
        'ip,'172.200.1.101
        : cdr
        [zk: 172.200.1.101(CONNECTED) 14] 

    (2)在"172.200.1.101"节点设置"/hadoop"的znode仅对"172.200.1.102"这个IP地址有"cdrwa"权限。
        [root@elk101.oldboyedu.com ~]# ifconfig ens33 | sed -nr '2s/^[^0-9]+([0-9.]+).*/\1/p'
        [root@elk101.oldboyedu.com ~]#
        [root@elk101.oldboyedu.com ~]# zkCli.sh -server 172.200.1.101  # 基于zookeeper服务监听的IP地址进行登录!
        ...

        [zk: 172.200.1.101(CONNECTED) 5] getAcl /hadoop  # 在此之前,当前的会话是无法对zookeeper进行访问的!
        Insufficient permission : /hadoop
        [zk: 172.200.1.101(CONNECTED) 6] 
        [zk: 172.200.1.101(CONNECTED) 6] ls /hadoop 
        Insufficient permission : /hadoop
        [zk: 172.200.1.101(CONNECTED) 7] 
        [zk: 172.200.1.101(CONNECTED) 7] 
        [zk: 172.200.1.101(CONNECTED) 7] ls /hadoop  # 当我们修改权限后,当前的节点立即就有权限访问啦~
        [hdfs, mapreduce, yarn]
        [zk: 172.200.1.101(CONNECTED) 8] 
        [zk: 172.200.1.101(CONNECTED) 8] getAcl /hadoop  
        'ip,'172.200.1.102
        : cdrwa
        'ip,'172.200.1.101
        : cdr
        [zk: 172.200.1.101(CONNECTED) 9] 
        [zk: 172.200.1.101(CONNECTED) 9] create /hadoop/hive "Hive"  # Duang~我们是有"c"权限的,说明可以创建子节点。
        Created /hadoop/hive
        [zk: 172.200.1.101(CONNECTED) 10] 
        [zk: 172.200.1.101(CONNECTED) 10] ls /hadoop 
        [hdfs, hive, mapreduce, yarn]
        [zk: 172.200.1.101(CONNECTED) 11] 
        [zk: 172.200.1.101(CONNECTED) 11] delete /hadoop/hive  # Duang~我们有"d"权限的,说明可以删除子节点。
        [zk: 172.200.1.101(CONNECTED) 12] 
        [zk: 172.200.1.101(CONNECTED) 12] ls /hadoop 
        [hdfs, mapreduce, yarn]
        [zk: 172.200.1.101(CONNECTED) 13] 
        [zk: 172.200.1.101(CONNECTED) 13] get /hadoop
        Hadoop2021
        [zk: 172.200.1.101(CONNECTED) 14] 
        [zk: 172.200.1.101(CONNECTED) 14] set /hadoop "HADOOP"  # Duang~可惜呀,我们没有"w"权限,因此无法对当前节点进行修改哟~
        Insufficient permission : /hadoop
        [zk: 172.200.1.101(CONNECTED) 15] 
        [zk: 172.200.1.101(CONNECTED) 15] get /hadoop/hdfs  # 但是我们可以修改子节点的数据,因为子节点我们是有"w"权限的!
        HDFS
        [zk: 172.200.1.101(CONNECTED) 16] 
        [zk: 172.200.1.101(CONNECTED) 16] set /hadoop/hdfs "HDFS2021"
        [zk: 172.200.1.101(CONNECTED) 17] 
        [zk: 172.200.1.101(CONNECTED) 17] get /hadoop/hdfs
        HDFS2021
        [zk: 172.200.1.101(CONNECTED) 18] 
        [zk: 172.200.1.101(CONNECTED) 18] getAcl /hadoop/hdfs
        'world,'anyone
        : cdrwa
        [zk: 172.200.1.101(CONNECTED) 19] 

4.设置仅"192.168.1.0/24"网段可以来访问zookeeper的某个znode

    [root@elk101.oldboyedu.com ~]# zkCli.sh -server 172.200.1.101  # 基于zookeeper服务监听的IP地址进行登录!

    ...

    [zk: 172.200.1.101(CONNECTED) 20] getAcl /hadoop 
    'ip,'172.200.1.102
    : cdrwa
    'ip,'172.200.1.101
    : cdr
    [zk: 172.200.1.101(CONNECTED) 21] 
    [zk: 172.200.1.101(CONNECTED) 21] setAcl /hadoop ip:172.200.1.102:cdrwa,ip:172.200.1.101:cdr,ip:192.168.1.0/24:r  # 我们可以设置多个IP地址对某个znode有访问权限
    [zk: 172.200.1.101(CONNECTED) 22] 
    [zk: 172.200.1.101(CONNECTED) 22] getAcl /hadoop 
    'ip,'172.200.1.102
    : cdrwa
    'ip,'172.200.1.101
    : cdr
    'ip,'192.168.1.0/24
    : r
    [zk: 172.200.1.101(CONNECTED) 23] 
    [zk: 172.200.1.101(CONNECTED) 23] setAcl /hadoop ip:192.168.1.0/24:r  # 注意哈,当我们修改权限仅允许某个网段来访问当前"znode",因此无法获取相应的信息哟~
    [zk: 172.200.1.101(CONNECTED) 24] 
    [zk: 172.200.1.101(CONNECTED) 24] getAcl /hadoop 
    Insufficient permission : /hadoop
    [zk: 172.200.1.101(CONNECTED) 25] 
    [zk: 172.200.1.101(CONNECTED) 25] ls /hadoop 
    Insufficient permission : /hadoop
    [zk: 172.200.1.101(CONNECTED) 26] 
    [zk: 172.200.1.101(CONNECTED) 26] ls /
    [hadoop, k8s0000000001, oldboy, zookeeper]
    [zk: 172.200.1.101(CONNECTED) 27] 

五.auth授权模式实战案例

    (1)在"172.200.1.101"节点设置"/hadoop"的znode仅对"172.200.1.102"这个IP地址有"cdrwa"权限。
        [root@elk101.oldboyedu.com ~]# ifconfig ens33 | sed -nr '2s/^[^0-9]+([0-9.]+).*/\1/p'
        172.200.1.101
        [root@elk101.oldboyedu.com ~]# 
        [root@elk101.oldboyedu.com ~]# zkCli.sh -server 172.200.1.101  # 基于zookeeper服务监听的IP地址进行登录!

        ...

        [zk: 172.200.1.101(CONNECTED) 38] getAcl /oldboy 
        'world,'anyone
        : cdrwa
        [zk: 172.200.1.101(CONNECTED) 39] 
        [zk: 172.200.1.101(CONNECTED) 39] addauth digest jason:oldboyedu  # 添加认证用户。
        [zk: 172.200.1.101(CONNECTED) 40] 
        [zk: 172.200.1.101(CONNECTED) 40] setAcl /oldboy auth:jason:cdrwa  # 为当前已添加的认证用户设置相应的权限。
        [zk: 172.200.1.101(CONNECTED) 41] 
        [zk: 172.200.1.101(CONNECTED) 41] getAcl /oldboy 
        'digest,'jason:AQxcOjJ8wnIpr7ApxrI/HYYK/aM=
        : cdrwa
        [zk: 172.200.1.101(CONNECTED) 42] 
        [zk: 172.200.1.101(CONNECTED) 42] ls /oldboy  # 注意哈,当前节点是有权限访问的哟~因为上面我们已经使用"addauth"添加过认证啦!
        []
        [zk: 172.200.1.101(CONNECTED) 43] 
        [zk: 172.200.1.101(CONNECTED) 43] get /oldboy 
        OLDBOY
        [zk: 172.200.1.101(CONNECTED) 44] 

    (2)在"172.200.1.102"这个节点来连接zookeeper服务端(该节点需要安装zookeeper的环境,但可以不启用zookeeper服务,因为其要使用到"zkCli.sh"工具来连接zookeeper服务端哟~)
        [root@kafka102.yinzhengjie.com ~]# ifconfig ens33 | sed -nr '2s/^[^0-9]+([0-9.]+).*/\1/p'
        172.200.1.102
        [root@kafka102.yinzhengjie.com ~]# 
        [root@kafka102.yinzhengjie.com ~]# zkCli.sh -server 172.200.1.101  # 基于zookeeper服务监听的IP地址进行登录!

        ...

        [zk: 172.200.1.101(CONNECTED) 0] ls /
        [hadoop, k8s0000000001, oldboy, zookeeper]
        [zk: 172.200.1.101(CONNECTED) 1] 
        [zk: 172.200.1.101(CONNECTED) 1] ls /oldboy  # 由于没有添加认证,因此无法正常访问"/oldboy"这个znode。
        Insufficient permission : /oldboy
        [zk: 172.200.1.101(CONNECTED) 2] 
        [zk: 172.200.1.101(CONNECTED) 2] get /oldboy 
        org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /oldboy
        [zk: 172.200.1.101(CONNECTED) 3] 
        [zk: 172.200.1.101(CONNECTED) 3] addauth digest jason:123456  # 我们模拟来添加一个认证信息,用户名为jason,但密码我输入一个错误的密码,会发现无法正常访问znode哟~
        [zk: 172.200.1.101(CONNECTED) 4] 
        [zk: 172.200.1.101(CONNECTED) 4] ls /oldboy 
        Insufficient permission : /oldboy
        [zk: 172.200.1.101(CONNECTED) 5] 
        [zk: 172.200.1.101(CONNECTED) 5] get /oldboy 
        org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /oldboy
        [zk: 172.200.1.101(CONNECTED) 6] 
        [zk: 172.200.1.101(CONNECTED) 6] addauth digest jason:yinzhengjie  # 接下来我们输入一个正确的用户名密码,不难发现数据是可以正常访问的!
        [zk: 172.200.1.101(CONNECTED) 7] 
        [zk: 172.200.1.101(CONNECTED) 7] get /oldboy 
        OLDBOY
        [zk: 172.200.1.101(CONNECTED) 8] 
        [zk: 172.200.1.101(CONNECTED) 8] ls /oldboy 
        []
        [zk: 172.200.1.101(CONNECTED) 9] 

六.digest授权模式实战案例

1.使用sha1加密算法及base64编码来计算一个密码的密文

[root@elk101.oldboyedu.com ~]# echo -n admin:oldboyedu | openssl dgst -binary -sha1 | openssl base64
Tmbbt77KcTd1bAgjQaI+GqI0hjM=
[root@elk101.oldboyedu.com ~]# 

2.添加授权信息

[root@elk101.oldboyedu.com ~]# zkCli.sh -server 172.200.1.101  # 基于zookeeper服务监听的IP地址进行登录!

...

[zk: 172.200.1.101(CONNECTED) 2] create /kafka "Kafka"
Created /kafka
[zk: 172.200.1.101(CONNECTED) 3] 
[zk: 172.200.1.101(CONNECTED) 3] get /kafka 
Kafka
[zk: 172.200.1.101(CONNECTED) 4] 
[zk: 172.200.1.101(CONNECTED) 4] getAcl /kafka 
'world,'anyone
: cdrwa
[zk: 172.200.1.101(CONNECTED) 5] 
[zk: 172.200.1.101(CONNECTED) 5] setAcl /kafka digest:admin:Tmbbt77KcTd1bAgjQaI+GqI0hjM=:cdrwa  # 注意哈,设置密码需要使用密文,即我们上面使用sha1进行加密并用base64进行编码的密文哟~
[zk: 172.200.1.101(CONNECTED) 6] 
[zk: 172.200.1.101(CONNECTED) 6] getAcl /kafka  # 加密后,立即生效,当前若没有提供认证,则无法访问该znode。
Insufficient permission : /kafka
[zk: 172.200.1.101(CONNECTED) 7] 
[zk: 172.200.1.101(CONNECTED) 7] get /kafka 
org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /kafka
[zk: 172.200.1.101(CONNECTED) 8] 
[zk: 172.200.1.101(CONNECTED) 8] 
[zk: 172.200.1.101(CONNECTED) 8] addauth digest admin:oldboyedu  # 添加认证信息的时候,密码要使用明文哟~
[zk: 172.200.1.101(CONNECTED) 9] 
[zk: 172.200.1.101(CONNECTED) 9] get /kafka  # 当密码添加成功后,就可以正常访问啦~
Kafka
[zk: 172.200.1.101(CONNECTED) 10] 
[zk: 172.200.1.101(CONNECTED) 10] getAcl /kafka 
'digest,'jason:AQxcOjJ8wnIpr7ApxrI/HYYK/aM=
: cdrwa
[zk: 172.200.1.101(CONNECTED) 11] 

七.多种授权模式实战案例

1.案例展示

    (1)在"172.200.1.101"节点设置"/hadoop"的znode仅对"172.200.1.102"这个IP地址有"cdrwa"权限。
        [root@elk101.oldboyedu.com ~]# ifconfig ens33 | sed -nr '2s/^[^0-9]+([0-9.]+).*/\1/p'
        172.200.1.101
        [root@elk101.oldboyedu.com ~]# 
        [root@elk101.oldboyedu.com ~]# zkCli.sh -server 172.200.1.101

        ...

        [zk: 172.200.1.101(CONNECTED) 17] create /hive "Hive"
        Created /hive
        [zk: 172.200.1.101(CONNECTED) 18] 
        [zk: 172.200.1.101(CONNECTED) 18] getAcl /hive 
        'world,'anyone
        : cdrwa
        [zk: 172.200.1.101(CONNECTED) 19] 
        [zk: 172.200.1.101(CONNECTED) 19] addauth digest jason:yinzhengjie
        [zk: 172.200.1.101(CONNECTED) 20] 
        [zk: 172.200.1.101(CONNECTED) 20] setAcl /hive ip:172.200.1.102:cdr,auth:jason:rwa,digest:jason:AQxcOjJ8wnIpr7ApxrI/HYYK/aM=:cdrwa
        [zk: 172.200.1.101(CONNECTED) 21] 
        [zk: 172.200.1.101(CONNECTED) 21] getAcl /hive 
        'ip,'172.200.1.102
        : cdr
        'digest,'jason:AQxcOjJ8wnIpr7ApxrI/HYYK/aM=
        : rwa
        'digest,'jason:MJ0KzmL5kgrbPl02S/uK+CJo634=
        : rwa
        'digest,'jason:AQxcOjJ8wnIpr7ApxrI/HYYK/aM=
        : cdrwa
        [zk: 172.200.1.101(CONNECTED) 22] 

    (2)在"172.200.1.102"这个节点来连接zookeeper服务端
        略,验证步骤参考之前的案例即可。

3.课堂笔记简记2

(1)获取sha1加密的密码
echo -n admin:oldboyedu | openssl dgst -binary -sha1 | openssl base64
    Tmbbt77KcTd1bAgjQaI+GqI0hjM=

(2)添加认证
addauth digest jason:oldboyedu
addauth digest root:oldboyedu

(3)配置权限
create /linux
setAcl /linux ip:10.0.0.0/24:cdr,auth:jason:rwa,digest:root:FoNgIPgdUI0shcilw0GSsHE6GNM=:cdrwa

八.ACL超级管理员

1.使用sha1加密算法及base64编码来计算一个密码的密文

    zookeeper的权限管理模式有一种叫做"super",该模式提供一个超级管理员可以方便的访问任何权限的节点。

    假设这个管理用户名和密码是"admin:yinzhengjie",需要先为超管生成密码的密文,操作如下所示:
        [root@elk101.oldboyedu.com ~]# echo -n admin:oldboyedu | openssl dgst -binary -sha1 | openssl base64
        Tmbbt77KcTd1bAgjQaI+GqI0hjM=
        [root@elk101.oldboyedu.com ~]# 

2.修改zookeeper服务端的环境变量,并添加超级用户

    (1)修改"zkEnv.sh"配置文件,如下所示(注意哈,下面的以"#"开头的行,是原来的配置,我们要做的是复制改行并添加超级用户)
        [root@elk101.oldboyedu.com ~]# vim /oldboy/softwares/zookeeper/bin/zkEnv.sh

        ...

        # export SERVER_JVMFLAGS="-Xmx${ZK_SERVER_HEAP}m $SERVER_JVMFLAGS"

        export SERVER_JVMFLAGS="-Dzookeeper.DigestAuthenticationProvider.superDigest=admin:Tmbbt77KcTd1bAgjQaI+GqI0hjM= -Xmx${ZK_SERVER_HEAP}m $SERVER_JVMFLAGS"

        ...

    (2)zookeeper集群所有节点重复上述操作。
        略,推荐使用同步脚本进行数据的同步。

    (3)重启集群,使得配置文件生效。
        [root@elk101.oldboyedu.com ~]# zkServer.sh restart
        /oldboy/softwares/jdk/bin/java
        ZooKeeper JMX enabled by default
        Using config: /oldboy/softwares/zookeeper/bin/../conf/zoo.cfg
        /oldboy/softwares/jdk/bin/java
        ZooKeeper JMX enabled by default
        Using config: /oldboy/softwares/zookeeper/bin/../conf/zoo.cfg
        Stopping zookeeper ... STOPPED
        /oldboy/softwares/jdk/bin/java
        ZooKeeper JMX enabled by default
        Using config: /oldboy/softwares/zookeeper/bin/../conf/zoo.cfg
        Starting zookeeper ... STARTED
        [root@elk101.oldboyedu.com ~]# 
        [root@elk101.oldboyedu.com ~]# zkServer.sh status
        /oldboy/softwares/jdk/bin/java
        ZooKeeper JMX enabled by default
        Using config: /oldboy/softwares/zookeeper/bin/../conf/zoo.cfg
        Client port found: 2181. Client address: 172.200.1.101. Client SSL: false.
        Mode: standalone
        [root@elk101.oldboyedu.com ~]# 

3.编写测试案例

[root@elk101.oldboyedu.com ~]# ifconfig ens33 | sed -nr '2s/^[^0-9]+([0-9.]+).*/\1/p'
172.200.1.101
[root@elk101.oldboyedu.com ~]# 
[root@elk101.oldboyedu.com ~]# zkCli.sh -server 172.200.1.101:2181

...

[zk: 172.200.1.101:2181(CONNECTED) 1] ls /
[hadoop, hive, k8s0000000001, kafka, mysql, oldboy, zookeeper]
[zk: 172.200.1.101:2181(CONNECTED) 2] 
[zk: 172.200.1.101:2181(CONNECTED) 2] create /kudu "KUDU DATABASE"
Created /kudu
[zk: 172.200.1.101:2181(CONNECTED) 3] 
[zk: 172.200.1.101:2181(CONNECTED) 3] getAcl /kudu 
'world,'anyone
: cdrwa
[zk: 172.200.1.101:2181(CONNECTED) 4] 
[zk: 172.200.1.101:2181(CONNECTED) 4] setAcl /kudu ip:172.200.1.102:cdrwa
[zk: 172.200.1.101:2181(CONNECTED) 5] 
[zk: 172.200.1.101:2181(CONNECTED) 5] getAcl /kudu 
Insufficient permission : /kudu
[zk: 172.200.1.101:2181(CONNECTED) 6] 
[zk: 172.200.1.101:2181(CONNECTED) 6] addauth digest admin:yinzhengjie  # 直接使用超级用户登录,发现所有znode咱们都可以处理,有点类似于Linux的root用户,有点霸道!
[zk: 172.200.1.101:2181(CONNECTED) 7] 
[zk: 172.200.1.101:2181(CONNECTED) 7] getAcl /kudu
'ip,'172.200.1.102
: cdrwa
[zk: 172.200.1.101:2181(CONNECTED) 8] 
[zk: 172.200.1.101:2181(CONNECTED) 8] get /kudu
KUDU DATABASE
[zk: 172.200.1.101:2181(CONNECTED) 0] 
谨此笔记,记录过往。凭君阅览,如能收益,莫大奢望。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇