安全配置

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

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

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

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

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

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

使用 JAAS 配置文件

可以通过使用系统属性为 Spring Cloud Stream 应用程序设置 JAAS 和(可选)krb5 文件位置。以下示例显示了如何使用 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

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

默认值:空映射。

以下示例显示了如何使用 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]";
};

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

不要在同一个应用程序中混合使用 JAAS 配置文件和 Spring Boot 属性。如果-Djava.security.auth.login.config系统属性已存在,则 Spring Cloud Stream 会忽略 Spring Boot 属性。

在使用autoCreateTopicsautoAddPartitions与Kerberos结合时,请务必小心。通常,应用程序可能会使用在Kafka和Zookeeper中没有管理员权限的主体。因此,依赖Spring Cloud Stream创建/修改主题可能会失败。在安全环境中,我们强烈建议使用Kafka工具以管理员身份创建主题和管理ACL。

多绑定器配置和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值都不同。

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