kafka伪集群接入kerberosr安全认证

KDC服务器:kdc.wangbc.com 192.168.109.138 已部署完成

kafka伪集群:192.168.109.141:7092,192.168.109.141:8092,192.168.109.141:9092已安装测试完成; 现准备将kafka伪集群接入kerberos认证
具体操作流程

伪集群部署:

root:
yum localinstall -y jdk-8-321.an8.x86_64.rpm
yum localinstall -y kafka-2.13_3.9.0-1.an8.x86_64.rpm

apprun:

mkdir -pv /apprun/data/kafka_01/kraft-combined-logs

mkdir -pv /apprun/data/kafka_02/kraft-combined-logs

mkdir -pv /apprun/data/kafka_03/kraft-combined-logs

cd /apprun && mv kafka kafka_01

cd /apprun/kafka_01/config/

cp server.properties server.properties_bak
echo "" > server.properties

调整配置文件:

cat /apprun/kafka_01/config/server.properties | grep -v "#" | grep -v "^$"

process.roles=broker,controller
broker.id=1
listeners=PLAINTEXT://192.168.109.141:7092,CONTROLLER://192.168.109.141:7093
controller.quorum.voters=1@192.168.109.141:7093,2@192.168.109.141:8093,3@192.168.109.141:9093
inter.broker.listener.name=PLAINTEXT
controller.listener.names=CONTROLLER
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/apprun/data/kafka_01/kraft-combined-logs
num.partitions=3
default.replication.factor=2
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=2
log.retention.hours=168
log.retention.check.interval.ms=300000
group.initial.rebalance.delay.ms=0

 

cd /apprun && cp -r kafka_01 kafka_02 && cp -r kafka_01 kafka_03 并参考上面修改

生成集群ID

/apprun/kafka_01/bin/kafka-storage.sh random-uuid
qGFGT4whSuC2UprTT6L7rQ

格式化存储目录,使用上一步生成的集群ID,执行格式化命令:

/apprun/kafka_01/bin/kafka-storage.sh format -t qGFGT4whSuC2UprTT6L7rQ -c /apprun/kafka_01/config/server.properties
/apprun/kafka_02/bin/kafka-storage.sh format -t qGFGT4whSuC2UprTT6L7rQ -c /apprun/kafka_02/config/server.properties
/apprun/kafka_03/bin/kafka-storage.sh format -t qGFGT4whSuC2UprTT6L7rQ -c /apprun/kafka_03/config/server.properties

root:调整kafka服务启动文件[cd /usr/lib/systemd/system ]

[root@kafka01 system]# ll kafka_*
-rw-r--r-- 1 root root 422 3月 4 11:10 kafka_01.service
-rw-r--r-- 1 root root 422 3月 4 11:09 kafka_02.service
-rw-r--r-- 1 root root 422 3月 4 11:10 kafka_03.service

systemctl daemon-reload

启动KRaft集群

验证集群状态
jps
/apprun/kafka_01/bin/kafka-broker-api-versions.sh --bootstrap-server 192.168.109.141:9092 | grep "id:"

image

 

 

 

KDC端:创建Kafka服务主体与密钥文件

登录KDC管理控制台 kadmin.local

创建Kafka服务主体

 

为每个Kafka Broker(伪集群所有端口对应同一主机,只需创建一个主体)创建Kerberos主体:

addprinc -randkey kafka/kafka01.wangbc.com@WANGBC.COM     # 替换为实际Realm(如您环境中的EXAMPLE.COM)

导出密钥文件(keytab)

 

将主体密钥导出到Kafka服务器可访问的路径(如/tmp/kafka.keytab):

ktadd -k /tmp/kafka.keytab kafka/kafka01.wangbc.com@WANGBC.COM

exit # 退出kadmin.local

image

复制keytab到Kafka服务器

 

/tmp/kafka.keytab复制到Kafka伪集群服务器(192.168.109.141)的/apprun/kafka_01/config/目录(或自定义路径),并设置权限:

scp /tmp/kafka.keytab kafka01.wangbc.com:/apprun/kafka_01/config/

ssh root@192.168.109.141 "chmod 600 /opt/kafka/config/kafka.keytab" # 限制权限为仅root可读,因为我们kafka是apprun运行,故这个文件要保持apprun所有,600权限

 

 

Kafka端:配置Kerberos认证

关闭Kafka伪集群

在Kafka伪集群服务器(192.168.109.141)修改配置文件:

