安全配置
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 时,请谨慎使用 autoCreateTopics 和 autoAddPartitions 。通常,应用可能使用在 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
值都不同。
有关如何设置和运行此类应用的更多详细信息,请参阅此 示例应用。