KAFKA鉴权设计以及相关探讨

33 篇文章 1 订阅
9 篇文章 0 订阅

鉴权,分别由组成

  • : 表示身份认证,认证相关用户是否存在以及相关的用户名和密码是否一致
  • : 完成身份的后,还需要判断用户是否有相关操作的权限。

因此对于某一个用户来说,通常情况下,需要完成才能够满足一个完整的业务场景,因此通常将鉴权放在一起考量。本文探讨kafka的鉴权常用的鉴权方式以及相关鉴权设计方式。


1. kafka的鉴权设计

kafka通常不需要进行鉴权设计,但是由于一些项目的安全性要求,会进行要求鉴权配置

: 身份认证

身份的认证有4种方式:

  • SASL/GSSAPI:kerberos认证方式,一般使用随机密码的keytab认证方式,密码是加密的,也是企业里使用最多的认证方式,在0.9版本引入;
  • SASL/PLAIN:这种方式其实就是一个账号/密码的认证方式,不过它有很多缺陷,比如用户名密码是存储在文件中,不能动态添加,密码明文等等!这些特性决定了它比较鸡肋,但好处是足够简单,这使得我们可以方便地对它进行二次开发,在0.10版本引入;
  • SASL/SCRAM:针对SASL/PLAIN方式的不足而提供的另一种认证方式。这种方式的用户名/密码是存储中zookeeper的,因此能够支持动态添加用户。该种认证方式还会使用sha256或sha512对密码加密,安全性相对会高一些,在0.10.2版本引入;
  • SASL/OAUTHBEARER:是基于OAuth 2.0的认证框架,实现较为复杂,目前业内应该较少使用,在2.0版本引入。

: 操作权限
5种操作权限:
CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、删、改、查、管理权限,

注:这5种权限中,delete是指对子节点的删除权限,其它4种权限指对自身节点的操作权限。

2. kafka鉴权应用范围

kafka的鉴权范围,通常会包括2个层面

  • broker之间的通信
  • 客户端跟kafka之间的通信

在这4种鉴权模式下,最常用的是SASL\PLAIN模式,能够在满足权限要求和kafka的性能损耗上取的比较好的这种,这种认证方式对kafka的性能损耗影响相对较小。本文重点介绍SASL\PLAIN模式的鉴权方式。

3. kafka鉴权的常用方法

3.1 SASL/GSSAPI

相关操作方法可以参考 大数据Hadoop之——Kafka鉴权认证(Kafka kerberos认证+kafka账号密码认证+CDH Kerberos认证)

3.2 SASL/PLAIN

SASL/PLAIN 是一种简单的用户名/密码认证机制,通常与 TLS 一起用于加密以实现安全认证。Kafka 支持 SASL/PLAIN 的默认实现,可以按照此处所述进行扩展以供生产使用。

3.2.1 配置jaas

在每个 Kafka 代理的配置目录中添加一个经过适当修改的 JAAS 文件,类似于下面的文件,我们将其命名为 kafka_server_jaas.conf 以用于本示例:

$ mkdir $KAFKA_HOME/config/userpwd
$ cat >$KAFKA_HOME/config/userpwd/kafka_server_jaas.conf <<EOF
KafkaServer {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="admin"
    password="adminpasswd"
    user_admin="adminpasswd"
    user_kafka="123456"
    user_producer="producerpwd"
    user_consumer="consumerpwd";
};
EOF
  • 该文件中username和password是定义kafka集群broker节点之间认证的用户名和密码
  • user_开头配置的用户kafka和密码kafka是提供给外部应用连接kafka使用的,后面kafka使用此用户连接zookeeper。上面配置的 user_kafka=“123456”,用户为kafka,密码为123456
  • 上述配置中,创建了三个用户,分别为admin、producer和consumer(创建多少个用户,可根据业务需要配置,用户名和密码可自定义设置)
  • 通常使用这种方式,能够实现简易的租户配置,但是优雅控制租户的鉴权

3.2.2 配置服务启动参数

根据kafka的部署路径和启动脚本,启动时加载kafka_server_jaas.conf使之生效。

export KAFKA_OPTS="-Dzookeeper.sasl.client=false -Dzookeeper.sasl.client.username=zk-server -Djava.security.auth.login.config=/opt/bigdata/hadoop/server/kafka_2.13-3.1.1/config/userpwd/kafka_server_jaas.conf"

3.2.3 配置server.perperties

添加或者调整如下相关配置,指定相关认证方式

listeners=SASL_PLAINTEXT://0.0.0.0:19092
advertised.listeners=SASL_PLAINTEXT://xx.xx.xx.xx:19092
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=PLAIN
sasl.enabled.mechanisms=PLAIN
authorizer.class.name=kafka.security.authorizer.AclAuthorizer
allow.everyone.if.no.acl.found=true

正常启动kafka后,kafka服务端的鉴权配置已经调整完成。

更多使用方式参考文档 大数据Hadoop之——Kafka鉴权认证(Kafka kerberos认证+kafka账号密码认证+CDH Kerberos认证)

4. 参考文档

  • 27
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在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、付费专栏及课程。

余额充值