【问题标题】:How to access a protected znode from ZooKeeper using zkCli?如何使用 zkCli 从 ZooKeeper 访问受保护的 znode?
【发布时间】:2021-09-08 05:37:58
【问题描述】:

我使用以下方法创建了一个 znode:

zookeeper-0:/opt/zookeeper/bin # ./zkCli.sh create /mynode content digest:user:pass:cdrwa

现在如何使用 zkCli.sh 工具访问 znode?​​p>

zookeeper-0:/opt/zookeeper/bin # ./zkCli.sh get /mynode
Connecting to localhost:2181

WATCHER::

WatchedEvent state:SyncConnected type:None path:null
Authentication is not valid : /mynode
zookeeper-0:/opt/zookeeper/bin #

getAcl 显示如下:

zookeeper-0:/opt/zookeeper/bin # ./zkCli.sh getAcl /mynode
Connecting to localhost:2181

WATCHER::

WatchedEvent state:SyncConnected type:None path:null
'digest,'user:pass
: cdrwa
zookeeper-0:/opt/zookeeper/bin #

【问题讨论】:

    标签: apache-zookeeper


    【解决方案1】:

    您需要使用散列密码创建摘要 ACL。

    ZooKeeper Programmer's Guide

    digest 使用用户名:密码字符串生成 MD5 哈希,然后将其用作 ACL ID 身份。通过以明文形式发送用户名:密码来完成身份验证。在 ACL 中使用时,表达式将是 username:base64 编码的 SHA1 密码摘要。

    生成哈希密码

    $ java -cp "./zookeeper-3.4.13.jar:./lib/slf4j-api-1.7.25.jar" \
    org.apache.zookeeper.server.auth.DigestAuthenticationProvider user:pass
    SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
    SLF4J: Defaulting to no-operation (NOP) logger implementation
    SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
    user:pass->user:smGaoVKd/cQkjm7b88GyorAUz20=
    

    使用散列密码创建节点

    [zk: zookeeper(CONNECTED) 0] create /mynode content digest:user:smGaoVKd/cQkjm7b88GyorAUz20=:cdrwa
    Created /mynode
    

    访问受保护节点

    [zk: zookeeper(CONNECTED) 1] get /mynode
    Authentication is not valid : /mynode
    [zk: zookeeper(CONNECTED) 2] addauth digest user:pass
    [zk: zookeeper(CONNECTED) 3] get /mynode
    content
    cZxid = 0x14
    ctime = Wed Sep 12 19:37:48 GMT 2018
    mZxid = 0x14
    mtime = Wed Sep 12 19:37:48 GMT 2018
    pZxid = 0x14
    cversion = 0
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 7
    numChildren = 0
    

    【讨论】:

    • 感谢您的回答但是,我仍然遇到问题,当我使用单个会话时它工作正常。例如, [zk: localhost:2181(CONNECTED) 1] addauth digest user:pass [zk: localhost:2181(CONNECTED) 2] get /mynode 内容工作正常,但是,当我尝试按如下方式获取它时—— zookeeper-0:/opt/zookeeper/bin # ./zkCli.sh addauth digest user:pass Connecting to localhost:2181 zookeeper-0:/opt/zookeeper/bin # ./zkCli.sh get /mynode :Authentication is not valid : /mynode zookeeper-0:/opt/zookeeper/bin #
    • @dgm 那是因为您需要为每个会话进行身份验证,如果您想通过它一步,您可以将您的命令放在一个文件中,然后重定向 zkCli.sh <commands 或用一个管道将它们班轮printf "addauth digest user:pass\nget /mynode | zkCli.sh",尽管将密码存储在文件中或将其作为参数包含在命令中通常不是一个好主意
    【解决方案2】:

    如果您查看 zkcli.sh 脚本的内容,您将看到一个注释掉的块,显示如何使用凭据配置环境变量:

    #SOLR_ZK_CREDS_AND_ACLS="-DzkACLProvider=org.apache.solr.common.cloud.VMParamsAllAndReadonlyDigestZkACLProvider \
    #  -DzkCredentialsProvider=org.apache.solr.common.cloud.VMParamsSingleSetCredentialsDigestZkCredentialsProvider \
    #  -DzkDigestUsername=admin-user -DzkDigestPassword=CHANGEME-ADMIN-PASSWORD \
    #  -DzkDigestReadonlyUsername=readonly-user -DzkDigestReadonlyPassword=CHANGEME-READONLY-PASSWORD"
    

    您可以按照此模板使用正确的凭据在本地系统上配置环境变量 SOLR_ZK_CREDS_AND_ACLS,然后 zkcli.sh 脚本将在与 ZooKeeper 通信时使用它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-09
      • 2018-07-22
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 2016-03-26
      • 2013-02-05
      • 1970-01-01
      相关资源
      最近更新 更多