安全配置

Apache Kafka 支持客户端与 Broker 之间的安全连接。要利用此特性,请遵循 Apache Kafka 文档 以及 Confluent 文档中 Kafka 0.9 的 安全指南。使用 spring.cloud.stream.kafka.binder.configuration 选项为 Binder 创建的所有客户端设置安全属性。

例如,要将 security.protocol 设置为 SASL_SSL,请设置以下属性

spring.cloud.stream.kafka.binder.configuration.security.protocol=SASL_SSL

所有其他安全属性都可以通过类似的方式设置。

使用 Kerberos 时,请遵循 参考文档 中的说明来创建和引用 JAAS 配置。

Spring Cloud Stream 支持通过 JAAS 配置文件和 Spring Boot 属性将 JAAS 配置信息传递给应用。

使用 JAAS 配置文件

JAAS 和 (可选的) krb5 文件位置可以通过系统属性为 Spring Cloud Stream 应用设置。以下示例展示了如何使用 JAAS 配置文件启动一个启用 SASL 和 Kerberos 的 Spring Cloud Stream 应用

 java -Djava.security.auth.login.config=/path.to/kafka_client_jaas.conf -jar log.jar \
   --spring.cloud.stream.kafka.binder.brokers=secure.server:9092 \
   --spring.cloud.stream.bindings.input.destination=stream.ticktock \
   --spring.cloud.stream.kafka.binder.configuration.security.protocol=SASL_PLAINTEXT

使用 Spring Boot 属性

作为使用 JAAS 配置文件的替代方案,Spring Cloud Stream 提供了一种机制,可以通过 Spring Boot 属性为 Spring Cloud Stream 应用设置 JAAS 配置。

可以使用以下属性来配置 Kafka 客户端的登录上下文

spring.cloud.stream.kafka.binder.jaas.loginModule

登录模块名称。通常情况下无需设置。

默认值:com.sun.security.auth.module.Krb5LoginModule

spring.cloud.stream.kafka.binder.jaas.controlFlag

登录模块的控制标志。

默认值:required

spring.cloud.stream.kafka.binder.jaas.options

包含登录模块选项的键/值对 Map。

默认值:空 Map。

以下示例展示了如何使用 Spring Boot 配置属性启动一个启用 SASL 和 Kerberos 的 Spring Cloud Stream 应用

 java --spring.cloud.stream.kafka.binder.brokers=secure.server:9092 \
   --spring.cloud.stream.bindings.input.destination=stream.ticktock \
   --spring.cloud.stream.kafka.binder.autoCreateTopics=false \
   --spring.cloud.stream.kafka.binder.configuration.security.protocol=SASL_PLAINTEXT \
   --spring.cloud.stream.kafka.binder.jaas.options.useKeyTab=true \
   --spring.cloud.stream.kafka.binder.jaas.options.storeKey=true \
   --spring.cloud.stream.kafka.binder.jaas.options.keyTab=/etc/security/keytabs/kafka_client.keytab \
   --spring.cloud.stream.kafka.binder.jaas.options.principal=kafka-client-1@EXAMPLE.COM

前面的示例相当于以下 JAAS 文件

KafkaClient {
    com.sun.security.auth.module.Krb5LoginModule required
    useKeyTab=true
    storeKey=true
    keyTab="/etc/security/keytabs/kafka_client.keytab"
    principal="[email protected]";
};

如果所需的主题已存在于 Broker 上或将由管理员创建,则可以关闭自动创建,此时只需发送客户端 JAAS 属性。

请勿在同一个应用中混合使用 JAAS 配置文件和 Spring Boot 属性。如果已存在 -Djava.security.auth.login.config 系统属性,Spring Cloud Stream 会忽略 Spring Boot 属性。
在使用 Kerberos 时,请谨慎使用 autoCreateTopicsautoAddPartitions。通常,应用可能使用在 Kafka 和 Zookeeper 中没有管理员权限的主体(principals)。因此,依赖 Spring Cloud Stream 创建/修改主题可能会失败。在安全环境中,强烈建议使用 Kafka 工具进行主题创建和 ACL 管理。

多 Binder 配置和 JAAS

连接到需要各自独立 JAAS 配置的多个集群时,请使用属性 sasl.jaas.config 设置 JAAS 配置。当应用中存在此属性时,它将优先于上述其他策略。有关更多详细信息,请参阅此 KIP-85

例如,如果您的应用中有两个需要独立 JAAS 配置的集群,则可以使用以下模板

spring.cloud.stream:
    binders:
        kafka1:
          type: kafka
          environment:
             spring:
               cloud:
                 stream:
                  kafka:
                    binder:
                      brokers: localhost:9092
                      configuration.sasl.jaas.config: "org.apache.kafka.common.security.plain.PlainLoginModule required username=\"admin\" password=\"admin-secret\";"
        kafka2:
          type: kafka
          environment:
            spring:
              cloud:
                stream:
                  kafka:
                    binder:
                      brokers: localhost:9093
                      configuration.sasl.jaas.config: "org.apache.kafka.common.security.plain.PlainLoginModule required username=\"user1\" password=\"user1-secret\";"
    kafka.binder:
        configuration:
          security.protocol: SASL_PLAINTEXT
          sasl.mechanism: PLAIN

请注意,在上述配置中,两个 Kafka 集群及其各自的 sasl.jaas.config 值都不同。

有关如何设置和运行此类应用的更多详细信息,请参阅此 示例应用