当前位置: 首页 > 知识库问答 >
问题:

为Apache KAFKA配置外部和内部侦听器,并为外部发布/订阅配置SASL身份验证

穆华彩
2023-03-14

我想使用2个侦听器配置Kafka身份验证(现在只需要身份验证而无需加密):

  • 一个用于与PLAINTEXT安全进行经纪间私人通信
  • 一个用于消费者/生产者与SASL_PLAINTEXT和SCRAM-SHA-256的公共通信

我有一个只有一个代理(用于测试目的)的Kafka集群和一个有两个节点的Zookeeper集群

我所做的步骤是:

  1. 在动物园管理员上创建“admin”和“test user”用户
kafka-configs.sh --zookeeper zk:2181 --alter --add-config 'SCRAM-SHA-256=[iterations=8192,password=test-secret]' \
 --entity-type users --entity-name test-user
kafka-configs.sh --zookeeper zk:2181 --alter --add-config 'SCRAM-SHA-256=[password=admin-secret]' \
 --entity-type users --entity-name admin
############################# Server Basics #############################
broker.id=1

############################# Socket Server Settings #############################
listeners=EXTERNAL://0.0.0.0:9095,INTERNAL://:9092
advertised.listeners=EXTERNAL://172.20.30.40:9095,INTERNAL://:9092
listener.security.protocol.map=INTERNAL:PLAINTEXT, EXTERNAL:SASL_PLAINTEXT

inter.broker.listener.name=INTERNAL
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256

sasl.enabled.mechanisms=PLAIN, SCRAM-SHA-256


num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
############################# Log Basics #############################
log.dirs=/opt/kafka/logs
num.partitions=1
num.recovery.threads.per.data.dir=1
delete.topic.enable=false
auto.create.topics.enable=true
default.replication.factor=1
############################# Log Flush Policy #############################
#log.flush.interval.messages=10000
#log.flush.interval.ms=1000
############################# Log Retention Policy #############################
log.retention.hours=168
#log.retention.bytes=1073741824
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
log.cleaner.enable=true
############################# Offset Retention #############################
offsets.retention.minutes=1440
############################# Connect Policy #############################
zookeeper.connect=10.42.203.74:2181,10.42.214.116:2181
zookeeper.connection.timeout.ms=6000
internal.KafkaServer {

   org.apache.kafka.common.security.plain.PlainLoginModule required
   username="admin"
   password="admin-secret";
};


external.KafkaServer {

   org.apache.kafka.common.security.scram.ScramLoginModule required;
};
kafka-topics.sh --create --zookeeper zk:2181 --replication-factor 1 --partitions 3 --topic test-topic
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required \
      username="test-user" \
      password="test-secret";
security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-256
kafka-console-producer.sh --broker-list 172.20.30.40:9095 --topic test-topic 
--producer.config client-secure.properties

我总是收到以下错误:

ERROR [Producer clientId=console-producer] Connection to node -1 failed authentication due to: 
Client SASL mechanism 'SCRAM-SHA-256' not enabled in the server, enabled mechanisms are [PLAIN] 
(org.apache.kafka.clients.NetworkClient)

为什么服务器上没有启用SCRAM-SHA-256机制?它不应该在“server.properties”文件上使用“sasl.enabled.mechanisms=PLAIN, SCRAM-SHA-256”属性并在“kafka_server_jaas.conf”文件上定义的外部侦听器配置上使用scram配置来启用吗?

我已经连续花了两天时间与这个应用不同的配置,但没有任何成功。任何帮助都将非常感谢。

提前致谢

共有1个答案

有凯泽
2023-03-14

经过几天的努力,我找到了解决办法。

我在帖子中没有提到我在Rancher中将KAFKA作为容器运行,并且EXTERNAL侦听器的端口9095没有在Rancher中映射,因此也不在docker容器中。

尽管我正在从容器内部进行测试,但如果您正在发布/订阅的侦听器的端口未映射,则它不起作用。

 类似资料:
  • 我正在尝试在WebLogic 10.3.5上创建一个MDB(EJB 3.0)。在外部AMQ服务器上监听队列。经过大量工作和教程组合,我在webLogic上部署时遇到以下错误。 [EJB:015027]消息驱动的EJB是事务性的,但JNDI名称ActiveMQXAConnectionFactory引用的JMS连接工厂不是JMS XA连接工厂。 以下是我所做工作的简要介绍: 我已经将相应的库添加到我的

  • 我有一个REST服务,它依赖于外部系统来验证令牌,但需要自己进行授权(使用like@Secured进行API级访问)。 要求: UI使用外部系统生成令牌 一种可能的解决方案是使用过滤器: > UI使用外部系统生成令牌 UI使用令牌对我的服务进行REST调用 我的服务有一个过滤器,它使用令牌调用外部系统 有效令牌的外部系统发回用户详细信息 我对成功呼叫集的服务与SecurityContextHold

  • Netflix客户端配置库Archaius 它是所有Netflix OSS组件用于配置的库。Archaius是Apache Commons Configuration项目的扩展。它允许通过轮询源进行更改或将源更改推送到客户端来进行配置更新。Archaius使用Dynamic <Type> Property类作为属性的句柄。Archaius示例 class ArchaiusTest { Dyna

  • Spring Boot允许您外部化配置,以便您可以在不同的环境中使用相同的应用程序代码。 您可以使用属性文件,YAML文件,环境变量和命令行参数来外部化配置。 可以使用@Value注释将属性值直接注入到bean中,通过Spring的Environment抽象访问,或者通过@ConfigurationProperties绑定到结构化对象。 Spring Boot使用一个非常特殊的PropertySo

  • 基于此http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html文档,但我得到以下错误: 使用注释工作很好,但我真的希望远离它。这方面的任何帮助都是很好的 谢谢 我将此解释为文件${spring.application.name}.properties将从命令行传入

  • 问题内容: 我正在开发Java桌面应用程序,并且想要一个外部configuration.xml。 我正在使用Netbeans开发应用程序,并尝试将config.xml文件添加到dist目录中,以使其驻留在应用程序工作文件夹中。但是,当Netbeans执行其清理操作时,它将删除dist目录, 我应该在何处放置此configuration.xml文件,以便它不会被删除并存在于应用程序启动目录中。 问题