kafka_2.13-3.4.0 SASL SCRAM 单机实战

986 阅读3分钟

小弟最近想从RabbitMQ升级上kafka,别问为什么,因为老板觉得高大上!

1.了解版本

kafka版本.png

kafka_2.13-3.4.0版本号说明:
2.13:编译 Kafka 源代码的 Scala 编译器版本
3.4.0:kafka版本号

2.了解权限

常在江湖飘,裸奔肯定会挨刀。所以还是得至少设置个密码。

729333093f5213798a1940871f13e5e.png

下面小弟选择SASL/SCRAM进行实战!

3. 设置

穷且志坚的小弟,当然选择免费又难操控的Apache kafka版本啦。
很多人用docker安装,但是小弟觉得它很繁琐,所以直接下安装包简单快捷可控。
链接(Apache Kafka)

解压下的目录:

329745a07eb35facf9b77b881c739ec.png

由于Kafka依赖于zookeeper,所以要先启动它。
1. zookeeper设置SCRAM相关

修改文件:config/zookeeper.properties 添加以下内容:

authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
requireClientAuthScheme=sasl

新建:zookeeper_jaas.conf

Server {
  org.apache.zookeeper.server.auth.DigestLoginModule required
  user_admin="password"
  user_kafka="password";
};

启动:

bin/zookeeper-server-start.sh -daemon config/zookeeper.properties

2. 设置用户 启动zookeeper之后,开始设置用户

新建admin用户和密码

bin/kafka-configs.sh --zookeeper localhost:2181 --alter --add-config 'SCRAM-SHA-256=[password=password],SCRAM-SHA-512=[password=password]' --entity-type users --entity-name admin

3. kafka设置SCRAM相关

新建 kafka_server_jaas.conf

KafkaServer {
        org.apache.kafka.common.security.scram.ScramLoginModule required
        username="admin"
        password="password"
        user_admin="password";
};

Client {
  org.apache.zookeeper.server.auth.DigestLoginModule required
  username="kafka"
  password="password";
};

说明:
KafkaServer字段是用来配置broker间通信使用的用户名和密码以及客户端连接时需要的用户名和密码,其中username和password是broker用于初始化连接到其他的broker,kafka用户为broker间的通讯。在一个Kafka集群中,这个文件的内容要一样,集群中每个Borker去连接其他Broker的时候都使用这个文件中定义的username和password来让对方进行认证
user_NAME语句,是用来配置客户端连接Broker时使用的用户名和密码,也就是新建用户的用户名都是以user_开头的,等号后面是密码,密码可以是明文且没有复杂度要求。完整语句是user_USERNAME="PASSWORD
Client部分是用来设置与Zookeeper的连接的,它还允许broker设置 SASL ACL 到zookeeper 节点,锁定这些节点,只有broker可以修改它。如果Zookeeper与Broker之间不设置认证,那么就可以不配置。这里要和zookeeper里面的设置的user_kafka="password"一样!

设置 server.properties

zookeeper.connect=10.221.230.69:2181

# Timeout in ms for connecting to zookeeper
zookeeper.connection.timeout.ms=18000

zookeeper.set.acl=true

listeners=SASL_PLAINTEXT://10.221.230.69:9092
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256
sasl.enabled.mechanisms=SCRAM-SHA-256
advertised.listeners=SASL_PLAINTEXT://10.221.230.69:9092


allow.everyone.if.no.acl.found=true
super.users=User:admin;User:kafka
authorizer.class.name=kafka.security.authorizer.AclAuthorizer

启动:

bin/kafka-server-start.sh  -daemon  config/server.properties

4. 命令行测试

这里小弟为了方便,直接用admin这个账号测试

  1. 创建topic

新建config.properties文件(小弟放在config下面),内容如下:

sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username='admin' password='password';
security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-256

然后执行:

bin/kafka-topics.sh --create --topic ticpictwo --bootstrap-server 10.221.230.69:9092 --command-config /home/soft/kafka_2.13-3.4.0/config/config.properties

2.查看所有topic

bin/kafka-topics.sh --list --bootstrap-server 10.221.230.69:9092 --command-config /home/soft/kafka_2.13-3.4.0/config/config.properties

3.product发送数据

新建配置文件:kafka_client_scram_producer_jaas_back.conf
内容如下:

KafkaClient {
        org.apache.kafka.common.security.scram.ScramLoginModule required
        username="admin"
        password="password";
};

修改config/producer.properties 增加内容如下:

security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-256

3.1 设置变量:

export KAFKA_OPTS="-Djava.security.auth.login.config=/home/soft/kafka_2.13-3.4.0/config/kafka_client_scram_producer_jaas.conf"

3.2 执行命令:

bin/kafka-console-producer.sh --topic ticpictwo --bootstrap-server 10.221.230.69:9092 --producer.config config/producer.properties

4. 集成springboot

4.1 新建product用户

sh kafka-configs.sh --zookeeper localhost:2181 --alter --add-config 'SCRAM-SHA-256=[password=test],SCRAM-SHA-512=[password=test]' --entity-type users --entity-name testproa

4.2 赋予testproa写操作

bin/kafka-acls.sh --authorizer kafka.security.authorizer.AclAuthorizer --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:testproa --operation Write --topic ticpictwo

4.3 consumer用户与操作权限,这里同product一样,小弟为了方便就直接用同一个用户testproa了

bin/kafka-acls.sh --authorizer kafka.security.authorizer.AclAuthorizer --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:testproa --operation Read --topic ticpictwo

4.4 pom配置

<dependency>
   <groupId>org.springframework.kafka</groupId>
   <artifactId>spring-kafka</artifactId>
</dependency>

4.5 application.yml配置

server:
    port : 8070

spring:
  kafka:
    bootstrap-servers: 10.221.230.69:9092
    producer:
      properties:
        security:
          protocol: SASL_PLAINTEXT
        sasl:
          jaas:
            config: org.apache.kafka.common.security.scram.ScramLoginModule required username='testproa' password='test';
          mechanism: SCRAM-SHA-256

      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer
    consumer:
      properties:
        security:
          protocol: SASL_PLAINTEXT
        sasl:
          jaas:
            config: org.apache.kafka.common.security.scram.ScramLoginModule required username='testproa' password='test';
          mechanism: SCRAM-SHA-256
      #group-id: spring-boot
      auto-offset-reset: earliest
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer

5.最后

5.1 安利一个监控工具KnowStreaming

image.png github.com/didi/knowst…

5.2 薅羊毛confluent.cloud/
免费试用一个用,够测试了

image.png

5.3 小弟不才,蛇蛇阅读,再见!