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
练习#
- 为
/apps/secure创建digestACL,并验证未认证访问会被拒绝。 - 将
/apps/secure的 ACL 调整为digest + ip组合,验证非网段内读失败。 - 启用 SASL 后,尝试未带票据访问,观察
AuthFailed错误并排查。
安全建议#
- 生产环境避免使用
world:anyone:rw。 - 关键节点授予
a(admin)权限便于维护。 - 最小权限原则:仅授予必须的
c/d/r/w/a。 - 认证信息避免明文硬编码,必要时结合密钥管理与配置加密。