#作者:任少近
文章目录
- 1修复背景
- [2 修复方案说明](#2 修复方案说明)
- [3 配置流程](#3 配置流程)
-
- 3.1停止zookeeper服务
- 3.2Zookeeper添加SASL参数
- 3.3配置jaas密码文件
- [3.4 添加启动参数](#3.4 添加启动参数)
- 3.5启动zookeeper服务
- 3.6访问测试
- [4 Kafka连接zookeeper服务端配置](#4 Kafka连接zookeeper服务端配置)
- [5 回滚方案](#5 回滚方案)
-
- [5.1 Zookeeper回滚方案](#5.1 Zookeeper回滚方案)
- [5.2 Kafka回滚方案](#5.2 Kafka回滚方案)
1修复背景
Zookeeper未授权访问漏洞通常指的是Zookeeper服务未进行适当的安全配置,导致外部用户可未经认证和授权访问Zookeeper服务,从而获取到服务控制权。
2 修复方案说明
SASL:SASL(即简单身份验证和安全层)是一个身份验证框架,它指定和描述将身份验证机制插入应用程序协议的过程。它是一种用于验证远程计算机的互联网标准框架或跟踪方法。
涉及版本:3.6.0+
3 配置流程
3.1停止zookeeper服务
zookeeper]# ./bin/zkServer.sh stop
3.2Zookeeper添加SASL参数
- 先备份zookeeper/conf/zoo.cfg配置文件
- 在zookeeper/conf/zoo.cfg配置文件中添加如下SASL配置:
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
sessionRequireClientSASLAuth=true
3.2.1配置解析
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider #启用 SASL 认证
sessionRequireClientSASLAuth=true #自 3.6.0 版本开始:当设置为 true 时,ZooKeeper 服务器将只接受通过 SASL 与服务器进行认证的客户端的连接和请求。未配置 SASL 认证或配置了 SASL 但认证失败(即凭证无效)的客户端将无法与服务器建立会话。在这种情况下,将返回一个类型错误代码(-124),之后 Java 和 C 客户端将关闭与服务器的会话,而不会尝试重新连接。
3.3配置jaas密码文件
-
创建zookeeper/conf/zk_jaas.conf密码文件并写入如下密码配置:
Server {
org.apache.zookeeper.server.auth.DigestLoginModule required
username="zkadmin" #服务端身份认证用户名
password="zkadmin" #服务端身份认证密码
user_zkuser1="password1"; #允许用户名zkuser1且密码为password1的用户访问
user_zkuser2="password2"; #允许用户名zkuser2且密码为password2的用户访问
user_zkuser3="password3"; #允许用户名zkuser3且密码为password3的用户访问
...
};Client {
org.apache.zookeeper.server.auth.DigestLoginModule required
username="zkuser1" #客户端用户名1
password="password1"; #客户端密码1
};Client {
org.apache.zookeeper.server.auth.DigestLoginModule required
username="zkuser2"
password="password2";
};Client {
org.apache.zookeeper.server.auth.DigestLoginModule required
username="zkuser3"
password="password3";
};
3.4 添加启动参数
-
先备份zookeeper/bin/zkEnv.sh脚本文件
-
在zookeeper/bin/zkEnv.sh中添加如下配置:
export JVMFLAGS="-Djava.security.auth.login.config=/root/zookeeper/conf/zk_jaas.conf -Dzookeeper.requireClientAuthScheme=sasl"
3.5启动zookeeper服务
zookeeper]# ./bin/zkServer.sh start
3.6访问测试
- 使用配置zkEnv.sh的zkCli.sh命令
- 使用未配置zkEnv.sh的zkCli.sh命令
4 Kafka连接zookeeper服务端配置
4.1未配置身份认证
在kafka未配置zookeeper对应的Jaas.conf密码时,使用kafka去连接zookeeper,Kafka连接失败,出现缺少认证报错信息。

4.2停止kafka服务
kafka]#./bin/kafka-server-stop.sh
4.3配置身份认证
4.3.1配置jaas密码文件
在/kafka/config/kafka_jaas.conf编写如下jaas.conf密码:
Client {
org.apache.zookeeper.server.auth.DigestLoginModule required
username="zkuser"
password="password";
};
4.3.2配置kafka启动参数
-
在/kafka/bin/kafka-run-class.sh脚本中# JMX settings下添加如下配置:
-Djava.security.auth.login.config=/root/kafka/config/kafka_jaas.conf
-
整体配置展示:
JMX settings
if [ -z "$KAFKA_JMX_OPTS" ]; then
KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.security.auth.login.config=/root/kafka/config/kafka_jaas.conf "
Fi -
配置图片
4.4启动kafka服务
kafka]#./kafka/bin/kafka-server-start.sh -daemon kafka/config/server.properties
5 回滚方案
5.1 Zookeeper回滚方案
- 停止zookeeper服务
- 恢复zookeeper的zkEnv.sh和zoo.cfg配置文件
- 启动zookeeper服务
5.2 Kafka回滚方案
- 停止kafka服务
- 恢复kafka的kafka-run-class.sh脚本文件
- 启动kafka服务