启用 Kafka 集群中的 ZooKeeper 安全认证(SASL)是确保 Kafka 集群与 ZooKeeper 之间进行安全通信的一种方式,特别是在涉及到生产环境和有严格安全要求的场景下。Kafka 使用的 ZooKeeper 安全机制通常涉及 SASL(Simple Authentication and Security Layer)认证,并且可以配置基于 Digest 或 Kerberos 的身份验证机制。
Kafka 集群启用 ZooKeeper 安全认证的步骤
1. 配置 ZooKeeper 启用 SASL
ZooKeeper 默认是以没有身份验证的方式运行的。如果要启用 ZooKeeper 的安全认证,必须进行以下配置:
1.1 配置 ZooKeeper 启用 SASL
-
在 ZooKeeper 的
zookeeper.cfg配置文件中,启用 SASL 身份验证和加密。修改
zookeeper.cfg文件,以zookeeper三个节点为例,加入以下配置:# 启用 SASL authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvide authProvider.2=org.apache.zookeeper.server.auth.SASLAuthenticationProvider authProvider.3=org.apache.zookeeper.server.auth.SASLAuthenticationProvider requireClientAuthScheme=sasl # 启用认证 jaasLoginRenew=3600000
1.2 配置 ZooKeeper 的 JAAS 配置文件 ZooKeeper 使用 JAAS (Java Authentication and Authorization Service) 来配置身份验证方式。你需要为 ZooKeeper 配置 zookeeper-jaas.conf 文件。
# zookeeper-jaas.conf
Server {
org.apache.zookeeper.server.auth.DigestLoginModule required
user_kafka="kafka-password";
};
Server部分表示 ZooKeeper 服务器使用的身份验证模块。user_kafka是用户的用户名,kafka-password是该用户的密码。
1.3 zkEnv.sh脚本增加JAAS配置
- SERVER_JVMFLAGS="-Djava.security.auth.login.config=/$path/zookeeper/conf/zookeeper-jaas.conf"
2. 配置 Kafka 启用 ZooKeeper 安全
Kafka 通过 SASL 与 ZooKeeper 进行认证。配置 Kafka 的 kafka_jaas.conf 文件来启用 SASL。
2.1 配置 Kafka 使用 SASL 连接 ZooKeeper Kafka 的 kafka_jaas.conf 配置文件告诉 Kafka 如何使用 SASL 与 ZooKeeper 进行通信:
# kafka_jaas.conf
Client {
org.apache.zookeeper.server.auth.DigestLoginModule required
username="kafka"
password="kafka-password";
};
username="kafka":表示 Kafka 客户端使用的用户名。password="kafka-password":表示与 ZooKeeper 配置的密码一致。
2.2 配置 Kafka 使用 JAAS Kafka 启动时需要指定 JAAS 配置文件。可以通过以下方式指定:
KAFKA_OPTS="-Djava.security.auth.login.config=/path/to/kafka_jaas.conf" ./bin/kafka-server-start.sh config/server.properties
这将确保 Kafka 在启动时使用正确的 JAAS 配置进行认证。
2.3 设置客户端使用安全 ACL
zookeeper.set.acl=true
3. 配置 ZooKeeper 客户端访问控制
ZooKeeper 支持通过 ACL (Access Control List) 来配置客户端的权限。Kafka 客户端连接到 ZooKeeper 时,必须有足够的权限执行相关操作(如创建、读取、修改节点等)。
3.1 设置 ZooKeeper ACL ZooKeeper 默认情况下没有启用访问控制,所有用户都能访问。如果启用了身份验证和授权,必须设置 ACL 来控制权限。
可以通过 zkCli.sh 命令行客户端设置 ACL:
setAcl /kafka_test auth:kafka:readwrite
auth:kafka:readwrite:表示kafka用户可以对/kafka_test节点执行读取和写入操作。
3.2 配置 Kafka 使用的 ACL 权限
- Kafka 会与 ZooKeeper 通信,通过 SASL 或 Digest 验证后,Kafka 需要确保其访问的 ZooKeeper 节点有适当的 ACL 权限。
4. 启动 Kafka 和 ZooKeeper 集群
确保所有的 Kafka 和 ZooKeeper 实例都根据上述配置文件进行了配置,接下来启动 Kafka 和 ZooKeeper:
- 启动 ZooKeeper 服务器(带有 SASL 配置)。
- 启动 Kafka Broker(带有 SASL 配置)。
机制原理
- SASL 认证机制:SASL 是一种认证协议,用于网络通信中身份验证。在 Kafka 中,SASL 支持多种认证机制(如 PLAIN、SCRAM、GSSAPI)。Kafka 和 ZooKeeper 可以使用
DigestLoginModule或GSSAPI来进行身份验证。 - JAAS 配置:Kafka 和 ZooKeeper 都通过 JAAS 配置来指定身份验证的细节。JAAS 配置中定义了登录模块(如
DigestLoginModule或KerberosLoginModule)和用户的凭证。 - ACL 权限控制:ZooKeeper 允许对不同用户和客户端设置 ACL,只有具备相应权限的客户端才能对 ZooKeeper 中的节点执行操作。Kafka 在与 ZooKeeper 交互时,必须满足 ACL 中的权限要求。
- Kafka 和 ZooKeeper 认证:Kafka 使用 SASL 向 ZooKeeper 提交请求,在连接之前进行身份验证。ZooKeeper 会检查提供的凭证和相应的 ACL 是否允许该客户端执行请求。
总结
通过启用 ZooKeeper 的 SASL 认证,Kafka 集群可以保障与 ZooKeeper 之间的安全通信。配置涉及修改 ZooKeeper 和 Kafka 的配置文件,设置 JAAS 配置来支持身份验证,并通过 ACL 管理访问权限。通过这些措施,可以大大增强集群的安全性,但也需要仔细配置和维护。