Rasa 项目中基于 SASL SCRAM-SHA-512 认证(无 TLS)的 Kafka 测试环境搭建指南 📅 发布时间:2026/9/13 2:18:28 👁 浏览次数: Rasa 项目中基于 SASL SCRAM-SHA-512 认证无 TLS的 Kafka 测试环境搭建指南【免费下载链接】rasa Open source machine learning framework to automate text- and voice-based conversations: NLU, dialogue management, connect to Slack, Facebook, and more - Create chatbots and voice assistants项目地址: https://gitcode.com/GitHub_Trending/ra/rasa导读本文讲解 Rasa 开源仓库中test_environments目录提供的 Kafka 测试环境——使用 SASL SCRAM-SHA-512 算法完成身份认证、但不启用 TLS 加密的 Docker Compose 部署方案。读完本文你将掌握如何启动带认证的 Zookeeper 与 Kafka Broker、在 Zookeeper 中创建 SCRAM 用户、将 Rasa 的事件流event broker通过endpoints.yml安全地对接该 Kafka 集群并理解配套 JAAS 配置文件与 RasaKafkaEventBroker源码之间的对应关系。一、为什么要搭建“带认证、无 TLS”的 Kafka 测试环境Rasa 在对话流程中会产生大量事件用户消息、机器人回复、槽位变化等这些事件可以通过事件代理Event Broker发布到 Kafka 等消息中间件用于追踪器存储、流式分析或与其他系统集成。而真实生产环境中的 Kafka 往往要求客户端完成身份认证。test_environments/message_and_event_brokers/kafka/README.md明确指出该目录提供一组“Kafka 可以在不同配置下运行”的测试环境用于在预定义配置下把 Kafka 以 Docker 容器方式快速拉起。其中既包含完全无认证的配置也包含 SASL_PLAIN、SASL_SCRAM各含 SHA-256 与 SHA-512 两种算法、以及是否叠加 TLS 加密的多种组合。本文聚焦的 scram_sha_512/no_tls 环境其定位是使用SASL_SCRAM 认证SCRAM-SHA-512 算法Kafka Broker 强制要求客户端提交合法凭据不启用 TLS 加密所有通信走明文连接仅用于测试环境验证“Kafka 要求客户端认证”这一场景下的接入流程。二、环境目录结构与端口约定该测试环境位于test_environments/message_and_event_brokers/kafka/sasl_scram/no_tls/scram_sha_512/目录下包含以下文件文件作用README.md本环境的启动说明与命令docker-compose.ymlZookeeper Kafka Broker 的服务编排定义broker_jaas.confKafka Broker 侧 JAAS 认证配置zookeeper_server_jaas.confZookeeper 服务端 JAAS 配置zookeeper_client_jaas.conf命令行工具连接 Zookeeper 时使用的 JAAS 配置在sasl_scram/no_tls目录下Rasa 仓库同时提供了scram_sha_256与scram_sha_512两个完全对称的变体父级说明区别仅在于 SCRAM 哈希算法。两者的启动步骤完全一致先启动 Zookeeper → 在 Zookeeper 中创建两个 SCRAM 用户 → 再启动 Kafka Broker。关于端口test_environments/message_and_event_brokers/kafka/README.md的约定是Kafka 监听909x、Zookeeper 监听218x具体数字取决于认证方案。需要特别指出的是本环境 README 描述 Kafka 监听9092、Zookeeper 监听2187而实际 docker-compose.yml 中 Kafka 的端口映射为9097:9097、Zookeeper 为2187:2187——以 compose 文件实际映射为准即 Kafka 连接地址为localhost:9097。这也解释了为什么父目录 README 用“909x/218x”来概括而不是写死某个端口。三、docker-compose.yml 逐项拆解docker-compose.yml 基于 Confluent 官方镜像confluentinc/cp-zookeeper:7.3.2与confluentinc/cp-kafka:7.3.2定义了zookeeper与kafka-broker两个服务。3.1 Zookeeper 服务zookeeper: image: confluentinc/cp-zookeeper:7.3.2 container_name: zookeeper-sasl-scram-sha-512-no-tls ports: - 2187:2187 environment: ZOOKEEPER_SERVER_ID: 1 ZOOKEEPER_CLIENT_PORT: 2187 ZOOKEEPER_TICK_TIME: 2000 ZOOKEEPER_LOG4J_ROOT_LOGLEVEL: DEBUG KAFKA_OPTS: -Djava.security.auth.login.config/etc/kafka/secrets/zookeeper_server_jaas.conf -Dquorum.auth.enableSasltrue -Dquorum.auth.learnerRequireSasltrue -Dquorum.auth.serverRequireSasltrue -Dquorum.cnxn.threads.size20 -Dzookeeper.authProvider.1org.apache.zookeeper.server.auth.SASLAuthenticationProvider -Dzookeeper.authProvider.2org.apache.zookeeper.server.auth.DigestAuthenticationProvider -DjaasLoginRenew3600000 -DrequireClientAuthSchemesasl -Dquorum.auth.learner.loginContextQuorumLearner -Dquorum.auth.server.loginContextQuorumServer volumes: - ./zookeeper_server_jaas.conf:/etc/kafka/secrets/zookeeper_server_jaas.conf - ./zookeeper_client_jaas.conf:/etc/kafka/client/zookeeper_client_jaas.conf关键点客户端端口为 2187与后续所有kafka-configs命令中的--zookeeper localhost:2187一致KAFKA_OPTS通过-Djava.security.auth.login.config指向挂载进容器的zookeeper_server_jaas.conf启用 Zookeeper 自身的 SASL 认证quorum.auth.*系列参数控制集群内节点间通信也需要 SASL同时启用SASLAuthenticationProvider与DigestAuthenticationProvider两类认证提供者对应 JAAS 中的Server/QuorumServer/QuorumLearner上下文两个 JAAS 文件都以 volume 方式挂载修改后重启容器即可生效。3.2 Kafka Broker 服务kafka-broker: image: confluentinc/cp-kafka:7.3.2 container_name: kafka-broker-sasl-scram-sha-512-no-tls ports: - 9097:9097 depends_on: - zookeeper environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2187 KAFKA_ADVERTISED_LISTENERS: SASL_PLAINTEXT://localhost:9097 KAFKA_MIN_INSYNC_REPLICAS: 1 KAFKA_SASL_ENABLED_MECHANISMS: SCRAM-SHA-512 KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SASL_PLAINTEXT KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: SCRAM-SHA-512 KAFKA_AUTO_CREATE_TOPICS_ENABLE: true KAFKA_OFFSETS_RETENTION_MINUTES: 172800 KAFKA_LOG4J_LOGGERS: kafka.authorizer.loggerDEBUG,kafka.controllerDEBUG KAFKA_LOG4J_ROOT_LOGLEVEL: DEBUG KAFKA_SUPER_USERS: User:kafkabroker;User:kafkaclient KAFKA_ZOOKEEPER_SASL_ENABLED: true KAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND: false KAFKA_OPTS: -Dzookeeper.sasl.clienttrue -Dzookeeper.sasl.clientconfigClient -Djava.security.auth.login.config/etc/kafka/secrets/conf/kafka_server_jaas.conf volumes: - ./broker_jaas.conf:/etc/kafka/secrets/conf/kafka_server_jaas.conf关键点监听器KAFKA_ADVERTISED_LISTENERS为SASL_PLAINTEXT://localhost:9097——前缀SASL_PLAINTEXT表明启用 SASL 认证但不加密这正是“无 TLS”语义的落点认证机制KAFKA_SASL_ENABLED_MECHANISMS: SCRAM-SHA-512声明 Broker 支持的唯一机制KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: SCRAM-SHA-512要求 Broker 之间通信也走 SCRAM-SHA-512因此 Broker 自身也需要一个 SCRAM 账号即下文broker_jaas.conf中的KafkaServer上下文超级用户KAFKA_SUPER_USERS: User:kafkabroker;User:kafkaclient将两个 SCRAM 用户加入超级用户名单配合KAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND: false意味着未通过 ACL 校验的请求会被拒绝但超级用户不受限制与 Zookeeper 的认证KAFKA_ZOOKEEPER_SASL_ENABLED: true且KAFKA_OPTS中-Dzookeeper.sasl.clienttrueBroker 连接 Zookeeper 时使用ClientJAAS 上下文即zookeeper_client_jaas.conf中定义的admin/password。四、JAAS 配置文件的作用与对照SASL 认证的凭据与登录模块通过 JAASJava Authentication and Authorization Service配置文件声明本环境共有三个4.1 broker_jaas.confKafka Broker 侧broker_jaas.conf 内容如下KafkaServer { org.apache.kafka.common.security.scram.ScramLoginModule required usernamekafkabroker passwordpassword; }; Client { org.apache.kafka.common.security.plain.PlainLoginModule required usernameadmin passwordpassword; }; KafkaClient { org.apache.kafka.common.security.scram.ScramLoginModule required usernamekafkaclient passwordpassword; };三个上下文的职责KafkaServerBroker 以kafkabroker身份向 Zookeeper 中的 SCRAM 凭据库完成认证ScramLoginModule用于 Broker 间通信ClientBroker 作为 Zookeeper 客户端时使用admin/password对应 zookeeper_client_jaas.conf 中的 Digest 认证KafkaClient声明客户端侧默认用户kafkaclient供连接本 Broker 的客户端包括 Rasa使用。4.2 Zookeeper 服务端与客户端配置zookeeper_server_jaas.conf 定义了四个上下文Server { org.apache.zookeeper.server.auth.DigestLoginModule required user_adminpassword; }; QuorumServer { org.apache.zookeeper.server.auth.DigestLoginModule required user_zookeeperpassword; }; QuorumLearner { org.apache.zookeeper.server.auth.DigestLoginModule required usernamezookeeper passwordpassword; };Server上下文维护 Zookeeper 对外客户端账号admin对应客户端侧 zookeeper_client_jaas.conf 中DigestLoginModule的admin/passwordQuorumServer/QuorumLearner两个上下文为 Zookeeper 集群内节点间通信提供凭据zookeeper/password与 compose 中-Dquorum.auth.learner.loginContextQuorumLearner、-Dquorum.auth.server.loginContextQuorumServer一一对应。五、启动步骤完整命令在scram_sha_512目录下依次执行以下步骤对应 README.md 的原始流程第 1 步启动 Zookeeperdocker-compose up -d zookeeper第 2 步进入 Zookeeper 容器创建两个 SCRAM 用户docker exec -it zookeeper-sasl-scram-sha-512 bash cd /etc/kafka/client容器内为 Kafka 创建kafkabroker用户Broker 认证用KAFKA_OPTS-Djava.security.auth.login.configzookeeper_client_jaas.conf kafka-configs --zookeeper localhost:2187 --alter --add-config SCRAM-SHA-512[iterations4096,passwordpassword] --entity-type users --entity-name kafkabroker再创建客户端用户README 原始命令中实体名为client而父级 README 与broker_jaas.conf中实际使用的客户端账号是kafkaclient使用时请保持客户端配置与 Zookeeper 中创建的实体名一致KAFKA_OPTS-Djava.security.auth.login.configzookeeper_client_jaas.conf kafka-configs --zookeeper localhost:2187 --alter --add-config SCRAM-SHA-512[iterations4096,passwordpassword] --entity-type users --entity-name client命令要点--zookeeper localhost:2187指向本环境的 Zookeeper 端口--alter --add-config SCRAM-SHA-512[iterations4096,passwordpassword]为指定用户添加 SCRAM-SHA-512 凭据iterations4096为 SCRAM 迭代次数密码为password命令必须携带KAFKA_OPTS指向zookeeper_client_jaas.conf否则kafka-configs无法通过 Zookeeper 的 SASL 认证。第 3 步退出容器并启动 Kafka Brokerexit docker-compose up -d kafka-broker整个流程与sasl_scram/no_tls父级 README 描述的三段式完全吻合先启动 Zookeeper再向 Zookeeper 写入两个 SCRAM 用户一个供 Kafka 向 Zookeeper 认证一个供客户端向 Kafka 认证最后启动 Kafka 容器。六、客户端如何连接 Broker环境就绪后客户端可按下表凭据连接用户密码kafkaclientpassword连接参数依据 sasl_scram/no_tls/README.md认证机制设置为SASL SCRAM-SHA-512若运行的是scram_sha_256变体则用 SCRAM-SHA-256连接地址localhost:9097compose 实际映射README 描述中的 9092 为通用约定请以实际端口映射为准安全协议SASL_PLAINTEXT有认证、无加密。七、对接 Rasaendpoints.yml 与 KafkaEventBroker 源码7.1 Rasa 侧配置Rasa 通过endpoints.yml中的event_broker段落将全部对话事件发布到 Kafka。参考仓库中现成的 kafka_sasl_plaintext_endpoint.ymlSASL_PLAINTEXT 场景对接本环境只需把sasl_mechanism改为SCRAM-SHA-512event_broker: type: kafka security_protocol: SASL_PLAINTEXT topic: rasa_core_events url: localhost:9097 partition_by_sender: True sasl_username: kafkaclient sasl_password: password sasl_mechanism: SCRAM-SHA-512字段与KafkaEventBroker构造参数一一对应见 rasa/core/brokers/kafka.pyurlBroker 引导地址localhost:9097topic事件写入的主题默认rasa_core_eventspartition_by_sender是否按sender_id分区sasl_username/sasl_password客户端 SCRAM 凭据sasl_mechanism认证机制默认PLAIN本环境必须为SCRAM-SHA-512security_protocol默认即SASL_PLAINTEXT与本环境匹配。7.2 源码层面对应关系从 rasa/core/brokers/kafka.py 的实现可以确认当security_protocol为SASL_PLAINTEXT时KafkaEventBroker会向底层 producer 注入如下参数authentication_params { sasl.username: self.sasl_username, sasl.password: self.sasl_password, sasl.mechanism: self.sasl_mechanism, security.protocol: self.security_protocol, }即sasl_mechanism被原样透传给 confluent-kafka 客户端与 Broker 端KAFKA_SASL_ENABLED_MECHANISMS: SCRAM-SHA-512严格匹配才能握手成功。该构造参数的类型注释kafka.py#L60-L63也明确指出sasl_mechanism的合法取值包括PLAIN、GSSAPI、OAUTHBEARER、SCRAM-SHA-256与SCRAM-SHA-512与本环境的机制值完全对齐。此外仓库文档 event-brokers.mdx 也佐证了这一点使用SASL_PLAINTEXT/SASL_SSL协议时sasl_mechanism可配置、默认PLAIN合法值即上述五种。八、注意事项与排查要点端口以 compose 为准README 与父级文档中的 9092 属于通用描述本目录实际映射为localhost:9097修改端口时需同步更新KAFKA_ADVERTISED_LISTENERS与 Rasaendpoints.yml中的url。用户名一致性启动命令创建用户时的--entity-name必须与客户端配置、broker_jaas.conf中实际使用的用户名完全一致否则 SASL 握手会因“无此用户”失败。安全边界本环境不启用 TLS凭据与事件内容均以明文传输仅限本地/测试用途生产环境应切换到仓库中对应的with_tls变体test_environments/message_and_event_brokers/kafka/sasl_scram/with_tls/scram_sha_512/并配合security_protocol: SASL_SSL与ssl_cafile等参数使用。ACL 策略compose 中KAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND: false意味着默认拒绝无 ACL 的访问测试时主要依赖KAFKA_SUPER_USERS中的两个用户绕过限制。调试手段两个容器均开启了DEBUG级别的日志KAFKA_LOG4J_ROOT_LOGLEVEL、ZOOKEEPER_LOG4J_ROOT_LOGLEVELSASL 握手失败时可在容器日志中定位认证细节。通过以上步骤你可以在本地快速复现一个“客户端必须通过 SCRAM-SHA-512 认证才能发布/消费事件”的 Kafka 环境并让 Rasa 以SASL_PLAINTEXT协议接入为后续升级到带 TLS 的生产级配置打下基础。仓库中sasl_scram/with_tls、sasl_plain等其他变体见 kafka/README.md可作为对照参考按需组合出不同的安全等级。【免费下载链接】rasa Open source machine learning framework to automate text- and voice-based conversations: NLU, dialogue management, connect to Slack, Facebook, and more - Create chatbots and voice assistants项目地址: https://gitcode.com/GitHub_Trending/ra/rasa创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考