当前位置: 首页 > news >正文

ZooKeeper:enableACL和requireClientSASLAuth

目录标题

  • 🧠 一、ZooKeeper 的两个安全维度
  • 🎯 二、访问控制(ACL)
      • 1)什么是 ACL?
      • 2)ACL 相关的 Scheme(核心)
      • 3)是否开启 ACL
  • 🔐 三、客户端认证(Authentication)
    • 1)Digest 身份认证
      • 使用场景
      • 客户端代码示例
      • ZooKeeper ACL 示例
    • 2)SASL(Kerberos / JAAS)
      • 什么是 SASL
  • 🧾 四、启用 ZooKeeper 客户端认证(基于 SASL)
    • 1)服务端启用 SASL(zoo.cfg)
    • 2)服务端 JAAS
    • 3)客户端 JAAS(示例)
    • 4)连接 ZooKeeper 时启用 SASL
  • 🧩 五、“是否开启权限控制 和 是否开启客户端认证” 的判断
    • 关键结论
      • ❓ “是否开启权限控制?”
      • ❓ “是否开启客户端认证?”
  • 🔎 六、对比整理
  • ⚙️ 七、快速配置示例
    • Digest 版本(简单、无需 Kerberos)
      • 客户端
      • 设置 ACL
    • SASL/Kerberos 版本(企业级)
      • zoo.cfg
      • 服务端 JAAS
      • 客户端 JAAS
  • 🧠 八、典型应用建议
      • 如你要我,我还可以给出:

🧠 一、ZooKeeper 的两个安全维度

ZooKeeper 的安全主要有两个方面:

  1. 访问控制(ACL)— 控制谁能访问、创建/读/写/删除哪些节点
  2. 客户端认证(Authentication)— 识别客户端身份

它们是协同工作的:

  • 客户端认证确定了客户端是谁
  • ACL 权限控制决定了这个身份可以做什么

🎯 二、访问控制(ACL)

1)什么是 ACL?

ACL(Access Control List)是 ZooKeeper 节点上的权限列表,用来限制谁可以对该节点做什么操作。

一个 ACL 项通常包括:

字段描述
scheme权限机制,如worldauthdigestsasl
id身份标识,如用户名、Kerberos principal 等
perms权限掩码,如 READ, WRITE, CREATE, DELETE, ADMIN

ZooKeeper 默认:

世界可见(world:anyone)所有权限

不开启 ACL,相当于任意客户端都能读写所有节点


2)ACL 相关的 Scheme(核心)

scheme说明示例
world所有人world:anyone
auth已认证用户通过客户端认证后才生效
digest基于 username:password需要在 JAAS/客户端设置
sasl基于 SASL/Kerberos需要 Kerberos 身份验证

3)是否开启 ACL

是否开启 ACL = 是否对节点设置权限控制策略

默认 zoo.cfg 不启用任何 ACL。

你可以手工设置 ACL,比如:

# 使用 zkCli.sh 连接setAcl /myapp auth: ,cdrwa

或在程序中:

zk.create("/secure",data,Ids.CREATOR_ALL_ACL,CreateMode.PERSISTENT);

👉因此“是否开启 ACL”不是一个 ZooKeeper 配置参数,而是:

是否对 znodes 设置了 ACL 权限控制

如果所有节点都是默认 world:anyone,则等价于“没有权限控制”。


🔐 三、客户端认证(Authentication)

ACL 控制权限前提是要能区分用户身份,这就需要认证。

ZooKeeper 支持以下认证方案:

方案说明
noauth不认证(默认)
digest用户名+密码
saslKerberos / JAAS

1)Digest 身份认证

使用场景

简单验证机制,适合在不启用 Kerberos 的场景下使用。

客户端代码示例

ZooKeeperzk=newZooKeeper(connectString,3000,watcher);// 添加身份zk.addAuthInfo("digest","username:password".getBytes());

ZooKeeper ACL 示例

setAcl /secure digest:username:hashed-password:cdrwa

密码会被 ZooKeeper 内部 hash 成用户名:base64/sha1


2)SASL(Kerberos / JAAS)

什么是 SASL

SASL 是一种认证框架,它本身不定义身份方式,而是用于将 Kerberos/GSSAPI 等安全机制插入到 ZooKeeper 认证中。

ZooKeeper 官方文档对 SASL 有两部分:

🔗 开启 SASL 认证:
https://zookeeper.apache.org/doc/r3.7.2/zookeeperAdmin.html#sc_authOptions

🔗 ZooKeeper + SASL 原理说明:
https://cwiki.apache.org/confluence/display/ZOOKEEPER/ZooKeeper+and+SASL

SASL 需要:

  • Kerberos KDC
  • JAAS 配置
  • 客户端和服务端均配置 JAAS

🧾 四、启用 ZooKeeper 客户端认证(基于 SASL)

1)服务端启用 SASL(zoo.cfg)

authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider requireClientAuthScheme=sasl

常见用法:

requireClientAuthScheme=sasl

表示:

所有客户端都必须通过 SASL/Kerberos 验证,否则无法连接操作。


2)服务端 JAAS

