在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认证的Apache Kafka 2.7.2单机版和Zookeeper 3.7。首先,我得理清楚步骤,确保每一步都正确,尤其是关于SASL配置的部分,因为之前用户提供的引用中有一些相关的配置信息,需要整合进来。 首先,Zookeeper和KafkaSASL认证需要分别配置。根据引用[4],Zookeeper需要配置authProvider.1为SASLAuthenticationProvider。这可能涉及到修改Zookeeper的配置文件,比如zookeeper.properties,如引用[3]中的例子,里面提到了dataDir、server.x等配置。所以在Kubernetes中部署Zookeeper时,可能需要通过ConfigMap来挂载这些配置文件。 然后,Kafka方面,用户提到的引用[2]中提到了修改kafka-console-producer.sh,添加JAAS配置。这说明Kafka的客户端和服务端都需要配置JAAS文件,同时需要设置相关的环境变量,比如KAFKA_OPTS。在Kubernetes中,可以通过环境变量或者初始化容器来处理这些配置。 接下来,SASL认证机制通常是PLAIN或者SCRAM,这里用户可能使用的是PLAIN,因为引用[1]提到了SASL/PLAIN。需要为Kafka和Zookeeper创建对应的JAAS文件,其中包含用户名和密码。例如,在Zookeeper的JAAS配置中,需要指定用户和权限,而Kafka则需要配置连接到Zookeeper的SASL信息,以及自身broker的SASL配置。 另外,引用[3]中的Zookeeper配置提到了server.x的配置,这在Kubernetes中可能需要使用StatefulSet来部署,确保每个pod有稳定的网络标识。不过用户要求的是单节点,所以可能不需要多个server配置,但需要确保持久化存储,通过PV和PVC来处理数据持久化。 关于Kafka配置,需要修改server.properties中的监听地址,设置SASL相关的安全协议,比如SASL_PLAINTEXT,并配置JAAS文件的位置。同时,Kafka需要连接到启用了SASL的Zookeeper,因此需要在Kafka配置中指定Zookeeper的连接字符串,并传递JAAS配置,如引用[2]中的KAFKA_OPTS。 在Kubernetes中,可以使用Deployment或者StatefulSet来部署Kafka和Zookeeper。因为Zookeeper和Kafka都是有状态的,使用StatefulSet更合适,但单节点的话可能用Deployment也可以,不过需要正确配置存储。 另外,需要创建对应的Service,使得Kafka和Zookeeper能够互相访问。比如,Zookeeper的Service名称可能是zookeeper-service,端口2181,而Kafka的Service可能需要暴露9092端口,供客户端访问。 关于Secret,需要将SASL的用户名和密码保存为Kubernetes Secret,然后在Pod中通过环境变量或者挂载卷的方式引用。例如,创建kafka-secret和zookeeper-secret,保存用户名和密码,然后在JAAS配置文件中引用这些Secret的值。 最后,测试部署是否成功,可以使用kafka-console-producer和consumer,并配置客户端JAAS文件,如引用[2]中的例子,添加KAFKA_OPTS环境变量指向客户端的JAAS配置。在Kubernetes中,可能需要创建测试的Pod或者使用临时容器来执行这些命令。 可能遇到的问题包括配置文件路径是否正确,权限设置,以及SASL配置的协调性。比如,Kafka和Zookeeper的JAAS文件中的用户名密码是否匹配,网络策略是否允许流量通过对应的端口,以及Service的DNS解析是否正确。 总结步骤: 1. 为Zookeeper和Kafka创建ConfigMap,包含各自的配置文件。 2. 创建Secret保存SASL用户名和密码。 3. 部署Zookeeper的StatefulSet或Deployment,挂载ConfigMap和Secret,配置环境变量和JAAS文件。 4. 部署Kafka的StatefulSet或Deployment,同样挂载配置和Secret,并配置连接到Zookeeper。 5. 创建Service暴露Zookeeper和Kafka的端口。 6. 测试连接,确保SASL认证生效。 需要检查各个步骤中的细节,比如Zookeeper的authProvider配置是否正确,Kafka的advertised.listeners是否正确指向Service的地址,以及JAAS文件的路径是否在容器中正确设置。此外,可能需要调整Kubernetes的资源限制,如CPU和内存,确保Pod正常运行。</think>### 在 Kubernetes 中部署带 SASL 认证Kafka 和 Zookeeper #### 一、准备工作 1. **创建 Namespace** ```yaml apiVersion: v1 kind: Namespace metadata: name: kafka-sasl ``` 2. **创建 SASL 认证凭据 Secret** ```yaml apiVersion: v1 kind: Secret metadata: name: kafka-sasl-secret namespace: kafka-sasl type: Opaque data: zk-user: YWRtaW4= # admin(Base64编码) zk-password: cGFzc3dk # passwd kafka-user: YWRtaW4= kafka-password: cGFzc3dk ``` --- #### 二、部署带 SASL 的 Zookeeper 1. **Zookeeper 配置文件(ConfigMap)** ```yaml apiVersion: v1 kind: ConfigMap metadata: name: zookeeper-config namespace: kafka-sasl data: zookeeper.properties: | dataDir=/data clientPort=2181 authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider # 引用[4] requireClientAuthScheme=sasl zk-server.jaas: | Server { org.apache.zookeeper.server.auth.DigestLoginModule required user_admin="passwd"; # 从 Secret 中注入 }; ``` 2. **Zookeeper Deployment** ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: zookeeper namespace: kafka-sasl spec: replicas: 1 selector: matchLabels: app: zookeeper template: metadata: labels: app: zookeeper spec: containers: - name: zookeeper image: zookeeper:3.7 env: - name: JVMFLAGS value: "-Djava.security.auth.login.config=/conf/zk-server.jaas" volumeMounts: - name: config mountPath: /conf - name: data mountPath: /data volumes: - name: config configMap: name: zookeeper-config - name: data persistentVolumeClaim: claimName: zk-pvc # 需提前创建 PVC ``` --- #### 三、部署带 SASLKafka 1. **Kafka 配置文件(ConfigMap)** ```yaml apiVersion: v1 kind: ConfigMap metadata: name: kafka-config namespace: kafka-sasl data: server.properties: | broker.id=0 listeners=SASL_PLAINTEXT://:9092 advertised.listeners=SASL_PLAINTEXT://kafka-svc.kafka-sasl.svc.cluster.local:9092 security.inter.broker.protocol=SASL_PLAINTEXT sasl.mechanism.inter.broker.protocol=PLAIN sasl.enabled.mechanisms=PLAIN zookeeper.connect=zookeeper.kafka-sasl.svc.cluster.local:2181 kafka-server.jaas: | KafkaServer { org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="passwd" # 从 Secret 中注入 user_admin="passwd"; }; ``` 2. **Kafka Deployment** ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: kafka namespace: kafka-sasl spec: replicas: 1 selector: matchLabels: app: kafka template: metadata: labels: app: kafka spec: containers: - name: kafka image: apache/kafka:2.7.2 env: - name: KAFKA_OPTS value: "-Djava.security.auth.login.config=/etc/kafka/kafka-server.jaas" volumeMounts: - name: config mountPath: /etc/kafka - name: data mountPath: /var/lib/kafka volumes: - name: config configMap: name: kafka-config - name: data persistentVolumeClaim: claimName: kafka-pvc # 需提前创建 PVC ``` 3. **Kafka Service** ```yaml apiVersion: v1 kind: Service metadata: name: kafka-svc namespace: kafka-sasl spec: selector: app: kafka ports: - port: 9092 targetPort: 9092 ``` --- #### 四、验证部署 1. **客户端 JAAS 配置(测试 Pod)** ```yaml apiVersion: v1 kind: Pod metadata: name: kafka-test namespace: kafka-sasl spec: containers: - name: kafka-client image: apache/kafka:2.7.2 command: ["sleep", "infinity"] env: - name: KAFKA_OPTS value: "-Djava.security.auth.login.config=/etc/kafka/kafka-client.jaas" # 引用[2] volumeMounts: - name: client-config mountPath: /etc/kafka volumes: - name: client-config configMap: name: kafka-client-config # 需创建包含 kafka-client.jaas 的 ConfigMap ``` 2. **执行测试命令** ```bash kubectl exec -it kafka-test -n kafka-sasl -- bash # 生产消息 kafka-console-producer --bootstrap-server kafka-svc.kafka-sasl.svc.cluster.local:9092 \ --topic test --producer.config /etc/kafka/client.properties # 消费消息 kafka-console-consumer --bootstrap-server kafka-svc.kafka-sasl.svc.cluster.local:9092 \ --topic test --consumer.config /etc/kafka/client.properties ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值