Kafka集群与ZooKeeper安全认证详解:配置、机制与操作步骤

2,718 阅读3分钟

启用 Kafka 集群中的 ZooKeeper 安全认证(SASL)是确保 Kafka 集群与 ZooKeeper 之间进行安全通信的一种方式,特别是在涉及到生产环境和有严格安全要求的场景下。Kafka 使用的 ZooKeeper 安全机制通常涉及 SASL(Simple Authentication and Security Layer)认证,并且可以配置基于 DigestKerberos 的身份验证机制。

Kafka 集群启用 ZooKeeper 安全认证的步骤

1. 配置 ZooKeeper 启用 SASL

ZooKeeper 默认是以没有身份验证的方式运行的。如果要启用 ZooKeeper 的安全认证,必须进行以下配置:

1.1 配置 ZooKeeper 启用 SASL

  1. 在 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 配置)。

机制原理

  1. SASL 认证机制:SASL 是一种认证协议,用于网络通信中身份验证。在 Kafka 中,SASL 支持多种认证机制(如 PLAIN、SCRAM、GSSAPI)。Kafka 和 ZooKeeper 可以使用 DigestLoginModuleGSSAPI 来进行身份验证。
  2. JAAS 配置:Kafka 和 ZooKeeper 都通过 JAAS 配置来指定身份验证的细节。JAAS 配置中定义了登录模块(如 DigestLoginModuleKerberosLoginModule)和用户的凭证。
  3. ACL 权限控制:ZooKeeper 允许对不同用户和客户端设置 ACL,只有具备相应权限的客户端才能对 ZooKeeper 中的节点执行操作。Kafka 在与 ZooKeeper 交互时,必须满足 ACL 中的权限要求。
  4. Kafka 和 ZooKeeper 认证:Kafka 使用 SASL 向 ZooKeeper 提交请求,在连接之前进行身份验证。ZooKeeper 会检查提供的凭证和相应的 ACL 是否允许该客户端执行请求。

总结

通过启用 ZooKeeper 的 SASL 认证,Kafka 集群可以保障与 ZooKeeper 之间的安全通信。配置涉及修改 ZooKeeper 和 Kafka 的配置文件,设置 JAAS 配置来支持身份验证,并通过 ACL 管理访问权限。通过这些措施,可以大大增强集群的安全性,但也需要仔细配置和维护。