在Kafka2.7.2中进行SASL_SCRAM认证配置

本文详细介绍了如何在Kafka2.7.2版本中配置SASL_SCRAM安全认证,包括创建用户、维护证书、服务器端和客户端的配置,以及权限管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Kafka2.7.2中进行SASL_SCRAM认证配置

1. 启动Zookeeper

​ 在没有设置任何权限的配置下启动Zookeeper:

nohup sh ./bin/zookeeper-server-start.sh ./config/zookeeper.properties  >/dev/null 2>&1 &

2 创建SCRAM证书

2.1 创建broker通信用户admin

​ 在使用sasl之前必须先创建,否则启动报错

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

2.2 创建生产用户producer

bin/kafka-configs.sh --zookeeper 127.0.0.1:2181 --alter --add-config 'SCRAM-SHA-256=[iterations=8192,password=producer-succ],SCRAM-SHA-512=[password=producer-succ]' --entity-type users --entity-name producer

2.3 创建消费用户:consumer

bin/kafka-configs.sh --zookeeper 127.0.0.1:2181 --alter --add-config 'SCRAM-SHA-256=[iterations=8192,password=consumer-succ],SCRAM-SHA-512=[password=consumer-succ]' --entity-type users --entity-name consumer

​ SCRAM-SHA-256/SCRAM-SHA-512是对密码加密的算法,二者有其一即可。

3 维护SCRAM证书

3.1 查看SCRAM证书

bin/kafka-configs.sh --zookeeper 127.0.0.1:2181 --describe --entity-type users --entity-name producer

bin/kafka-configs.sh --zookeeper 127.0.0.1:2181 --describe --entity-type users --entity-name consumer

3.2 删除SCRAM证书

bin/kafka-configs.sh --zookeeper localhost:2181 --alter --delete-config 'SCRAM-SHA-512' --delete-config 'SCRAM-SHA-256' --entity-type users --entity-name producer

4 服务端配置

​ 在用户证书创建完毕之后开始Kafka服务端的配置

4.1 创建JAAS文件

​ 进入kafka/config文件夹,执行以下命令:

cat > kafka_server_jaas.conf << EOF
KafkaServer {
    org.apache.kafka.common.security.scram.ScramLoginModule required
    username="admin"
    password="admin-succ";
};
EOF

4.2 启动加载jaas配置文件

​ 进入kafka/bin文件夹,在 kafka-server-start.sh 最上方添加(路径换成自己的)

export KAFKA_OPTS=" -Djava.security.auth.login.config=/data/bigdata/apps/kafka/config/kafka_server_jaas.conf"

4.3 配置server.properties【config/server.properties】

​ 将下面配置添加至其中

#认证配置
listeners=SASL_PLAINTEXT://:9092
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256
sasl.enabled.mechanisms=SCRAM-SHA-256

#ACL配置
allow.everyone.if.no.acl.found=false
super.users=User:admin
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer

​ 可以根据自己的需求选择SASL_SSL或SASL_PLAINTEXT, PLAINTEXT为不加密明文传输,性能好一点。

4.4 配置完后重启Zookeeper,再启动Kafka

./bin/zookeeper-server-stop.sh

nohup sh ./bin/zookeeper-server-start.sh ./config/zookeeper.properties  >/dev/null 2>&1 &
 
nohup sh ./bin/kafka-server-start.sh ./config/server.properties  >/dev/null 2>&1 &

5 客户端配置

5.1 创建的三个用户的三个JAAS文件

kafka_client_scram_admin_jaas.conf
kafka_client_scram_producer_jaas.conf
kafka_client_scram_consumer_jaas.conf
EOF

​ 进入kafka/config文件夹,执行以下命令:

cat > kafka_client_scram_admin_jaas.conf << EOF
KafkaClient {
    org.apache.kafka.common.security.scram.ScramLoginModule required
    username="admin"
    password="admin-succ";
};
EOF

cat > kafka_client_scram_producer_jaas.conf << EOF
KafkaClient {
    org.apache.kafka.common.security.scram.ScramLoginModule required
    username="producer"
    password="producer-succ";
};
EOF

cat > kafka_client_scram_consumer_jaas.conf << EOF
KafkaClient {
    org.apache.kafka.common.security.scram.ScramLoginModule required
    username="consumer"
    password="consumer-succ";
};
EOF

5.2 在启动脚本中引入JAAS文件

