CentOS 上 Kafka 权限管理实操指南

一 核心概念与总体思路
- 权限管理包含三层:
- 认证 Authentication:确认客户端/ Broker / Zookeeper 的身份,常用机制有 SASL/PLAIN、SASL/SCRAM、SASL/GSSAPI(Kerberos);
- 授权 Authorization:基于 ACL 控制主体(Principal,如 User:alice)对资源(如 Topic、Group、Cluster)的操作(如 Read、Write、Create、Delete、Describe、Alter);
- 信道加密 Encryption:通过 SSL/TLS 加密传输(可与 SASL 组合为 SASL_SSL)。
- 常见取舍:SASL/PLAIN 简单但不支持动态增删用户;SASL/SCRAM 支持运行时新增/修改用户凭据;内网可先用 SASL_PLAINTEXT,生产建议启用 SASL_SSL。
二 快速落地 SASL_SCRAM + ACL(推荐)
- 适用场景:需要运行时增删用户、细粒度 ACL 控制。
- 步骤
- 在 Zookeeper 上创建 SCRAM 用户(Kafka 2.2+ 推荐用 SCRAM 动态管理用户)
- 创建管理员:bin/kafka-configs.sh --zookeeper localhost:2181 --alter --add-config ‘SCRAM-SHA-256=[password=admin-secret],SCRAM-SHA-512=[password=admin-secret]’ --entity-type users --entity-name admin
- 创建业务用户:bin/kafka-configs.sh --zookeeper localhost:2181 --alter --add-config ‘SCRAM-SHA-256=[password=producer-sec],SCRAM-SHA-512=[password=producer-sec]’ --entity-type users --entity-name producerbin/kafka-configs.sh --zookeeper localhost:2181 --alter --add-config ‘SCRAM-SHA-256=[password=consumer-sec],SCRAM-SHA-512=[password=consumer-sec]’ --entity-type users --entity-name consumer
- 查看用户:bin/kafka-configs.sh --zookeeper localhost:2181 --describe --entity-type users
- 配置 Broker 启用 SASL/SCRAM 与 ACL(server.properties)listeners=SASL_PLAINTEXT://0.0.0.0:9092advertised.listeners=SASL_PLAINTEXT://:9092security.inter.broker.protocol=SASL_PLAINTEXTsasl.mechanism.inter.broker.protocol=SCRAM-SHA-256sasl.enabled.mechanisms=SCRAM-SHA-256authorizer.class.name=kafka.security.authorizer.AclAuthorizerallow.everyone.if.no.acl.found=falsesuper.users=User:admin
- 配置 Broker JAAS(kafka_server_jaas.conf)KafkaServer {org.apache.kafka.common.security.scram.ScramLoginModule requiredusername=“admin” password=“admin-secret”;};启动前导出:export KAFKA_OPTS=“-Djava.security.auth.login.config=/path/kafka_server_jaas.conf”
- 客户端最小配置(示例)
- 生产者 producer.properties:security.protocol=SASL_PLAINTEXTsasl.mechanism=SCRAM-SHA-256sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username=“producer” password=“producer-sec”;
- 消费者 consumer.properties:security.protocol=SASL_PLAINTEXTsasl.mechanism=SCRAM-SHA-256sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username=“consumer” password=“consumer-sec”;group.id=test-consumer-group
- 使用 kafka-acls.sh 配置 ACL(注意消费者需给消费组授权)
- 授予写权限:bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 –add --allow-principal User:producer --operation Write --topic csdn01
- 授予读权限(含消费组):bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 –add --allow-principal User:consumer --operation Read --topic csdn01 --group test-consumer-group
- 查看 ACL:bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 –list --topic csdn01
- 验证
- 未授权用户(如 User:no_acl)生产/消费应报 “Not authorized …”
- 授权用户(producer/consumer)可正常生产/消费以上流程覆盖了 SCRAM 动态用户、Broker 端 SASL/ACL 配置与 ACL 授权命令要点。
三 使用 SASL_PLAIN + ACL(简单但不支持动态用户)
- 适用场景:用户规模小、变更不频繁。
- 要点
- server.properties 启用:listeners=SASL_PLAINTEXT://0.0.0.0:9092security.inter.broker.protocol=SASL_PLAINTEXTsasl.mechanism.inter.broker.protocol=PLAINsasl.enabled.mechanisms=PLAINauthorizer.class.name=kafka.security.authorizer.AclAuthorizerallow.everyone.if.no.acl.found=falsesuper.users=User:admin
- JAAS 配置(kafka_server_jaas.conf):KafkaServer {org.apache.kafka.common.security.plain.PlainLoginModule requiredusername=“admin” password=“admin-secret”user_admin=“admin-secret”user_wyk_reader=“wyk_reader_pwd”user_wyk_writer=“wyk_writer_pwd”;};启动前导出:export KAFKA_OPTS=“-Djava.security.auth.login.config=/path/kafka_server_jaas.conf”
- 客户端 JAAS(KafkaClient 段)配置对应用户名/密码;ACL 授权命令与 SCRAM 相同(如 Read/Write/Describe 等)。
- 注意:SASL/PLAIN 的用户凭据写死在 JAAS,无法在不重启的情况下新增用户。
四 常见授权命令与排错要点
- 常用 ACL 命令模板
- 主题读:bin/kafka-acls.sh --authorizer-properties zookeeper.connect=ZK:2181 –add --allow-principal User:alice --operation Read --topic t1 --group g1
- 主题写:bin/kafka-acls.sh --authorizer-properties zookeeper.connect=ZK:2181 –add --allow-principal User:bob --operation Write --topic t1
- 集群管理(创建/删除 Topic 等):bin/kafka-acls.sh --authorizer-properties zookeeper.connect=ZK:2181 –add --allow-principal User:admin --operation Create --cluster
- 查看:bin/kafka-acls.sh --authorizer-properties zookeeper.connect=ZK:2181 –list --topic t1
- 排错要点
- 未授权或 ACL 未命中时,常见报错为 Not authorized to access topics: [xxx];请核对 Principal、资源名、操作类型、消费组是否一致。
- 消费者必须给 消费组(group.id) 授予 Read 权限,否则启动或拉取会失败。
- 使用 SASL/PLAIN 时,新增用户需改 JAAS 并重启;使用 SCRAM 可直接用 kafka-configs.sh 动态增删用户。
五 系统层面安全与运维建议
- 以非 root 运行 Kafka:groupadd kafka; useradd -m -r -g kafka kafkachown -R kafka:kafka /path/to/kafka
- 目录与文件权限:确保 data、log、config 归属 kafka:kafka,避免权限越权。
- 防火墙放行 Kafka 端口(如 9092):firewall-cmd --add-port=9092/tcp --permanent && firewall-cmd --reload
- 生产建议启用 SASL_SSL(在 listeners 使用 SASL_SSL 并配置 keystore/truststore),以同时获得认证、授权与传输加密。