11.4.5 认证方式与常见配置

ZooKeeper 的认证通过“身份(Identity)+权限(Permission)”组合实现。客户端建立会话后调用 addAuthInfo 绑定认证信息,随后对节点执行 ACL 控制的读写、创建、删除与管理操作。未认证时仅受 world:anyone 约束。下图展示认证与 ACL 生效流程。

文章图片

常见认证方式与适用场景:
- world:匿名身份,适合只读公开配置,不建议用于生产写入。
- auth:会话已认证身份集合,通常与 digest/sasl 配合。
- digest:用户名:密码 摘要认证,配置简单,最常用。
- ip:基于来源 IP 控制访问,适合内网准入与分段隔离。
- sasl:基于 Kerberos,适合高合规与多租户。

digest 认证完整示例(含命令解释与预期效果)#

1)生成 digest 摘要(服务端/运维侧生成 ACL 使用):

# 进入 ZooKeeper 安装目录
cd /opt/zookeeper

# 使用 Java 工具类生成摘要,输出形如 user:base64(sha1(user:pass))
# 说明:-cp 指定 zookeeper.jar;main 为 DigestAuthenticationProvider
java -cp zookeeper.jar:lib/* \
  org.apache.zookeeper.server.auth.DigestAuthenticationProvider \
  app:App@123

预期输出示例(用于 ACL):

app:1fQw7T2w3N4y9kT6yX9yVQx9o0s=

2)设置 ACL 并创建节点(使用 zkCli.sh):

# 连接到 ZooKeeper
/opt/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181

# 绑定认证信息(解释:digest 方案,明文 user:pass)
addauth digest app:App@123

# 创建节点并设置 ACL(解释:cdrwa=创建/删除/读/写/管理)
create /apps/secure "v1" digest:app:1fQw7T2w3N4y9kT6yX9yVQx9o0s=:cdrwa

预期效果:

Created /apps/secure

3)验证权限:

# 新开一个未认证会话
/opt/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181

# 读取节点(应失败)
get /apps/secure

预期输出(未认证):

KeeperErrorCode = NoAuth for /apps/secure

4)认证后访问:

# 绑定认证后再读取
addauth digest app:App@123
get /apps/secure

预期输出:

v1

ip 认证示例(结合 digest)#

# 仅允许 10.0.0.0/24 网段访问,同时要求 digest
addauth digest app:App@123
create /apps/ipsecure "v1" \
  digest:app:1fQw7T2w3N4y9kT6yX9yVQx9o0s=:cdrwa,ip:10.0.0.0/24:r

说明:
- ip:10.0.0.0/24:r 仅限制读取来源网段
- digest 权限用于写与管理,避免仅 IP 可写

sasl/Kerberos 基本配置示例(路径与关键参数)#

服务端 conf/jaas.conf

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

客户端 conf/jaas.conf

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

服务端 conf/zoo.cfg 关键配置:

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

说明:
- authProvider.1 启用 SASL 认证
- requireClientAuthScheme 强制客户端使用 sasl

常见错误与排错#

  • 错误:KeeperErrorCode = NoAuth
  • 排查:是否执行 addauth;ACL 是否包含所需权限
  • 错误:SessionExpired
  • 排查:会话超时/网络中断;SASL 场景检查时钟同步与 Kerberos 票据有效期
  • 错误:AuthFailed
  • 排查:digest 用户/密码不一致;sasl 票据或 JAAS 配置错误

排错命令:

# 查看节点 ACL
getAcl /apps/secure

# 查看本地 Kerberos 票据
klist

练习#

  1. /apps/secure 创建 digest ACL,并验证未认证访问会被拒绝。
  2. /apps/secure 的 ACL 调整为 digest + ip 组合,验证非网段内读失败。
  3. 启用 SASL 后,尝试未带票据访问,观察 AuthFailed 错误并排查。

安全建议#

  • 生产环境避免使用 world:anyone:rw
  • 关键节点授予 a(admin)权限便于维护。
  • 最小权限原则:仅授予必须的 c/d/r/w/a
  • 认证信息避免明文硬编码,必要时结合密钥管理与配置加密。