​ 进入kafka/bin文件夹,在 kafka-console-producer.sh 最上方添加(路径换成自己的):

export KAFKA_HEAP_OPTS="-Xmx512M -Djava.security.auth.login.config=/data/bigdata/apps/kafka/config/kafka_client_scram_producer_jaas.conf"

​ 进入kafka/bin文件夹,在 kafka-console-consumer.sh 最上方添加(路径换成自己的):

export KAFKA_HEAP_OPTS="-Xmx512M -Djava.security.auth.login.config=/data/bigdata/apps/kafka/config/kafka_client_scram_consumer_jaas.conf"

5.3 配置consumer.properties和producer.properties,都加入以下配置

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

5.4 创建配置文件command_config.properties

​ 该文件其实也是配置的连接Kafka的用户配置文件,但是该文件用于kafka-acls.sh,kafka-configs.sh等文件,同样的名称和路径可自定义,我这里还是把该文件放到解压的config目录中,内容如下:

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

5.5 创建主题

bin/kafka-topics.sh --zookeeper 127.0.0.1:2181 --create --topic test --partitions 3 --replication-factor 1

bin/kafka-topics.sh --zookeeper 127.0.0.1:2181 --list

#或者:

bin/kafka-topics.sh --create --bootstrap-server 127.0.0.1:9092 --topic test --partitions 3 --replication-factor 1 --command-config ./config/command_config.properties

bin/kafka-topics.sh --list --bootstrap-server 127.0.0.1:9092 --command-config ./config/command_config.properties

5.6 启动生产

bin/kafka-console-producer.sh --broker-list 127.0.0.1:9092 --topic test --producer.config config/producer.properties

5.7 对生产者赋予写的权限

bin/kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=127.0.0.1:2181 --add --allow-principal User:producer --operation Write --topic test

5.8 查看权限

bin/kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=127.0.0.1:2181 --list

5.9 对消费者赋予读的权限

bin/kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=127.0.0.1:2181 --add --allow-principal User:consumer --operation Read --topic test

5.10 对消费者赋予组的权限

bin/kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=127.0.0.1:2181 --add --allow-principal User:consumer --operation Read --group test-consumer-group

5.11 启动消费者

bin/kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --topic test --from-beginning --consumer.config config/consumer.properties

参考文档

(1):Kafka配置动态SASL_SCRAM认证

