美文网首页
zookeeper权限acl与四字命令

zookeeper权限acl与四字命令

作者: yandaren | 来源:发表于2018-09-25 14:22 被阅读0次

    本文转载自51CTO博客作者ZeroOne01zookeeper权限acl与四字命令


    权限acl介绍,acl的构成与id

    acl是Access control lists 的缩写,也就是权限控制列表:

    • 针对节点可以设置相关读写等权限,目的是为了保障数据安全性
    • 权限permissions可以指定不同的权限范围以及角色

    acl的构成:

    • zk的acl通过 [scheme:id:permissions] 来构成权限列表:
      • scheme:代表采用的某种权限机制
      • id:代表允许访问的用户
      • permissions:权限组合字符串

    acl的构成-scheme,scheme有以下几种类型:

    • world:world下只有一个id,即只有一个用户,也就是anyone,那么组合的写法就是 world:anyone:[permissions]
    • ip:当设置为ip指定的ip地址,此时限制ip进行访问,比如ip:192.168.77.130:[permissions]
    • auth:代表认证登录,需要注册用户获取权限后才可以登录访问,形式为 auth:userpassword:[permissions]
    • digest:需要对密码加密才能访问,组合形式为:digest:username:BASE64(SHA1(username:password)):[permissions]
      • auth与digest的区别就是,前者使用明文密码进行登录,后者使用密文密码进行登录。setAcl /path auth:lee:lee:cdrwa 与 setAcl /path digest:lee:BASE64(SHA1(username:password)):cdrwa是等价的,在通过 addauth digest lee:lee 后都能操作指定节点的权限。在实际情况中,digest要更为常用一些。
    • super:代表超级管理员,拥有所有的权限

    acl的构成-permissions:

    • 权限字符串缩写 crdwa :
      • CREATE:创建子节点权限
      • READ:访问节点/子节点权限
      • WRITE:设置节点数据权限
      • DELETE:删除子节点权限
      • ADMIN:管理员权限

    acl命令:

    • getAcl 获取某个节点的acl权限信息
    • setAcl 设置某个节点的acl权限信息
    • addauth 输入认证授权信息,注册时输入明文密码(登录),但是在zk的系统里,密码是以加密后的形式存在的

    acl命令行world

    使用 getAcl 命令获取某个节点的acl权限信息,示例:

    [root@study-01 ~]# zkCli.sh
    [zk: localhost:2181(CONNECTED) 5] create /testDir/testAcl test-data  # 创建一个子节点
    Created /testDir/testAcl
    [zk: localhost:2181(CONNECTED) 6] getAcl /testDir/testAcl  # 获取该节点的acl权限信息
    'world,'anyone  # 默认为world
    : cdrwa
    [zk: localhost:2181(CONNECTED) 7]
    

    使用 setAcl 命令设置某个节点的acl权限信息,示例:

    [zk: localhost:2181(CONNECTED) 7] setAcl /testDir/testAcl world:anyone:crwa  # 设置该节点的acl权限
    cZxid = 0x26
    ctime = Mon Apr 23 17:28:30 CST 2018
    mZxid = 0x26
    mtime = Mon Apr 23 17:28:30 CST 2018
    pZxid = 0x26
    cversion = 0
    dataVersion = 0
    aclVersion = 1
    ephemeralOwner = 0x0
    dataLength = 9
    numChildren = 0
    [zk: localhost:2181(CONNECTED) 8] getAcl /testDir/testAcl                  
    'world,'anyone
    : crwa   # 设置成功后,该节点就少了d权限
    [zk: localhost:2181(CONNECTED) 9] create /testDir/testAcl/xyz xyz-data  # 创建子节点
    Created /testDir/testAcl/xyz
    [zk: localhost:2181(CONNECTED) 10] delete /testDir/testAcl/xyz  # 删除该子节点
    Authentication is not valid : /testDir/testAcl/xyz  # 由于没有d权限,所以提示无法删除
    [zk: localhost:2181(CONNECTED) 11]
    

    设置其他的权限也是如此,在此就不做演示了。


    acl命令行auth

    使用auth来设置权限的时候,需要在zk里注册一个用户才可以。示例:

    [zk: localhost:2181(CONNECTED) 11] addauth digest user1:123456   # 需要先添加一个用户
    [zk: localhost:2181(CONNECTED) 12] setAcl /testDir/testAcl auth:user1:123456:crwa  # 然后才可以拿着这个用户去设置权限
    cZxid = 0x26
    ctime = Mon Apr 23 17:28:30 CST 2018
    mZxid = 0x26
    mtime = Mon Apr 23 17:28:30 CST 2018
    pZxid = 0x28
    cversion = 1
    dataVersion = 0
    aclVersion = 2
    ephemeralOwner = 0x0
    dataLength = 9
    numChildren = 1
    [zk: localhost:2181(CONNECTED) 14] getAcl /testDir/testAcl
    'digest,'user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s=  # 密码是以密文的形式存储的
    : crwa
    [zk: localhost:2181(CONNECTED) 15] 
    

    如果设置了权限后,再次进行设置,就可以不用加上用户名和密码了。而且就算是使用其他用户进行设置,也只会根据第一次设置的用户来进行配置:

    [zk: localhost:2181(CONNECTED) 16] setAcl /testDir/testAcl auth::crw
    [zk: localhost:2181(CONNECTED) 16] setAcl /testDir/testAcl auth:test:test:crw
    [zk: localhost:2181(CONNECTED) 14] getAcl /testDir/testAcl
    'digest,'user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s=  # 依旧是第一次设置的用户
    : crwa
    [zk: localhost:2181(CONNECTED) 15] 
    

    acl命令行digest

    由于之前使用auth做实验的时候已经登录了用户 ,所以在使用digest做实验前,需要先退出一下客户端,再重新连接,这样之前登录的用户就会自动退出。退出用户后才能使用digest设置权限,示例:

    [zk: localhost:2181(CONNECTED) 5] create /names/testDigest digest-data  # 创建子节点
    Created /names/testDigest
    [zk: localhost:2181(CONNECTED) 6] addauth digest user1:123456  # 添加用户
    [zk: localhost:2181(CONNECTED) 8] getAcl /names/testDigest 
    'world,'anyone
    : cdrwa
    [zk: localhost:2181(CONNECTED) 3] setAcl /names/testDigest digest:user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s=:crwa   # 使用digest来设置权限
    cZxid = 0x3a
    ctime = Mon Apr 23 20:40:11 CST 2018
    mZxid = 0x3a
    mtime = Mon Apr 23 20:40:11 CST 2018
    pZxid = 0x3a
    cversion = 0
    dataVersion = 0
    aclVersion = 1
    ephemeralOwner = 0x0
    dataLength = 11
    numChildren = 0
    [zk: localhost:2181(CONNECTED) 11] getAcl /names/testDigest
    'digest,'user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s=
    : crwa
    [zk: localhost:2181(CONNECTED) 12] 
    

    可以看到,digest和auth除了一个使用明文一个使用密文之外,其他都是一致的,所以它俩的区别就只是密文和明文的区别。在线上环境中,一般使用digest比较多,因为密文安全一些。


    acl命令行ip

    这种方式和限制ip是一样的,就是设置只允许某一个ip有权限操作。示例:

    [zk: localhost:2181(CONNECTED) 1] create /names/testip ip-data   创建子节点
    Created /names/testip
    [zk: localhost:2181(CONNECTED) 2] getAcl /names/testip
    'world,'anyone
    : cdrwa
    [zk: localhost:2181(CONNECTED) 4] setAcl /names/testip ip:192.168.190.129:cdrwa  # 使用ip来设置权限
    cZxid = 0x46
    ctime = Mon Apr 23 20:55:43 CST 2018
    mZxid = 0x46
    mtime = Mon Apr 23 20:55:43 CST 2018
    pZxid = 0x46
    cversion = 0
    dataVersion = 0
    aclVersion = 1
    ephemeralOwner = 0x0
    dataLength = 7
    numChildren = 0
    [zk: localhost:2181(CONNECTED) 5] getAcl /names/testip
    'ip,'192.168.190.129   # 只允许这个ip拥有该节点的cdrwa权限
    : cdrwa
    [zk: localhost:2181(CONNECTED) 6] get /names/testip
    ip-data
    cZxid = 0x46
    ctime = Mon Apr 23 20:55:43 CST 2018
    mZxid = 0x46
    mtime = Mon Apr 23 20:55:43 CST 2018
    pZxid = 0x46
    cversion = 0
    dataVersion = 0
    aclVersion = 1
    ephemeralOwner = 0x0
    dataLength = 7
    numChildren = 0
    [zk: localhost:2181(CONNECTED) 6] 
    

    acl命令行super超级管理员

    基本所有的系统都会拥有一个超级管理员用户,zk也不例外。当我们给一些节点设置了权限,但是却发现设置错误了,导致节点无法正常访问,那么这时候普通用户是无法解决这种问题的,只能使用超级管理员用户来重新设置权限或删除节点。所以本节简单演示一下,如何配置管理员用户:

    1.修改 zkServer.sh 增加super管理员:

    [root@study-01 ~]# cd /usr/local/zookeeper-3.4.11/bin/
    [root@study-01 /usr/local/zookeeper-3.4.11/bin]# vim zkServer.sh  # 找到nohup那一行,加入以下内容
    "-Dzookeeper.DigestAuthenticationProvider.superDigest=user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s="
    [root@study-01 /usr/local/zookeeper-3.4.11/bin]# 
    

    注:user1是用户名,后面那一大串是加密后的密文密码

    如下图:


    zookeeper权限acl与四字命令

    2.修改完之后,需要重启zookeeper服务才能生效 :

    [root@study-01 /usr/local/zookeeper-3.4.11/bin]# ./zkServer.sh restart
    

    使用超级管理员用户:

    [root@study-01 ~]# zkCli.sh
    [zk: localhost:2181(CONNECTED) 9] ls /names/ip  # ls一个无权限的节点
    Authentication is not valid : /names/ip   # 可以看到,权限不够
    [zk: localhost:2181(CONNECTED) 10] addauth digest user1:123456  # 登录超级管理员用户,这里登录用的是明文密码
    [zk: localhost:2181(CONNECTED) 11] ls /names/ip  # 然后再次ls
    []   # 这次就可以ls到了
    [zk: localhost:2181(CONNECTED) 12] get /names/ip   # 也可以get信息
    ip-data
    cZxid = 0x51
    ctime = Mon Apr 23 21:02:42 CST 2018
    mZxid = 0x51
    mtime = Mon Apr 23 21:02:42 CST 2018
    pZxid = 0x51
    cversion = 0
    dataVersion = 0
    aclVersion = 1
    ephemeralOwner = 0x0
    dataLength = 7
    numChildren = 0
    [zk: localhost:2181(CONNECTED) 13] delete /names/testip  # 删除节点也可以
    [zk: localhost:2181(CONNECTED) 14] 
    

    acl的常用使用场景

    1. 开发/测试环境分离,开发者无权操作测试库的节点,只能读取
    2. 生产环境上控制指定ip的服务可以访问相关的节点,防止混乱

    zk四字命令

    zk四字命令 Four Letter Words:

    • zk可以通过它自身提供的简写命令来和服务器进行交互
    • 需要使用到nc命令,安装命令:yum install nc
    • 命令格式:echo [commond] | nc [ip] [port]

    官方文档地址如下:

    http://zookeeper.apache.org/doc/r3.4.11/zookeeperAdmin.html#sc_zkCommands

    简单介绍一些常用的zk四字命令:

    1.[stat] 查看zk的状态信息,以及是否mode。示例:

    [root@study-01 ~]# echo stat |nc 192.168.190.129 2181
    Zookeeper version: 3.4.11-37e277162d567b55a07d1755f0b31c32e93c01a0, built on 11/01/2017 18:06 GMT
    Clients:
     /192.168.190.129:34268[0](queued=0,recved=1,sent=0)
    
    Latency min/avg/max: 0/0/4
    Received: 117
    Sent: 116
    Connections: 1
    Outstanding: 0
    Zxid: 0x58
    Mode: standalone
    Node count: 16
    [root@study-01 ~]# 
    

    2.[ruok] 查看当前zkserver是否启动,已启动的话就会返回imok。示例:

    [root@study-01 ~]# echo ruok |nc 192.168.190.129 2181
    imok
    [root@study-01 ~]#
    

    3.[dump] 列出未经处理的会话和临时节点。示例:

    [root@study-01 ~]# echo dump |nc 192.168.190.129 2181
    SessionTracker dump:
    Session Sets (0):
    ephemeral nodes dump:
    Sessions with Ephemerals (0):
    [root@study-01 ~]# 
    

    4.[conf] 查看服务器配置。示例:

    [root@study-01 ~]# echo conf |nc 192.168.190.129 2181
    clientPort=2181
    dataDir=/usr/local/zookeeper-3.4.11/dataDir/version-2
    dataLogDir=/usr/local/zookeeper-3.4.11/dataLogDir/version-2
    tickTime=2000
    maxClientCnxns=60
    minSessionTimeout=4000
    maxSessionTimeout=40000
    serverId=0
    [root@study-01 ~]# 
    

    5.[cons] 展示连接到服务器的客户端信息。示例:

    [root@study-01 ~]# echo cons |nc 192.168.190.129 2181
     /127.0.0.1:41152[1](queued=0,recved=2,sent=2,sid=0x10001004ed60001,lop=PING,est=1524493375316,to=30000,lcxid=0x0,lzxid=0x59,lresp=19999999,llat=0,minlat=0,avglat=1,maxlat=2)
     /192.168.190.129:34277[0](queued=0,recved=1,sent=0)
    
    [root@study-01 ~]# 
    

    6.[envi] 查看环境变量。示例:

    [root@study-01 ~]# echo envi |nc 192.168.190.129 2181
    Environment:
    zookeeper.version=3.4.11-37e277162d567b55a07d1755f0b31c32e93c01a0, built on 11/01/2017 18:06 GMT
    host.name=localhost
    java.version=1.8.0_161
    java.vendor=Oracle Corporation
    java.home=/usr/local/jdk1.8/jre
    java.class.path=/usr/local/zookeeper-3.4.11/bin/../build/classes:/usr/local/zookeeper-3.4.11/bin/../build/lib/*.jar:/usr/local/zookeeper-3.4.11/bin/../lib/slf4j-log4j12-1.6.1.jar:/usr/local/zookeeper-3.4.11/bin/../lib/slf4j-api-1.6.1.jar:/usr/local/zookeeper-3.4.11/bin/../lib/netty-3.10.5.Final.jar:/usr/local/zookeeper-3.4.11/bin/../lib/log4j-1.2.16.jar:/usr/local/zookeeper-3.4.11/bin/../lib/jline-0.9.94.jar:/usr/local/zookeeper-3.4.11/bin/../lib/audience-annotations-0.5.0.jar:/usr/local/zookeeper-3.4.11/bin/../zookeeper-3.4.11.jar:/usr/local/zookeeper-3.4.11/bin/../src/java/lib/*.jar:/usr/local/zookeeper-3.4.11/bin/../conf:
    java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
    java.io.tmpdir=/tmp
    java.compiler=<NA>
    os.name=Linux
    os.arch=amd64
    os.version=3.10.0-327.el7.x86_64
    user.name=root
    user.home=/root
    user.dir=/usr/local/zookeeper-3.4.11/bin
    [root@study-01 ~]# 
    

    7.[mntr] 监控zk健康信息。示例:

    [root@study-01 ~]# echo mntr |nc 192.168.190.129 2181
    zk_version  3.4.11-37e277162d567b55a07d1755f0b31c32e93c01a0, built on 11/01/2017 18:06 GMT
    zk_avg_latency  0
    zk_max_latency  4
    zk_min_latency  0
    zk_packets_received 169
    zk_packets_sent 168
    zk_num_alive_connections    2
    zk_outstanding_requests 0
    zk_server_state standalone
    zk_znode_count  16
    zk_watch_count  0
    zk_ephemerals_count 0
    zk_approximate_data_size    305
    zk_open_file_descriptor_count   31
    zk_max_file_descriptor_count    4096
    [root@study-01 ~]# 
    

    8.[wchs] 展示watch的信息。示例:

    [root@study-01 ~]# echo wchs |nc 192.168.190.129 2181
    1 connections watching 1 paths
    Total watches:1
    [root@study-01 ~]# 
    

    9.[wchc] 展示session与watch信息。在3.4.10之后的版本中,wchc和wchp不再是白名单列表里的命令,需要使用这两个命令的话,得进行一个配置。示例:

    [root@study-01 ~]# echo wchc |nc 192.168.190.129 2181
    wchc is not executed because it is not in the whitelist.  # 可以看到,提示这是不在白名单列表里的命令
    [root@study-01 ~]# cd /usr/local/zookeeper-3.4.11/conf/
    [root@study-01 /usr/local/zookeeper-3.4.11/conf]# vim zoo.cfg   # 在文件末尾添加如下内容
    4lw.commands.whitelist=*
    [root@study-01 /usr/local/zookeeper-3.4.11/conf]# cd 
    [root@study-01 ~]# zkServer.sh restart  # 重启zk服务
    [root@study-01 ~]# echo wchc |nc 192.168.190.129 2181  # 这时就可以使用了
    0x10001004ed60001
        /names
    
    [root@study-01 ~]# 
    
    

    10.[wchp] 展示watch与path信息。示例:

    [root@study-01 ~]# echo wchp |nc 192.168.190.129 2181
    /names
        0x10001004ed60001
    
    [root@study-01 ~]# 
    

    相关文章

      网友评论

          本文标题:zookeeper权限acl与四字命令

          本文链接:https://www.haomeiwen.com/subject/rbqloftx.html