Kafka 的权限控制主要依赖 ACL(Access Control Lists) 和 SASL(认证) 的组合。下面按 从基础到常见生产配置 给你一个完整说明。
Kafka 权限控制分为三层:
认证(Authentication)
确认“你是谁”
授权(Authorization)
确认“你能干什么”
Resource + Operation + Principal)网络/加密(可选但推荐)
在 server.properties 中:
authorizer.class.name=kafka.security.authorizer.AclAuthorizer
allow.everyone.if.no.acl.found=false
⚠️ 生产环境一定要设为
false
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
JAAS 文件(如 kafka_server_jaas.conf):
KafkaServer {
org.apache.kafka.common.security.scram.ScramLoginModule required
username="admin"
password="admin-secret";
};
启动 Kafka 时指定:
export KAFKA_OPTS="-Djava.security.auth.login.config=/path/kafka_server_jaas.conf"
sasl.enabled.mechanisms=PLAIN
kafka-acls.sh \
--bootstrap-server localhost:9092 \
--add \
--allow-principal User:producer1 \
--operation Write \
--topic test-topic
kafka-acls.sh \
--bootstrap-server localhost:9092 \
--add \
--allow-principal User:producer1 \
--operation Write \
--topic test-topic
kafka-acls.sh \
--bootstrap-server localhost:9092 \
--add \
--allow-principal User:consumer1 \
--operation Read \
--topic test-topic \
--group test-group
kafka-acls.sh \
--bootstrap-server localhost:9092 \
--add \
--allow-principal User:admin \
--operation Create \
--cluster
super.users=User:admin
| 资源类型 | 示例 |
|---|---|
| Topic | --topic test |
| Group | --group test-group |
| Cluster | --cluster |
| TransactionalId | --transactional-id |
kafka-acls.sh \
--bootstrap-server localhost:9092 \
--list
kafka-acls.sh \
--bootstrap-server localhost:9092 \
--remove \
--allow-principal User:producer1 \
--operation Write \
--topic test-topic
listeners=SSL://:9093
ssl.keystore.location=/path/kafka.server.keystore.jks
ssl.truststore.location=/path/kafka.server.truststore.jks
ssl.client.auth=required
| 角色 | 权限 |
|---|---|
| Admin | Cluster + All |
| Producer | Write + Describe |
| Consumer | Read + Describe + Group |
| Connector | 读写 + 创建 |
❌ 忘记给 Describe 权限
❌ 消费者没给 Group 权限
❌ allow.everyone.if.no.acl.found=true(等于没权限控制)
❌ 认证和授权只配一个
Kafka 权限 = SASL 认证 + ACL 授权 +(SSL 加密)
如果你愿意,我可以:
你现在用的是 哪个 Kafka 版本 + 部署方式?