第 13 章 使用 Kerberos(GSSAPI)身份验证
AMQ Streams 支持使用 Kerberos(GSSAPI)身份验证协议来保护对 Kafka 集群的单点登录访问。GSSAPI 是一个用于 Kerberos 功能的 API 打包程序,使应用程序免受底层实施的变化。
Kerberos 是一种网络身份验证系统,允许客户端和服务器使用对称加密和受信任的第三方 - Kerberos 密钥分发中心(KDC)相互身份验证。
13.1. 设置 AMQ 流以使用 Kerberos(GSSAPI)身份验证 复制链接链接已复制到粘贴板!
此流程演示了如何配置 AMQ Streams,以便 Kafka 客户端可以使用 Kerberos(GSSAPI)身份验证访问 Kafka 和 ZooKeeper。
该流程假定已在 Red Hat Enterprise Linux 主机上设置了 Kerberos krb5 资源服务器。
该流程演示了如何配置:
- 服务主体
- Kafka 代理使用 Kerberos 登录
- zookeeper 使用 Kerberos 登录
- 使用 Kerberos 身份验证访问 Kafka 的生产者和消费者客户端
该说明描述了在单个主机上为单个 ZooKeeper 和 Kafka 安装设置的 Kerberos,并为制作者和消费者客户端设置额外的配置。
先决条件
要配置 Kafka 和 ZooKeeper 以验证和授权 Kerberos 凭证,您需要:
- 访问 Kerberos 服务器
- 每个 Kafka 代理主机上的 Kerberos 客户端
有关设置 Kerberos 服务器的步骤以及代理主机上的客户端的详情,请查看 RHEL 设置配置中的示例 Kerberos。
如何部署 Kerberos 取决于您的操作系统。红帽建议在 Red Hat Enterprise Linux 中设置 Kerberos 时使用 Identity Management(IdM)。Oracle 或 IBM JDK 的用户必须安装 Java 加密扩展(JCE)。
添加用于身份验证的服务主体
从您的 Kerberos 服务器,为 ZooKeeper、Kafka 代理以及 Kafka 制作者和消费者客户端创建服务主体(用户)。
服务主体必须使用 SERVICE-NAME/FULLY-QUALIFIED-HOST-NAME@DOMAIN-REALM 格式。
通过 Kerberos KDC 创建服务主体,以及存储主要密钥的 keytab。
例如:
-
zookeeper/node1.example.redhat.com@EXAMPLE.REDHAT.COM
-
kafka/node1.example.redhat.com@EXAMPLE.REDHAT.COM
-
producer1/node1.example.redhat.com@EXAMPLE.REDHAT.COM
consumer1/node1.example.redhat.com@EXAMPLE.REDHAT.COM
ZooKeeper 服务主体必须具有与 Kafka
config/server.properties
文件中的zookeeper.connect
配置相同的主机名:zookeeper.connect=node1.example.redhat.com:2181
zookeeper.connect=node1.example.redhat.com:2181
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果主机名不同,则使用 localhost,身份验证将失败。
-
在主机上创建目录并添加 keytab 文件:
例如:
/opt/kafka/krb5/zookeeper-node1.keytab /opt/kafka/krb5/kafka-node1.keytab /opt/kafka/krb5/kafka-producer1.keytab /opt/kafka/krb5/kafka-consumer1.keytab
/opt/kafka/krb5/zookeeper-node1.keytab /opt/kafka/krb5/kafka-node1.keytab /opt/kafka/krb5/kafka-producer1.keytab /opt/kafka/krb5/kafka-consumer1.keytab
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确保
kafka
用户可以访问该目录:chown kafka:kafka -R /opt/kafka/krb5
chown kafka:kafka -R /opt/kafka/krb5
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
将 ZooKeeper 配置为使用 Kerberos 登录
将 ZooKeeper 配置为使用 Kerberos 密钥分发中心(KDC)通过之前为 zookeeper
创建的用户主体和 keytab 进行身份验证。
创建或修改
opt/kafka/config/jaas.conf
文件以支持 ZooKeeper 客户端和服务器操作:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑
opt/kafka/config/zookeeper.properties
以使用更新的 JAAS 配置:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 控制登录续订的频率(毫秒),可调整该频率以适应票据续订间隔。默认值为 1 小时。
- 2
- 指示主机名是否用作登录主体名称的一部分。如果对群集中的所有节点使用单个 keytab,这设置为
true
。但是,建议为每个代理主机生成一个单独的 keytab 和完全限定主体来进行故障排除。 - 3
- 控制是否从 Kerberos 协商的主要名称中分离域名。建议将此设置设置为
false
。 - 4
- 为 ZooKeeper 服务器和客户端启用 SASL 身份验证机制。
- 5
RequireSasl
属性控制仲裁事件(如 master 选举)是否需要 SASL 身份验证。- 6
loginContext
属性标识用于验证指定组件配置的 JAAS 配置中的登录上下文名称。loginContext 名称与opt/kafka/config/jaas.conf
文件中相关部分的名称对应。- 7
- 控制用于组成用于识别的主要名称的命名约定。占位符
_HOST
在运行时自动解析为由server.1
属性定义的主机名。
使用 JVM 参数启动 ZooKeeper 以指定 Kerberos 登录配置:
su - kafka export EXTRA_ARGS="-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/opt/kafka/config/jaas.conf"; /opt/kafka/bin/zookeeper-server-start.sh -daemon /opt/kafka/config/zookeeper.properties
su - kafka export EXTRA_ARGS="-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/opt/kafka/config/jaas.conf"; /opt/kafka/bin/zookeeper-server-start.sh -daemon /opt/kafka/config/zookeeper.properties
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您不使用默认服务名称(
zookeeper
),请使用-Dzookeeper.sasl.client.username=NAME
参数添加名称。注意如果您使用
/etc/krb5.conf
位置,在启动 ZooKeeper、Kafka 或者 Kafka 制作者和消费者时,您不需要指定-Djava.security.krb5.conf=/etc/krb5.conf
。
将 Kafka 代理服务器配置为使用 Kerberos 登录
配置 Kafka,以使用 Kerberos 密钥分发中心(KDC)通过之前为 kafka
创建的用户主体和 keytab 进行身份验证。
使用以下元素修改
opt/kafka/config/jaas.conf
文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过修改
config/server.properties
文件中的监听程序配置,使监听器使用 SASL/GSSAPI 登录,在 Kafka 集群中配置每个代理。将 SASL 协议添加到监听器的安全协议映射中,并删除任何不需要的协议。
例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 JVM 参数启动 Kafka 代理,以指定 Kerberos 登录配置:
su - kafka export KAFKA_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/opt/kafka/config/jaas.conf"; /opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties
su - kafka export KAFKA_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/opt/kafka/config/jaas.conf"; /opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果之前配置了 broker 和 ZooKeeper 集群,并使用基于非 Kerberos 的身份验证系统,则可以启动 ZooKeeper 和代理集群,并检查日志中的配置错误。
在启动代理和 Zookeeper 实例后,集群现在被配置用于 Kerberos 身份验证。
配置 Kafka 制作者和消费者客户端以使用 Kerberos 身份验证
配置 Kafka 制作者和消费者客户端,以使用 Kerberos 密钥分发中心(KDC)通过之前为 producer1
和 consumer1
创建的用户主体和 keytab 进行身份验证。
将 Kerberos 配置添加到制作者或使用者配置文件。
例如:
/opt/kafka/config/producer.properties
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /opt/kafka/config/consumer.properties
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行客户端以验证您可以从 Kafka 代理发送和接收消息。
制作者客户端:
export KAFKA_HEAP_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Dsun.security.krb5.debug=true"; /opt/kafka/bin/kafka-console-producer.sh --producer.config /opt/kafka/config/producer.properties --topic topic1 --bootstrap-server node1.example.redhat.com:9094
export KAFKA_HEAP_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Dsun.security.krb5.debug=true"; /opt/kafka/bin/kafka-console-producer.sh --producer.config /opt/kafka/config/producer.properties --topic topic1 --bootstrap-server node1.example.redhat.com:9094
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 消费者客户端:
export KAFKA_HEAP_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Dsun.security.krb5.debug=true"; /opt/kafka/bin/kafka-console-consumer.sh --consumer.config /opt/kafka/config/consumer.properties --topic topic1 --bootstrap-server node1.example.redhat.com:9094
export KAFKA_HEAP_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Dsun.security.krb5.debug=true"; /opt/kafka/bin/kafka-console-consumer.sh --consumer.config /opt/kafka/config/consumer.properties --topic topic1 --bootstrap-server node1.example.redhat.com:9094
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
其它资源
- Kerberos man page:krb5.conf(5)、kinit(1)、klist(1)和 kdestroy(1)
- RHEL 设置配置中的 Kerberos 服务器示例
- 使用 Kerberos ticket 向 Kafka 集群进行身份验证的客户端应用程序示例