Kafka鉴权与限流

本文介绍了Kafka在0.9.0.0版本后的安全增强,包括SSL和SASL的身份验证机制。详细讲解了如何使用SSL加密连接以及SASL的Kerberos、PLAIN和SCRAM-SHA-256/512认证方式,特别是SASL/PLAIN的生产环境应用和SASL/SCRAM的动态认证特性。同时,提供了配置Kafka Brokers和客户端的步骤,强调了安全注意事项,如SSL的性能影响和SCRAM的凭证管理。
摘要由CSDN通过智能技术生成

Kafka鉴权与限流

https://kafka.apache.org/21/documentation.html#security

Overview

在 0.9.0.0 版本中,Kafka 社区添加了许多功能,这些功能可以单独或一起使用,以提高 Kafka 集群的安全性。
当前支持以下安全措施:

  • 使用 SSL 或 SASL 验证从客户端(生产者和消费者)、其他代理和工具到代理的连接.Kafka 支持以下 SASL 机制:
    • SASL/GSSAPI (Kerberos) - starting at version 0.9.0.0
    • SASL/PLAIN - starting at version 0.10.0.0
    • SASL/SCRAM-SHA-256 and SASL/SCRAM-SHA-512 - starting at version 0.10.2.0
    • SASL/OAUTHBEARER - starting at version 2.0
  • 从brokers 到 ZooKeeper 的连接身份验证
  • Encryption of data transferred between brokers and clients, between brokers, or between brokers and tools using SSL(请注意,启用 SSL 时会出现性能下降,其幅度取决于 CPU 类型和 JVM 实现)
  • Authorization of read / write operations by clients
  • Authorization is pluggable and integration with external authorization services is supported

使用 SSL 进行加密和身份验证

Apache Kafka 允许客户端通过 SSL 连接。默认情况下,SSL 处于禁用状态,但可以根据需要打开。

本次调研不是用, 如果有需要可以点链接进行查看…

使用 SASL 进行身份验证

Kafka 可以使用 Java 身份验证和授权服务 (JAAS) 进行 SASL 配置

JAAS 配置

介绍了使用JAAS认证的步骤, 可以查看,后面不同的类型, 会有具体提现

SASL 配置

介绍SASL配置的步骤, 点击链接查看, 后面具体配置有提现的方式

SASL 可以与 PLAINTEXT 或 SSL 一起使用,作为传输层,分别使用安全协议 SASL_PLAINTEXT 或 SASL_SSL
如果使用 SASL_SSL,则还必须配置 SSL, 因此我们使用的是SASL_PLAIN
  • Kafka SASL的机制

    Kafka 支持以下 SASL 机制:

在Spring Boot中整合Kafka鉴权可以通过配置Kafka的安全协议来实现。具体步骤如下: 1. 在Kafka服务器端配置安全协议,包括SSL和SASL认证等。 2. 在Spring Boot应用程序中配置Kafka的安全协议,包括SSL和SASL认证等。 3. 在Spring Boot应用程序中使用KafkaTemplate或者KafkaConsumer来发送或接收消息。 下面是一个简单的示例代码: ```java @Configuration @EnableKafka public class KafkaConfig { @Value("${spring.kafka.bootstrap-servers}") private String bootstrapServers; @Value("${spring.kafka.security.protocol}") private String securityProtocol; @Value("${spring.kafka.ssl.trust-store-location}") private String trustStoreLocation; @Value("${spring.kafka.ssl.trust-store-password}") private String trustStorePassword; @Value("${spring.kafka.ssl.key-store-location}") private String keyStoreLocation; @Value("${spring.kafka.ssl.key-store-password}") private String keyStorePassword; @Value("${spring.kafka.ssl.key-password}") private String keyPassword; @Value("${spring.kafka.ssl.endpoint-identification-algorithm}") private String endpointIdentificationAlgorithm; @Value("${spring.kafka.sasl.mechanism}") private String saslMechanism; @Value("${spring.kafka.sasl.jaas.config}") private String saslJaasConfig; @Bean public KafkaTemplate<String, String> kafkaTemplate() { return new KafkaTemplate<>(producerFactory()); } @Bean public ProducerFactory<String, String> producerFactory() { return new DefaultKafkaProducerFactory<>(producerConfigs()); } @Bean public Map<String, Object> producerConfigs() { Map<String, Object> props = new HashMap<>(); props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, securityProtocol); props.put(SslConfigs.SSL_TRUSTSTORE_LOCATION_CONFIG, trustStoreLocation); props.put(SslConfigs.SSL_TRUSTSTORE_PASSWORD_CONFIG, trustStorePassword); props.put(SslConfigs.SSL_KEYSTORE_LOCATION_CONFIG, keyStoreLocation); props.put(SslConfigs.SSL_KEYSTORE_PASSWORD_CONFIG, keyStorePassword); props.put(SslConfigs.SSL_KEY_PASSWORD_CONFIG, keyPassword); props.put(SslConfigs.SSL_ENDPOINT_IDENTIFICATION_ALGORITHM_CONFIG, endpointIdentificationAlgorithm); props.put(SaslConfigs.SASL_MECHANISM, saslMechanism); props.put(SaslConfigs.SASL_JAAS_CONFIG, saslJaasConfig); return props; } @Bean public ConsumerFactory<String, String> consumerFactory() { return new DefaultKafkaConsumerFactory<>(consumerConfigs()); } @Bean public Map<String, Object> consumerConfigs() { Map<String, Object> props = new HashMap<>(); props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, securityProtocol); props.put(SslConfigs.SSL_TRUSTSTORE_LOCATION_CONFIG, trustStoreLocation); props.put(SslConfigs.SSL_TRUSTSTORE_PASSWORD_CONFIG, trustStorePassword); props.put(SslConfigs.SSL_KEYSTORE_LOCATION_CONFIG, keyStoreLocation); props.put(SslConfigs.SSL_KEYSTORE_PASSWORD_CONFIG, keyStorePassword); props.put(SslConfigs.SSL_KEY_PASSWORD_CONFIG, keyPassword); props.put(SslConfigs.SSL_ENDPOINT_IDENTIFICATION_ALGORITHM_CONFIG, endpointIdentificationAlgorithm); props.put(SaslConfigs.SASL_MECHANISM, saslMechanism); props.put(SaslConfigs.SASL_JAAS_CONFIG, saslJaasConfig); return props; } @Bean public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory() { ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>(); factory.setConsumerFactory(consumerFactory()); return factory; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值