zoukankan      html  css  js  c++  java
  • 四、zookeeper的Acl权限控制

    一、概述

      zookeeper 类似文件系统,client 可以创建节点、更新节点、删除节点,那么如何做到节点的权限的控制呢?zookeeper的access control list 访问控制列表可以做到这一点。

    # 语法
    # 采用特定的授权策略给特定的对象授予特定的权限
    setAcl path acl

      acl 权限控制,使用scheme:id:permission 来标识,主要涵盖 3 个方面:

      • 权限模式(scheme):授权的策略,

      • 授权对象(id):授权的对象

      • 权限(permission):授予的权限

      所以最总语法是

    setAcl path scheme:id:permission

      其特性如下:

      • zooKeeper的权限控制是基于每个znode节点的,需要对每个节点设置权限

      • 每个znode支持设置多种权限控制方案和多个权限

      • 子节点不会继承父节点的权限,客户端无权访问某节点,但可能可以访问它的子节点

    # 将节点权限设置为Ip:192.168.60.130的客户端可以对节点进行增、删、改、查、管理权限
    setAcl /test2 ip:192.168.60.130:crwda

    二、权限模式

    方案描述
    world 它下面只有一个id, 叫anyone, world:anyone代表任何人,zookeeper中对所有人有权限的结点就是属于world:anyone的
    ip 它对应的id为客户机的IP地址,设置的时候可以设置一个ip段,比如ip:192.168.1.0/16, 表示匹配前16个bit的IP段
    auth 它不需要id, 只要是通过authentication的user都有权限(zookeeper支持通过kerberos来进行authencation, 也支持username/password形式的authentication)
    digest 它对应的id为username:BASE64(SHA1(password)),它需要先通过username:password形式的authentication
    super 在这种scheme情况下,对应的id拥有超级权限,可以做任何事情(cdrwa)

    三、授权的对象

      授权对象ID是指,权限赋予的用户或者一个实体,例如:IP 地址或者机器。授权模式 schema 与 授权对象 ID 之间

    四、授予的权限

      授予什么权限

      create、delete、read、writer、admin也就是 增、删、改、查、管理权限,这5种权限简写为cdrwa,注意:这5种权限中,delete是指对子节点的删除权限,其它4种权限指对自身节点的操作权限

    权限ACL简写描述
    create c 可以创建子节点
    delete d 可以删除子节点(仅下一级节点)
    read r 可以读取节点数据及显示子节点列表
    write w 可以设置节点数据
    admin a 可以设置节点访问控制列表权限

    五、授权的相关命令

    命令使用方式描述
    getAcl getAcl path 读取ACL权限
    setAcl setAcl path acl 设置ACL权限
    addauth addauth scheme auth 添加认证用户

    六、案例

    6.1、world授权模式

    # 命令
    setAcl <path> world:anyone:<acl>
    # 案例
    [zk: localhost:2181(CONNECTED) 1] create /node1 "node1"
    Created /node1
    
    [zk: localhost:2181(CONNECTED) 2] getAcl /node1
    'world,'anyone #world方式对所有用户进行授权
    : cdrwa #增、删、改、查、管理
    
    #针对所有用户,node1节点添加增、删、改、查、管理权限
    [zk: localhost:2181(CONNECTED) 3] setAcl /node1 world:anyone:cdrwa
    cZxid = 0x2
    ctime = Fri Dec 13 22:25:24 CST 2019
    mZxid = 0x2
    mtime = Fri Dec 13 22:25:24 CST 2019
    pZxid = 0x2
    cversion = 0
    dataVersion = 0
    aclVersion = 1
    ephemeralOwner = 0x0
    dataLength = 5
    numChildren = 0

    6.2、IP授权模式

    #命令
    setAcl path ip:<ip>:<acl>
    # 案例
    [zk: localhost:2181(CONNECTED) 18] create /node2 "node2"
    Created /node2
    
    [zk: localhost:2181(CONNECTED) 23] setAcl /node2 ip:192.168.60.129:cdrwa
    cZxid = 0xe
    ctime = Fri Dec 13 22:30:29 CST 2019
    mZxid = 0x10
    mtime = Fri Dec 13 22:33:36 CST 2019
    pZxid = 0xe
    cversion = 0
    dataVersion = 2
    aclVersion = 1
    ephemeralOwner = 0x0
    dataLength = 20
    numChildren = 0
    
    [zk: localhost:2181(CONNECTED) 25] getAcl /node2
    'ip,'192.168.60.129
    : cdrwa
    
    #使用IP非 192.168.60.129 的机器
    [zk: localhost:2181(CONNECTED) 0] get /node2
    Authentication is not valid : /node2 #没有权限

    6.3、Auth授权模式

    # 命令
    addauth digest <user>:<password> #添加认证用户
    setAcl <path> auth:<user>:<acl>
    # 案例
    [zk: localhost:2181(CONNECTED) 2] create /node3 "node3"
    Created /node3
    # 添加认证用户
    [zk: localhost:2181(CONNECTED) 4] addauth digest jdy:jdy
    # 授权
    [zk: localhost:2181(CONNECTED) 1] setAcl /node3 auth:jdy:cdrwa
    cZxid = 0x15
    ctime = Fri Dec 13 22:41:04 CST 2019
    mZxid = 0x15
    mtime = Fri Dec 13 22:41:04 CST 2019
    pZxid = 0x15
    cversion = 0
    dataVersion = 0
    aclVersion = 1
    ephemeralOwner = 0x0
    dataLength = 5
    numChildren = 0
    # 读取授权
    [zk: localhost:2181(CONNECTED) 0] getAcl /node3
    'digest,'jdy:673OfZhUE8JEFMcu0l64qI8e5ek=
    : cdrwa
    
    #添加认证用户后可以访问
    [zk: localhost:2181(CONNECTED) 3] get /node3
    node3
    cZxid = 0x15
    ctime = Fri Dec 13 22:41:04 CST 2019
    mZxid = 0x15
    mtime = Fri Dec 13 22:41:04 CST 2019
    pZxid = 0x15
    cversion = 0
    dataVersion = 0
    aclVersion = 1
    ephemeralOwner = 0x0
    dataLength = 5
    numChildren = 0

    6.4、Digest授权模式

    # 命令
    setAcl <path> digest:<user>:<password>:<acl>

      这里的密码是经过SHA1及BASE64处理的密文,在SHELL中可以通过以下命令计算:

    echo -n <user>:<password> | openssl dgst -binary -sha1 | openssl base64

      先来计算一个密文

    [root@zk01 ~]# echo -n jdy:jdy| openssl dgst -binary -sha1 | openssl base64
    BhwOl0WhKp+5Ye5iko6OtjC4Euk=

    # 案例
    [zk: localhost:2181(CONNECTED) 4] create /node4 "node4"
    Created /node4
    
    #使用是上面算好的密文密码添加权限:
    [zk: localhost:2181(CONNECTED) 5] setAcl /node4 digest:jdy:BhwOl0WhKp+5Ye5iko6OtjC4Euk=:cdrwa
    cZxid = 0x1c
    ctime = Fri Dec 13 22:52:21 CST 2019
    mZxid = 0x1c
    mtime = Fri Dec 13 22:52:21 CST 2019
    pZxid = 0x1c
    cversion = 0
    dataVersion = 0
    aclVersion = 1
    ephemeralOwner = 0x0
    dataLength = 5
    numChildren = 0
    # 读取权限
    [zk: localhost:2181(CONNECTED) 6] getAcl /node4
    'digest,'jdy:BhwOl0WhKp+5Ye5iko6OtjC4Euk=
    : cdrwa
    [zk: localhost:2181(CONNECTED) 3] get /node4
    Authentication is not valid : /node4 #没有权限
    #添加
    [zk: localhost:2181(CONNECTED) 4] addauth digest jdy:123456 
    
    # 认证用户
    [zk: localhost:2181(CONNECTED) 5] get /node4
    
    #成功读取数据
    cZxid = 0x1c
    ctime = Fri Dec 13 22:52:21 CST 2019
    mZxid = 0x1c
    mtime = Fri Dec 13 22:52:21 CST 2019
    pZxid = 0x1c
    cversion = 0
    dataVersion = 0
    aclVersion = 1
    ephemeralOwner = 0x0
    dataLength = 5
    numChildren = 0

    6.5、多种模式授权

      同一个节点可以同时使用多种模式授权

    [zk: localhost:2181(CONNECTED) 0] create /node5 "node5"
    Created /node5
    #添加认证用户
    [zk: localhost:2181(CONNECTED) 1] addauth digest jdy:123456 
    [zk: localhost:2181(CONNECTED) 2] setAcl /node5 ip:192.168.60.129:cdra,auth:jdy:cdrwa,digest:jdy:qlzQzCLKhBROghkooLvb+Mlwv4A=:cdrwa

    七、acl 超级管理员

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

      假设这个超管是:super:admin,需要先为超管生成密码的密文。

    echo -n super:admin | openssl dgst -binary -sha1 | openssl base64

      那么打开zookeeper目录下的/bin/zkServer.sh服务器脚本文件,找到如下一行:

    nohup $JAVA "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-
    Dzookeeper.root.logger=${ZOO_LOG4J_PROP}"

      这就是脚本中启动zookeeper的命令,默认只有以上两个配置项,我们需要加一个超管的配置项。

    "-
    Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBv
    st5y6rkB6HQs="

      那么修改以后这条完整命令变成了

      之后启动zookeeper,输入如下命令添加权限

    addauth digest super:admin #添加认证用户
  • 相关阅读:
    LeetCode 88. Merge Sorted Array
    LeetCode 75. Sort Colors
    LeetCode 581. Shortest Unsorted Continuous Subarray
    LeetCode 20. Valid Parentheses
    LeetCode 53. Maximum Subarray
    LeetCode 461. Hamming Distance
    LeetCode 448. Find All Numbers Disappeared in an Array
    LeetCode 976. Largest Perimeter Triangle
    LeetCode 1295. Find Numbers with Even Number of Digits
    如何自学并且系统学习计算机网络?(知乎问答)
  • 原文地址:https://www.cnblogs.com/jdy1022/p/14820972.html
Copyright © 2011-2022 走看看