在 ZooKeeper 服务器启动时指定:

-Djava.security.auth.login.config=/opt/zookeeper/conf/zookeeper_jaas.conf

内容示例:

Server { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true keyTab="/etc/security/zookeeper.service.keytab" principal="zookeeper/zkserver.example.com@EXAMPLE.COM"; };

3)客户端 JAAS(示例)

ZooKeeper 客户端需要自己的 JAAS:

例如 krb5.conf + client_jaas.conf:

Client { com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true renewTGT=true ; };

或使用 keytab:

Client { com.sun.security.auth.module.Krb5LoginModule required keyTab="/etc/security/client.keytab" principal="client@EXAMPLE.COM"; };

4)连接 ZooKeeper 时启用 SASL

启动客户端 Java 进程时:

-Djava.security.auth.login.config=/path/client_jaas.conf -Dzookeeper.sasl.client=true

🧩 五、“是否开启权限控制 和 是否开启客户端认证” 的判断

配置是否开启
无 ACL 设置,并且无认证❌ 没有权限控制
有 ACL(如 digest 或 sasl)✔️ 权限控制生效
有 SASL 客户端认证✔️ 客户端可认证身份
requireClientAuthScheme=sasl✔️ 强制客户端必须认证

关键结论

❓ “是否开启权限控制?”

不是 ZooKeeper 配置项开关,而是你是否对 ZooKeeper 节点设置了 ACL。

  • 默认:所有节点无 ACL(world:anyone) → 不受权限控制
  • 设置了 ACL(digest 或 sasl) → 开启了权限控制

❓ “是否开启客户端认证?”

取决于 ZooKeeper 是否启用了客户端认证机制(digest/SASL/Kerberos)

  • digest:按用户名密码认证
  • sasl/kerberos:企业级认证、需要 JAAS

🔎 六、对比整理

项目默认值意义
ACLworld:anyone无权限控制
requireClientAuthSchemenone客户端可以非认证地连接
客户端认证disabled不要求身份验证

⚙️ 七、快速配置示例

Digest 版本(简单、无需 Kerberos)

客户端

zk.addAuthInfo("digest","user1:pass1".getBytes());

设置 ACL

setAcl /app digest:user1:hashed:crwda

SASL/Kerberos 版本(企业级)

zoo.cfg

authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider requireClientAuthScheme=sasl

服务端 JAAS

Server { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true keyTab="/etc/security/zookeeper.keytab" principal="zookeeper/zk.example.com@EXAMPLE.COM"; };

客户端 JAAS

Client { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true keyTab="/etc/security/client.keytab" principal="client@EXAMPLE.COM"; };

🧠 八、典型应用建议

简单小集群/开发测试

  • 使用 digest 身份验证 + ACL

生产/企业环境

  • 使用 SASL/Kerberos + 细粒度 ACL
  • 强制requireClientAuthScheme=sasl

如你要我,我还可以给出:

✔ ZooKeeper 与 Kafka/Spark/Hadoop 的安全联动
✔ ACL 权限设计策略示例
✔ 使用 ACL 的常见问题排查
✔ ZooKeeper 安全测试工具


http://www.cnnetsun.cn/news/116065.html

相关文章:

  • 为什么K8s 1.24 的容器时间调整会影响宿主机的时间啊?
  • AI时代核心竞争力:手写多智能体系统,不依赖LangChain/LlamaIndex
  • WebSocket 对比 MQTT通信优势
  • 基于springboot面料花型试衣系统
  • 域名被污染是什么意思?还能不能继续使用?
  • Python大数据基于深度学习的音乐推荐系统-250326--论文
  • Python大数据影评情感分析可视化及推荐系统的设计与实现_u5ck1y17_论文
  • AI Agent设计模式大揭秘:9种架构让你从编程小白变身架构师!
  • Python大数据基于Spark的南昌房价数据分析系统的设计与实现_45i0b357_论文
  • 9 个降AI率工具,自考人必备的降重神器!
  • 9 个降AI率工具,自考人必备!
  • 旅行记录应用新建旅行 - Cordova OpenHarmony 混合开发实战
  • 9 个降AI率工具推荐,继续教育学生必备
  • Java八股文(Java基础面试题)
  • 邦芒忠告:职场中没有好人缘的10种人
  • 基于Spring Boot人才招聘管理系统
  • 拒绝“魔法值”注入:手把手教你实现 Spring Boot 高性能枚举校验注解 @InEnum
  • 国内容易上手的claudecode一键配置指南
  • 复原IP地址
  • Redis 发布订阅
  • JQuery支持WebUploader完成百万文件断点续传的原理?
  • Vue3如何结合组件实现大文件分片的并行上传优化?
  • 类型分布统计-Cordovaopenharmony多维分析实战
  • 四时四名,一山万象:朝鲜金刚山的锦绣风姿
  • 基于Spring Boot的果蔬销售系统
  • Scala Collection(集合)
  • 介观交通流仿真软件:DynusT_(11).交通事件管理
  • django基于Python天气分析系统
  • python基于大数据的分析长沙旅游景点推荐系统
  • 基于Django的学分管理系统