编辑Kafka Broker配置(server.properties

每个Broker的配置文件,需添加以下内容:

# 启用Kerberos认证

listeners=SASL_PLAINTEXT://192.168.109.141:7092 # 对应Broker端口,如7092/8092/9092

#security.inter.broker.protocol=SASL_PLAINTEXT

 

inter.broker.listener.name=SASL_PLAINTEXT

sasl.mechanism.inter.broker.protocol=GSSAPI

sasl.enabled.mechanisms=GSSAPI

# Kerberos主体配置

sasl.kerberos.service.name=kafka # 与KDC中创建的主体前缀一致(kafka/...)

备注:security.inter.broker.protocol 与 inter.broker.listener.name 冲突,

#security.inter.broker.protocol=SASL_PLAINTEXT 用于指定Broker间通信的安全协议(如SASL_PLAINTEXT),适用于Kafka旧版本(0.10.2及之前)。

inter.broker.listener.name=SASL_PLAINTEXT 用于指定Broker间通信使用的监听器名称(如INTERNAL),适用于Kafka新版本(0.10.2及之后),优先级更高。

所以这里注释旧版本配置,修改新版本配置为 SASL_PLAINTEXT

 

创建JAAS配置文件(kafka_server_jaas.conf

/apprun/kafka_01/config/目录下创建文件,内容如下:

KafkaServer {
    com.sun.security.auth.module.Krb5LoginModule required
    useKeyTab=true
    storeKey=true
    keyTab="/apprun/kafka_01/config/kafka.keytab"  # 对应步骤一复制的keytab路径
    principal="kafka/kafka01.wangbc.com@WANGBC.COM";  # 与KDC中创建的主体一致
};
kafka_server_jaas.conf

配置JVM参数加载JAAS文件
修改Kafka启动脚本(/apprun/kafka_01/bin/kafka-server-start.sh,/apprun/kafka_02/bin/kafka-server-start.sh,/apprun/kafka_03/bin/kafka-server-start.sh),在KAFKA_OPTS中添加:

export KAFKA_OPTS="-Djava.security.auth.login.config=/apprun/kafka_01/config/kafka_server_jaas.conf"

最好并将其添加到服务启动中:

[cd /usr/lib/systemd/system ]

[root@kafka01 system]# ll kafka_*
-rw-r--r-- 1 root root 422 3月 4 11:10 kafka_01.service
-rw-r--r-- 1 root root 422 3月 4 11:09 kafka_02.service
-rw-r--r-- 1 root root 422 3月 4 11:10 kafka_03.service

systemctl daemon-reload

 

 

启动Kafka伪集群并验证

启动Kafka Broker
分别启动三个Broke

 systemctl start kafka_01.service

systemctl start kafka_02.service

systemctl start kafka_03.service

netstat -ntlp

image

 kafka伪集群服务正常~

 协议冲突的错误日志:

image

 

Kafka启动错误:Only one of inter.broker.listener.name and security.inter.broker.protocol should be set

错误原因:Kafka配置中同时设置了security.inter.broker.protocolinter.broker.listener.name,两者互斥:

 

验证Kerberos认证

生成客户端票据:在Kafka服务器或客户端执行(需先安装Kerberos客户端):

 

kinit -kt /apprun/kafka_01/config/kafka.keytab kafka/kafka01.wangbc.com@WANGBC.COM

klist # 确认票据存在

image

 

创建测试Topic:

/apprun/kafka_01/bin/kafka-topics.sh --create --topic test-kerberos --bootstrap-server 192.168.109.141:7092,192.168.109.141:8092,192.168.109.141:9092    报错:

image

 

Kafka Topic创建超时问题排查:从操作日志看,kinit已成功获取Kerberos票据,但执行kafka-topics.sh时出现节点分配超时,核心原因是客户端与Broker的网络/认证未正常建立。以下是分步排查方案:

1.检查Kafka进程是否运行,ps aux | grep kafka # 确认Broker进程存在

2.验证Broker端口连通性,使用telnetnc测试客户端到Broker端口的网络连通性;telnet 192.168.109.141 7092 # 若无法连接,检查防火墙/端口开放

3.核心配置检查:Kerberos认证与监听器

3.1 Broker端配置(server.properties

3.2 客户端配置(client.properties

我们这还没创建客户端配置(client.properties

创建client.properties文件(路径可自定义),添加以下内容:
vim /apprun/kafka_01/config/client.properties
security.protocol=SASL_PLAINTEXT
sasl.mechanism=GSSAPI
sasl.kerberos.service.name=kafka

重新执行Topic创建命令,指定客户端配置文件,确保认证信息正确传递:
/apprun/kafka_01/bin/kafka-topics.sh \
--create \
--topic test-kerberos \
--bootstrap-server 192.168.109.141:7092 \
--command-config /apprun/kafka_01/config/client.properties # 指向客户端配置文件

image

错误分析:JAAS配置缺失
错误核心提示:Could not find a 'KafkaClient' entry in the JAAS configuration. System property 'java.security.auth.login.config' is not set
这表明客户端未配置JAAS(Java Authentication and Authorization Service)文件,导致Kerberos认证失败。

解决方案:配置JAAS文件并指定系统属性
在/apprun/kafka_01/config/目录下创建kafka_client_jaas.conf文件,内容如下:

/apprun/kafka_01/config/目录下创建文件,内容如下:

KafkaClient {
    com.sun.security.auth.module.Krb5LoginModule required
    useKeyTab=true
    keyTab="/apprun/kafka_01/config/kafka.keytab"
    principal="kafka/kafka01.wangbc.com@WANGBC.COM"
    useTicketCache=false
    storeKey=true;
};
kafka_client_jaas.conf

我这里将这个kafka_client_jaas.conf的内容追加到了kafka_server_jaas.conf中,拼接成了一个文件~

重新执行Topic创建命令,

方法1:使用环境变量(推荐)

export KAFKA_OPTS="-Djava.security.auth.login.config=/apprun/kafka_01/config/kafka_client_jaas.conf"

/apprun/kafka_01/bin/kafka-topics.sh \

--create \

--topic test-kerberos \

--bootstrap-server 192.168.109.141:7092 \

--command-config /apprun/kafka_01/config/client.properties

方法2:直接在命令前添加JVM参数 【备注:方法2不可行;JVM参数传递规则:-D开头的参数属于JVM启动参数,需通过KAFKA_OPTSJAVA_OPTS传递给Kafka脚本,不能直接作为命令行选项。】

/apprun/kafka_01/bin/kafka-topics.sh \

-Djava.security.auth.login.config=/apprun/kafka_01/config/kafka_client_jaas.conf \

--create \

--topic test-kerberos \

--bootstrap-server 192.168.109.141:7092 \

--command-config /apprun/kafka_01/config/client.properties

 

我这里采用了将export KAFKA_OPTS="-Djava.security.auth.login.config=/apprun/kafka_01/config/kafka_server_jaas.conf" 写入/apprun/kafka_01/bin/kafka-topics.sh 脚本中~

[apprun@kafka01 ~]$ /apprun/kafka_01/bin/kafka-topics.sh \
> --create \
> --topic test-kerberos \
> --bootstrap-server 192.168.109.141:7092 \
> --command-config /apprun/kafka_01/config/client.properties
Created topic test-kerberos.
[2026-03-04 15:56:23,261] WARN [Principal=kafka/kafka01.wangbc.com@WANGBC.COM]: TGT renewal thread has been interrupted and will exit. (org.apache.kafka.common.security.kerberos.KerberosLogin)
[apprun@kafka01 ~]$

操作结果:Topic创建成功

命令返回Created topic test-kerberos,说明Topic已成功创建,Kerberos认证流程正常完成 ✅。

关于WARN日志的说明

TGT renewal thread has been interrupted非致命警告,通常由以下原因导致:

  • Topic创建完成后,客户端主动终止了TGT(Ticket Granting Ticket)续期线程。
  • 客户端工具(如kafka-topics.sh)为短期操作设计,无需长期维持TGT续期。

无需处理:该警告不影响Topic功能,可忽略。

image

列出Topic:确认Topic存在

[apprun@kafka01 ~]$ /apprun/kafka_01/bin/kafka-topics.sh \
> --list \
> --bootstrap-server 192.168.109.141:7092 \
> --command-config /apprun/kafka_01/config/client.properties
test-kerberos
[2026-03-04 16:46:34,696] WARN [Principal=kafka/kafka01.wangbc.com@WANGBC.COM]: TGT renewal thread has been interrupted and will exit. (org.apache.kafka.common.security.kerberos.KerberosLogin)
[apprun@kafka01 ~]$

image

 

生产测试消息:验证写入权限

# 生产消息
#/apprun/kafka_01/bin/kafka-console-producer.sh --topic test-kerberos --bootstrap-server 192.168.109.141:7092

这里同理也需要将export KAFKA_OPTS="-Djava.security.auth.login.config=/apprun/kafka_01/config/kafka_server_jaas.conf" 写入/apprun/kafka_01/bin/kafka-console-producer.sh 脚本中~

[apprun@kafka01 ~]$ /apprun/kafka_01/bin/kafka-console-producer.sh \
> --topic test-kerberos \
> --bootstrap-server 192.168.109.141:7092 \
> --producer.config /apprun/kafka_01/config/client.properties

image

 


消费测试消息:验证读取权限
#/apprun/kafka_01/bin/kafka-console-consumer.sh --topic test-kerberos --from-beginning --bootstrap-server 192.168.109.141:7092

同理也需要将export KAFKA_OPTS="-Djava.security.auth.login.config=/apprun/kafka_01/config/kafka_server_jaas.conf" 写入/apprun/kafka_01/bin/kafka-console-consumer.sh 脚本中~

[apprun@kafka01 config]$ /apprun/kafka_01/bin/kafka-console-consumer.sh \
> --topic test-kerberos \
> --bootstrap-server 192.168.109.141:7092 \
> --consumer.config /apprun/kafka_01/config/client.properties \
> --from-beginning

image

 

 

常见问题排查

  • 启动失败:检查server.propertieslisteners是否正确,JAAS文件路径是否匹配。
  • 认证失败:确认KDC主体与JAAS配置中的principal一致,keytab文件权限是否为600
  • 网络问题:确保Kafka服务器能访问KDC的88端口(telnet kdc.wangbc.com 88)。

完成以上步骤后,Kafka伪集群将通过Kerberos认证提供安全访问。

posted on 2026-03-04 17:13  NG-承  阅读(0)  评论(0)    收藏  举报

导航