Zookeeper的权限管理主要通过文件系统权限、访问控制列表(ACL)及认证机制实现,以下是具体操作步骤:
确保Zookeeper的数据目录(dataDir)和日志目录(dataLogDir)仅能被授权用户访问,防止未授权修改或删除数据。
# 创建数据及日志目录(若未存在)
sudo mkdir -p /var/lib/zookeeper/data /var/log/zookeeper
# 设置目录所有者为zookeeper用户(需提前创建,见步骤3)
sudo chown -R zookeeper:zookeeper /var/lib/zookeeper /var/log/zookeeper
# 设置目录权限(750:所有者可读写执行,组用户可读执行,其他用户无权限)
sudo chmod -R 750 /var/lib/zookeeper /var/log/zookeeper
说明:dataDir和dataLogDir的路径需与zoo.cfg中的配置一致。
避免以root用户运行Zookeeper,降低安全风险。创建专用用户及组:
# 创建zookeeper组
sudo groupadd zookeeper
# 创建zookeeper用户(归属zookeeper组,无登录权限)
sudo useradd -g zookeeper -s /usr/sbin/nologin zookeeper
# 修改Zookeeper服务配置,指定运行用户
sudo sed -i 's/^ZOOKEEPER_USER=.*/ZOOKEEPER_USER=zookeeper/' /etc/default/zookeeper
修改后需重启服务使配置生效:
sudo systemctl restart zookeeper
ACL是Zookeeper权限管理的核心,支持digest(用户名:密码)、ip(IP地址)、**world(全局)**等认证模式。以下以digest模式为例:
zkCli.sh工具连接ZooKeeper服务器:/usr/share/zookeeper/bin/zkCli.sh -server localhost:2181
zookeeper用户拥有完全权限):create /secureNode "secure data" digest:zookeeper:password123:cdrwa
其中:
digest:认证模式(需配合用户名:密码);zookeeper:password123:用户名与密码(需提前在zoo.cfg中配置);cdrwa:权限(Create、Read、Write、Delete、Admin)。setAcl命令:setAcl /secureNode digest:zookeeper:password123:cdrwa
getAcl命令验证权限设置:getAcl /secureNode
输出示例:'digest,'zookeeper:Base64编码密码': cdrwa
为确保ACL生效,需在zoo.cfg中启用SASL认证:
# 编辑zoo.cfg文件
sudo nano /etc/zookeeper/zoo.cfg
添加以下配置(若文件不存在则新建):
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
requireClientAuthScheme=sasl
jaasLoginRenew=3600000
说明:jaasLoginRenew表示JAAS配置的刷新间隔(毫秒)。
创建JAAS配置文件(如/etc/zookeeper/jaas.conf),定义用户及密码:
sudo nano /etc/zookeeper/jaas.conf
内容示例(zookeeper为用户,password123为密码):
Server {
org.apache.zookeeper.server.auth.DigestLoginModule required
user_zookeeper="password123";
};
说明:user_zookeeper为JAAS中的用户标识,对应digest模式中的用户名。
客户端连接时需提供认证信息,以Java代码为例:
import org.apache.zookeeper.*;
public class ZooKeeperAuthExample {
public static void main(String[] args) throws Exception {
// 连接ZooKeeper
ZooKeeper zk = new ZooKeeper("localhost:2181", 3000, null);
// 添加认证信息(digest模式:用户名:密码)
zk.addAuthInfo("digest", "zookeeper:password123".getBytes());
// 创建受保护节点(需zookeeper用户权限)
zk.create("/secureNode", "secure data".getBytes(), ZooDefs.Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT);
// 关闭连接
zk.close();
}
}
zkCli.sh连接并认证后,尝试创建/读取节点:/usr/share/zookeeper/bin/zkCli.sh -server localhost:2181
addauth digest zookeeper:password123 # 认证
create /secureNode "test" # 应成功
get /secureNode # 应成功
Authentication failed错误。world:anyone:cdrwa(全局完全权限),如需开放访问可限制为特定IP(如ip:192.168.1.0/24:cdrwa);zoo.cfg、jaas.conf及ACL配置,避免配置丢失。