为提升安全性,建议以非root用户运行ZooKeeper。首先创建专用用户及组,并设置数据/日志目录权限:
创建用户与组:
sudo groupadd zookeeper
sudo useradd -g zookeeper zookeeper
创建目录并赋权:
sudo mkdir -p /var/lib/zookeeper # 数据目录
sudo mkdir -p /var/log/zookeeper # 日志目录
sudo chown -R zookeeper:zookeeper /var/lib/zookeeper
sudo chown -R zookeeper:zookeeper /var/log/zookeeper
sudo chmod -R 755 /var/lib/zookeeper /var/log/zookeeper # 允许用户读写,组及其他用户仅读执行
配置文件权限:
确保ZooKeeper配置文件(如/etc/zookeeper/conf/zoo.cfg)仅能被所属用户修改:
sudo chown zookeeper:zookeeper /etc/zookeeper/conf/zoo.cfg
sudo chmod 644 /etc/zookeeper/conf/zoo.cfg
若系统启用SELinux或AppArmor,需调整策略以允许ZooKeeper访问资源:
sudo setsebool -P zookeeper_enable_home_dirs on # 允许访问home目录(若需)
sudo chcon -Rt zookeeper_var_lib_t /var/lib/zookeeper # 设置数据目录SELinux类型
sudo chcon -Rt zookeeper_var_log_t /var/log/zookeeper # 设置日志目录SELinux类型
/etc/apparmor.d/usr.sbin.zookeeper,添加以下规则(根据实际路径调整):/var/lib/zookeeper/** rwk,
/var/log/zookeeper/** rwk,
重载AppArmor配置:sudo systemctl reload apparmor
修改ZooKeeper服务文件(如/etc/systemd/system/zookeeper.service),指定运行用户:
[Service]
User=zookeeper
Group=zookeeper
重载systemd配置并重启服务:
sudo systemctl daemon-reload
sudo systemctl restart zookeeper
ZooKeeper通过**ACL(访问控制列表)**控制对znode(节点)的访问,支持digest(用户名/密码)、ip(IP地址)、world(所有人)等认证方式。
编辑zoo.cfg,添加以下配置以启用SASL认证:
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
requireClientAuthScheme=sasl
jaasLoginRenew=3600000 # JAAS配置刷新间隔(毫秒)
创建/etc/zookeeper/conf/zookeeper.jaas,定义用户及密码:
Server {
org.apache.zookeeper.server.auth.DigestLoginModule required
user_super="super_secret_password" # 用户名=密码(明文,后续会加密)
user_admin="admin_secret_password";
};
设置文件权限(仅root可读):
sudo chmod 600 /etc/zookeeper/conf/zookeeper.jaas
通过环境变量指定JAAS文件路径:
export JVMFLAGS="-Djava.security.auth.login.config=/etc/zookeeper/conf/zookeeper.jaas"
bin/zkServer.sh start
使用zkCli.sh工具创建节点并分配权限:
bin/zkCli.sh -server localhost:2181
create /secure_node "敏感数据" digest:super:base64_encoded_password:cdrwa
其中,digest:super:base64_encoded_password需替换为实际编码(可通过echo -n "super:super_secret_password" | openssl dgst -sha1 -hmac "super_secret_password" | cut -d' ' -f2生成)。cdrwa表示创建、读取、删除、写入、管理ACL权限。getAcl /secure_node
输出应显示类似以下内容:'digest,'super:base64_encoded_password': cdrwa
客户端连接时需提供认证信息:
bin/zkCli.sh -server localhost:2181 -auth digest:super:super_secret_password
认证后,客户端可执行受限操作(如创建/secure_node节点)。
开放ZooKeeper默认端口(2181),允许客户端连接:
sudo firewall-cmd --permanent --zone=public --add-port=2181/tcp
sudo firewall-cmd --reload
/var/lib/zookeeper和/var/log/zookeeper的所有者为zookeeper用户。ps aux | grep zookeeper,确认进程用户为zookeeper。/secure_node,应收到Authentication failed错误;认证后应能正常操作。通过以上步骤,可在Linux环境下完成ZooKeeper的权限配置,确保数据访问安全。