Zookeeper在Linux中如何进行权限控制
小樊
38
2025-12-28 07:26:56
Zookeeper在Linux中的权限控制实践
一 总体思路
- 权限控制应覆盖两层:一是操作系统层(运行账户、目录权限、SELinux/AppArmor),二是 Zookeeper 内核层(基于 ACL 的认证与授权)。
- 常用认证与授权方式包括:world、ip、auth、digest、SASL/Kerberos;常用权限集合为 CREATE、READ、WRITE、DELETE、ADMIN。
- 建议同时启用网络层控制(如 firewalld 限制来源网段、必要时启用 SSL/TLS 加密传输)。
二 操作系统层安全
- 专用运行账户与目录权限
- 创建系统账户与组,设置数据与日志目录属主,限制其他用户访问:
- sudo groupadd zookeeper
- sudo useradd -g zookeeper zookeeper
- sudo mkdir -p /var/lib/zookeeper /var/log/zookeeper
- sudo chown -R zookeeper:zookeeper /var/lib/zookeeper /var/log/zookeeper
- sudo chmod -R 750 /var/lib/zookeeper /var/log/zookeeper
- 配置 systemd 服务以 zookeeper 用户运行:
- [Service] 中设置:User=zookeeper;Group=zookeeper
- 执行:sudo systemctl daemon-reload && sudo systemctl restart zookeeper
- SELinux/AppArmor 适配(如启用)
- SELinux 示例:sudo chcon -Rt zookeeper_var_lib_t /var/lib/zookeeper;sudo chcon -Rt zookeeper_var_log_t /var/log/zookeeper
- AppArmor:编辑相应 profile,放行数据/日志目录读写。
三 Zookeeper内置ACL配置
- 常用权限模式与权限位
- 模式:world(默认对所有主体开放)、ip(按客户端 IP 网段)、auth(基于当前已认证主体)、digest(用户名:密码的摘要认证,生产常用)、super(超级用户,谨慎启用)。
- 权限:C(Create)、R(Read)、W(Write)、D(Delete)、A(Admin/ACL 管理)。
- 命令行常用操作
- 连接客户端:/path/to/zookeeper/bin/zkCli.sh -server localhost:2181
- 查看 ACL:getAcl /exampleNode
- 设置 ACL:setAcl /exampleNode world:anyone:r,ip:192.168.1.0/24:cdrwa,digest:user1:cdrwa,digest:user2:r
- 创建节点并带 ACL:create /exampleNode “data” -acl “digest:user1:cdrwa,digest:user2:r”
- 在会话中添加认证主体:addauth digest user1:password123
- 生成 digest 身份标识
- 摘要串生成:echo -n “user1:password123” | openssl dgst -sha1 -binary | base64
- 在 ACL 中使用形如:digest:user1:Base64Digest:cdrwa(注意 Base64Digest 不含用户名与冒号)。
四 启用SASL与JAAS的强认证
- 服务端配置(zoo.cfg)
- 启用 SASL 提供者:authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
- 可选:requireClientAuthScheme=sasl(强制客户端 SASL 认证)
- JAAS 配置(/etc/zookeeper/zookeeper.jaas)
- Server {
org.apache.zookeeper.server.auth.DigestLoginModule required
user_user1=“password123”
user_user2=“password456”;
};
- 启动参数
- 方式一:export JVMFLAGS=“-Djava.security.auth.login.config=/etc/zookeeper/zookeeper.jaas”
- 方式二:在 systemd 服务 Environment 中设置上述 JVM 参数
- 客户端使用
- zkCli.sh 连接后执行:addauth digest user1:password123
- 对需要保护的节点设置 ACL(如:digest:user1:cdrwa)。
五 网络与加密加固
- 防火墙限制来源网段
- 仅放通受信网段访问 2181/tcp(或启用安全端口):
- sudo firewall-cmd --permanent --zone=public --add-rich-rule=‘rule family=“ipv4” source address=“192.168.1.0/24” port protocol=“tcp” port=“2181” accept’
- sudo firewall-cmd --reload
- 启用 SSL/TLS(可选但推荐)
- 配置示例:
- secureClientPort=2281
- zookeeper.ssl.keyStore.location=/path/to/keystore.jks
- zookeeper.ssl.keyStore.password=keystore_pass
- zookeeper.ssl.trustStore.location=/path/to/truststore.jks
- zookeeper.ssl.trustStore.password=truststore_pass
- 运维要点
- 避免在生产使用 world:anyone;ACL 变更前先在测试环境验证,变更后及时审计。
- 定期审查 ACL 与系统账户权限,遵循最小权限原则;启用 SASL/Kerberos 与 TLS 提升整体安全基线。