第 13 章 使用 Kerberos (GSSAPI)身份验证
AMQ Streams 支持使用 Kerberos (GSSAPI)验证协议来保护对 Kafka 集群的单点登录访问。GSSAPI 是 Kerberos 功能的 API 打包程序,从底层的实现改变中模拟应用程序。
Kerberos 是一种网络身份验证系统,其允许客户端和服务器使用对称加密和信任的第三方 KDC 来互相进行身份验证。
13.1. 设置 AMQ Streams 以使用 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 服务器中,为 ZooKeeper、Kafka 代理和 Kafka producer 和 consumer 客户端创建服务主体(用户)。
服务主体必须采用 SERVICE-NAME/FULLY-QUALIFIED-HOST-NAME@DOMAIN-REALM 的形式。
通过 Kerberos KDC 创建存储主体和 keytab 的服务主体和 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.COMZooKeeper 服务主体必须与 Kafka
config/server.properties文件中的zookeeper.connect配置相同的主机名:zookeeper.connect=node1.example.redhat.com:2181如果主机名不相同,则使用 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确保
kafka用户可以访问目录:chown kafka:kafka -R /opt/kafka/krb5
将 ZooKeeper 配置为使用 Kerberos 登录
配置 ZooKeeper 以使用 Kerberos 密钥分发中心(KDC)使用之前为 zookeeper 创建的用户主体和 keytabs 进行身份验证。
创建或修改
opt/kafka/config/jaas.conf文件来支持 ZooKeeper 客户端和服务器操作:Client { com.sun.security.auth.module.Krb5LoginModule required debug=true useKeyTab=true1 storeKey=true2 useTicketCache=false3 keyTab="/opt/kafka/krb5/zookeeper-node1.keytab"4 principal="zookeeper/node1.example.redhat.com@EXAMPLE.REDHAT.COM";5 }; Server { com.sun.security.auth.module.Krb5LoginModule required debug=true useKeyTab=true storeKey=true useTicketCache=false keyTab="/opt/kafka/krb5/zookeeper-node1.keytab" principal="zookeeper/node1.example.redhat.com@EXAMPLE.REDHAT.COM"; }; QuorumServer { com.sun.security.auth.module.Krb5LoginModule required debug=true useKeyTab=true storeKey=true keyTab="/opt/kafka/krb5/zookeeper-node1.keytab" principal="zookeeper/node1.example.redhat.com@EXAMPLE.REDHAT.COM"; }; QuorumLearner { com.sun.security.auth.module.Krb5LoginModule required debug=true useKeyTab=true storeKey=true keyTab="/opt/kafka/krb5/zookeeper-node1.keytab" principal="zookeeper/node1.example.redhat.com@EXAMPLE.REDHAT.COM"; };编辑
opt/kafka/config/zookeeper.properties以使用更新的 JAAS 配置:# ... requireClientAuthScheme=sasl jaasLoginRenew=36000001 kerberos.removeHostFromPrincipal=false2 kerberos.removeRealmFromPrincipal=false3 quorum.auth.enableSasl=true4 quorum.auth.learnerRequireSasl=true5 quorum.auth.serverRequireSasl=true quorum.auth.learner.loginContext=QuorumLearner6 quorum.auth.server.loginContext=QuorumServer quorum.auth.kerberos.servicePrincipal=zookeeper/_HOST7 quorum.cnxn.threads.size=20- 1
- 以毫秒为单位控制登录续订的频率,这样可调整以适合票据续订间隔。默认为一小时。
- 2
- 指示主机名是否作为登录主体名称的一部分使用。如果将单一 keytab 用于集群中的所有节点,则它被设置为
true。但是,建议为每个代理主机生成单独的 keytab 和完全限定主体来进行故障排除。 - 3
- 控制域名称是否从 Kerberos 协商的主体名称中分离。建议将此设置设置为
false。 - 4
- 为 ZooKeeper 服务器和客户端启用 SASL 验证机制。
- 5
RequireSasl属性控制 SASL 身份验证是否需要进行仲裁事件,如 master 选择。- 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如果您不使用默认的服务名称(
zookeeper),请使用-Dzookeeper.sasl.client.username=NAME参数添加名称。注意如果您使用
/etc/krb5.conf位置,则不需要在启动 ZooKeeper, Kafka, 或 Kafka 生成者和消费者时不需要指定-Djava.security.krb5.conf=/etc/krb5.conf。
将 Kafka 代理服务器配置为使用 Kerberos 登录
使用之前为 kafka 创建的 user principals 和 keytabs,将 Kafka 配置为使用 Kerberos 密钥分发中心(KDC)进行身份验证。
使用以下元素修改
opt/kafka/config/jaas.conf文件:KafkaServer { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true keyTab="/opt/kafka/krb5/kafka-node1.keytab" principal="kafka/node1.example.redhat.com@EXAMPLE.REDHAT.COM"; }; KafkaClient { com.sun.security.auth.module.Krb5LoginModule required debug=true useKeyTab=true storeKey=true useTicketCache=false keyTab="/opt/kafka/krb5/kafka-node1.keytab" principal="kafka/node1.example.redhat.com@EXAMPLE.REDHAT.COM"; };通过在
config/server.properties文件中修改监听程序配置 Kafka 集群中的每个代理,以便监听程序使用 SASL/GSSAPI 登录。将 SASL 协议添加到监听器的安全协议映射中,并删除所有不需要的协议。
例如:
# ... broker.id=0 # ... listeners=SECURE://:9092,REPLICATION://:90941 inter.broker.listener.name=REPLICATION # ... listener.security.protocol.map=SECURE:SASL_PLAINTEXT,REPLICATION:SASL_PLAINTEXT2 # .. sasl.enabled.mechanisms=GSSAPI3 sasl.mechanism.inter.broker.protocol=GSSAPI4 sasl.kerberos.service.name=kafka5 ...使用 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如果代理和 ZooKeeper 集群之前已经配置并使用基于非 Kerberos 的身份验证系统,则可以启动 ZooKeeper 和 broker 集群,并检查日志中是否存在配置错误。
在启动代理和 Zookeeper 实例后,现在为 Kerberos 身份验证配置集群。
将 Kafka producer 和使用者客户端配置为使用 Kerberos 身份验证
使用之前为 producer1 和 consumer1 创建的用户主体和 keytabs 配置 Kafka producer 和 使用者客户端,以使用 Kerberos 密钥分发中心(KDC)进行身份验证。
将 Kerberos 配置添加到制作者或消费者配置文件。
例如:
/opt/kafka/config/producer.properties
# ... sasl.mechanism=GSSAPI1 security.protocol=SASL_PLAINTEXT2 sasl.kerberos.service.name=kafka3 sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required \4 useKeyTab=true \ useTicketCache=false \ storeKey=true \ keyTab="/opt/kafka/krb5/producer1.keytab" \ principal="producer1/node1.example.redhat.com@EXAMPLE.REDHAT.COM"; # .../opt/kafka/config/consumer.properties
# ... sasl.mechanism=GSSAPI security.protocol=SASL_PLAINTEXT sasl.kerberos.service.name=kafka sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required \ useKeyTab=true \ useTicketCache=false \ storeKey=true \ keyTab="/opt/kafka/krb5/consumer1.keytab" \ principal="consumer1/node1.example.redhat.com@EXAMPLE.REDHAT.COM"; # ...运行客户端来验证您可以从 Kafka 代理发送和接收信息。
producer 客户端:
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-consumer.sh --consumer.config /opt/kafka/config/consumer.properties --topic topic1 --bootstrap-server node1.example.redhat.com:9094