11.4.6 权限管理实践与安全建议

权限管理实践与安全建议#

本节以“最小权限、可审计、可恢复”为目标,给出 ACL 设计、账号治理、运维流程与安全加固实践,并配套可执行命令、配置示例、排错方法与练习。

1. 权限模型原理草图与设计要点#

文章图片
  • 分层隔离:按环境/业务划分根路径,避免跨环境误操作。
  • 最小授权:业务账号仅授予必须的 r w c d 权限,限制 a 权限范围。
  • 关键路径保护//zookeeper 仅管理员可访问。
  • 临时节点:仅对本业务路径授 c 权限,减少误创建。

2. ACL 设计与命令示例(digest)#

场景:管理员为 /prod/appA 设置业务账号只读 + 创建权限。

# 1) 生成 digest 用户(在任意 ZooKeeper 节点)
# 说明:输出形如 "appA:密文",用于 ACL 中
./bin/zkCli.sh -server 127.0.0.1:2181 <<'EOF'
addauth digest admin:Admin@123
EOF
# 2) 使用管理员账号设置 ACL
# 说明:只授予 appA 账号 r + c 权限;管理员拥有全权
./bin/zkCli.sh -server 127.0.0.1:2181 <<'EOF'
addauth digest admin:Admin@123
create /prod ""
create /prod/appA ""
setAcl /prod/appA \
  digest:admin:Admin@123:cdraw \
  digest:appA:AppA@123:rc
getAcl /prod/appA
EOF

命令解释
- addauth digest user:pass:当前会话添加认证信息。
- setAcl path scheme:id:perms:设置 ACL。
- permsc创建、d删除、r读、w写、a设置ACL。
- getAcl:查看生效权限。


3. 认证方式与配置示例(SASL/Kerberos)#

场景:启用 SASL 认证(示意配置路径)。

# conf/zoo.cfg
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
requireClientAuthScheme=sasl
# 启动前导入 JAAS(示意)
export SERVER_JVMFLAGS="-Djava.security.auth.login.config=/opt/zookeeper/conf/jaas.conf"
# conf/jaas.conf
Server {
  com.sun.security.auth.module.Krb5LoginModule required
  useKeyTab=true
  keyTab="/etc/security/keytabs/zk.service.keytab"
  principal="zookeeper/zk1.example.com@EXAMPLE.COM";
};

命令解释
- authProvider.1:启用 SASL 认证模块。
- requireClientAuthScheme:强制客户端使用指定认证方式。
- SERVER_JVMFLAGS:为服务端注入 JAAS 配置。


4. 账号治理与密码轮换流程示例#

流程:管理员轮换业务账号密码并更新 ACL。

# 1) 变更前备份 ACL(推荐使用脚本巡检)
./bin/zkCli.sh -server 127.0.0.1:2181 <<'EOF'
addauth digest admin:Admin@123
getAcl /prod/appA
EOF

# 2) 更新 ACL 中的 digest 账号
./bin/zkCli.sh -server 127.0.0.1:2181 <<'EOF'
addauth digest admin:Admin@123
setAcl /prod/appA \
  digest:admin:Admin@123:cdraw \
  digest:appA:NewAppA@123:rc
EOF

提示:客户端必须同步更新 addauth 凭据,否则将出现认证失败与读写错误。


5. 运维操作规范与安全控制示例#

只读运维账号

./bin/zkCli.sh -server 127.0.0.1:2181 <<'EOF'
addauth digest ops:Ops@123
setAcl /prod \
  digest:admin:Admin@123:cdraw \
  digest:ops:Ops@123:r
EOF

禁用四字命令(以 3.5+ 为例)

# conf/zoo.cfg
4lw.commands.whitelist=stat,ruok,conf

防火墙限制(仅允许业务网段)

# 示例:只允许 10.0.0.0/24 访问 2181
iptables -A INPUT -p tcp --dport 2181 -s 10.0.0.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 2181 -j DROP

6. 常见错误与排错方法#

错误 1:认证失败

KeeperErrorCode = NoAuth for /prod/appA

排查步骤:
1. getAcl /prod/appA 查看是否包含当前账号。
2. 确认 addauth 密码是否已轮换。
3. 检查客户端是否正确使用 digestsasl

错误 2:权限过大导致误删

delete /prod/appA

排查建议:
- 立即恢复快照;
- 将业务账号从 cdrwa 降为 rcrw
- 强制管理员账号操作删除。

错误 3:匿名账号拥有写权限
- 检查 getAcl 是否存在 world:anyone:rw
- 生产环境禁用匿名写权限。


7. 练习与自测#

  1. 创建 /test/appB,设置管理员全权、业务账号仅 r 权限,并验证业务账号无法 create
  2. /prod/appA 的 ACL 由 rc 改为 rw,验证写入成功但不能设置 ACL。
  3. 模拟密码轮换:先改 ACL,再用旧密码访问,观察 NoAuth 报错并恢复正确配置。

通过上述实践,可建立安全可控的 ZooKeeper 权限治理体系,并确保在变更与故障中可恢复、可审计。