<think>好的,我现在需要帮助用户解决在Kubernetes上部署带SASL认证的单节点Kafka 2.7.2的问题,特别是如何使用环境变量配置。首先,我得理清楚步骤,确保覆盖所有必要环节。 用户提到了使用环境变量,可能是指通过Kubernetes的配置来传递SASL相关的参数,比如用户名、密码等。KafkaSASL认证通常涉及几个配置文件,比如server.properties和jaas.conf,这些需要在容器启动时生成或注入。 首先,Kafka的部署通常需要Zookeeper,所以可能需要先部署Zookeeper。不过用户的问题集中在Kafka本身,所以可能假设Zookeeper已经部署好了。接下来,Kafka配置中需要启用SASL,比如设置listeners、security.inter.broker.protocol等参数。这些可以通过环境变量传递到容器中,或者通过ConfigMap挂载配置文件。 环境变量的使用方面,可能需要编写一个启动脚本,在容器启动时读取环境变量并写入到配置文件中。比如,在Dockerfile中有一个entrypoint脚本,负责生成server.properties和jaas.conf,使用envsubst之类的工具替换变量。 然后,涉及到SASL的JAAS配置,这部分比较敏感,因为包含用户名和密码,所以应该使用Kubernetes Secret来存储,而不是ConfigMap。用户可能需要创建一个Secret,包含JAAS配置中的用户名和密码,然后挂载到容器的指定路径。 另外,KafkaSASL认证有多种机制,比如PLAIN、SCRAM等,用户可能使用的是PLAIN机制,所以需要确认配置正确的SASL机制,并在server.properties中设置相应的安全协议。 接下来是Kubernetes的部署文件,包括Deployment和Service。Deployment中需要配置环境变量,从Secret中获取敏感信息,并挂载配置文件。可能需要使用环境变量来设置Kafka的broker id、监听地址等参数,同时将jaas.conf通过volume挂载到指定位置。 最后,测试部署是否成功,可以使用客户端工具进行验证,比如使用kafka-console-producer和kafka-console-consumer,并指定SASL认证参数。这部分可能需要另一个Pod来执行测试命令,或者使用已有的工具。 需要确保所有步骤中的配置正确,特别是环境变量与配置文件中的占位符对应,Secret的键名正确,以及Kubernetes资源的权限设置正确。另外,Kafka的版本和对应的配置是否兼容也需要检查,用户指定的是2.7.2版本,可能需要参考该版本的官方文档确认配置项。 可能遇到的问题包括环境变量未正确替换,导致配置文件错误;SASL配置未正确加载,导致认证失败;网络策略或服务暴露的问题,导致客户端无法连接。需要逐一排查这些可能性,确保每一步都正确无误。 总结步骤大致如下: 1. 创建包含SASL用户和密码的Secret。 2. 创建ConfigMap或使用环境变量来配置Kafka的server.properties。 3. 编写启动脚本,在容器启动时生成配置文件,替换环境变量。 4. 配置Kubernetes Deployment,挂载Secret和ConfigMap,设置环境变量。 5. 部署Service以暴露Kafka的端口。 6. 验证部署,测试SASL认证是否生效。 需要详细检查每个步骤的具体实现,确保用户能够按照指导顺利部署。</think>### 在Kubernetes上部署带SASL认证Kafka单机版(2.7.2) #### 1. **创建Kafka配置文件和SASL认证信息** 首先通过Kubernetes **Secret** 存储SASL认证的用户名和密码,避免明文暴露敏感信息: ```yaml # kafka-secret.yaml apiVersion: v1 kind: Secret metadata: name: kafka-sasl-secret type: Opaque data: kafka-jaas.conf: | KafkaServer { org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin-secret" user_admin="admin-secret"; }; server.properties: | listeners=SASL_PLAINTEXT://:9092 advertised.listeners=SASL_PLAINTEXT://${HOST_IP}:9092 security.inter.broker.protocol=SASL_PLAINTEXT sasl.mechanism.inter.broker.protocol=PLAIN sasl.enabled.mechanisms=PLAIN ``` #### 2. **编写Kubernetes Deployment配置** 通过环境变量注入配置参数,并挂载Secret到容器内指定路径: ```yaml # kafka-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: kafka spec: replicas: 1 selector: matchLabels: app: kafka template: metadata: labels: app: kafka spec: containers: - name: kafka image: bitnami/kafka:2.7.2 env: - name: KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP value: "SASL_PLAINTEXT:SASL_PLAINTEXT" - name: KAFKA_CFG_LISTENERS value: "SASL_PLAINTEXT://:9092" - name: KAFKA_CFG_ADVERTISED_LISTENERS value: "SASL_PLAINTEXT://$(HOST_IP):9092" - name: HOST_IP valueFrom: fieldRef: fieldPath: status.podIP volumeMounts: - name: kafka-secret mountPath: /opt/bitnami/kafka/config/kafka_jaas.conf subPath: kafka-jaas.conf volumes: - name: kafka-secret secret: secretName: kafka-sasl-secret ``` #### 3. **创建Service暴露Kafka服务** ```yaml # kafka-service.yaml apiVersion: v1 kind: Service metadata: name: kafka spec: selector: app: kafka ports: - port: 9092 targetPort: 9092 ``` #### 4. **部署与验证** 1. 执行命令部署资源: ```bash kubectl apply -f kafka-secret.yaml kubectl apply -f kafka-deployment.yaml kubectl apply -f kafka-service.yaml ``` 2. 验证Pod状态: ```bash kubectl get pods -l app=kafka ``` 3. 测试SASL认证(需进入Pod执行): ```bash kubectl exec -it <kafka-pod-name> -- bash # 生产消息(使用SASL配置kafka-console-producer --broker-list localhost:9092 --topic test --producer.config /opt/bitnami/kafka/config/producer.properties # 消费消息 kafka-console-consumer --bootstrap-server localhost:9092 --topic test --consumer.config /opt/bitnami/kafka/config/consumer.properties ``` #### 关键配置说明 - **SASL机制**:使用`PLAIN`认证,需在`server.properties`中明确协议和机制[^1]。 - **环境变量**:通过`HOST_IP`动态获取Pod IP,确保`advertised.listeners`正确指向。 - **Secret挂载**:将JAAS配置文件挂载到Kafka容器内指定路径,避免硬编码敏感信息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值