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 producer
bin/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:9092
advertised.listeners=SASL_PLAINTEXT://:9092
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256
sasl.enabled.mechanisms=SCRAM-SHA-256
authorizer.class.name=kafka.security.authorizer.AclAuthorizer
allow.everyone.if.no.acl.found=false
super.users=User:admin
- 配置 Broker JAAS(kafka_server_jaas.conf)
KafkaServer {
org.apache.kafka.common.security.scram.ScramLoginModule required
username=“admin” password=“admin-secret”;
};
启动前导出:export KAFKA_OPTS=“-Djava.security.auth.login.config=/path/kafka_server_jaas.conf”
- 客户端最小配置(示例)
- 生产者 producer.properties:
security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-256
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username=“producer” password=“producer-sec”;
- 消费者 consumer.properties:
security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-256
sasl.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:9092
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=false
super.users=User:admin
- JAAS 配置(kafka_server_jaas.conf):
KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
username=“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 kafka
chown -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),以同时获得认证、授权与传输加密。