Kafka 认证与授权配置要点
一 核心概念与范围
- 认证用于确认客户端、Broker 以及 ZooKeeper 的身份,常见机制包括 SASL/PLAIN、SASL/SCRAM-SHA-256/512、SASL/GSSAPI(Kerberos)、mTLS(TLS 客户端证书) 以及 OAuth 2.0 Bearer。
- 授权在认证通过后控制对资源的访问,Kafka 提供 ACL(Access Control Lists) 以及可扩展的 OAuth 2.0 授权 与 OPA 等模式。
- 建议生产环境同时启用 加密(TLS) 与 认证/授权,避免明文传输与越权访问。
二 监听器与认证配置
- 按监听器为不同入口启用认证,区分内部/外部访问,并为每个监听器设置唯一 name 与 port。未显式配置 authentication 的监听器将不验证客户端。
- 常见监听器与认证组合如下:
| 监听器类型 |
典型场景 |
认证机制 |
关键配置要点 |
| 内部 PLAIN |
集群内微服务 |
SCRAM-SHA-512 |
listeners 中 type=internal、tls=true、authentication.type=scram-sha-512 |
| 内部 TLS |
集群内服务 |
mTLS |
tls=true、authentication.type=tls;客户端需提供证书 |
| 外部 LoadBalancer/NodePort/Ingress/Route |
公网或跨网络 |
mTLS 或 SCRAM |
对外暴露端口与协议,强制 TLS;凭据通过 Secret 分发 |
- 示例(Kafka 资源片段,SCRAM 与 mTLS 并存):
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
listeners:
- name: plain
port: 9092
type: internal
tls: true
authentication:
type: scram-sha-512
- name: tls
port: 9093
type: internal
tls: true
authentication:
type: tls
- name: external
port: 9094
type: loadbalancer
tls: true
authentication:
type: tls
- 重要说明:
- mTLS 同时完成服务器与客户端双向认证;SCRAM 为密码挑战-响应机制,可与或不与 TLS 共用(生产建议始终启用 TLS)。
- 使用 User Operator 管理用户时必须为监听器配置认证;为 mTLS 用户,用户名通常为 CN=… 的证书主体(完整主体亦可作为用户名)。
三 授权模型与超级用户
- 在 Kafka 资源 中通过 authorization.type 启用授权,支持 simple(ACL)、OAuth 2.0、OPA、自定义。启用后授权会作用于所有已启用的监听器。
- 通过 superUsers 指定绕过 ACL 的超级用户列表;对 mTLS 用户,主体以 CN= 前缀的通用名称表示(也可用完整证书主题)。
- 示例(启用简单 ACL 并配置超级用户):
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
authorization:
type: simple
superUsers:
- CN=client_1
- user_2
- CN=client_3
- CN=client_4,OU=my_ou,O=my_org,L=my_location,ST=my_state,C=US
- 提示:为运维与紧急处置保留少量高权限账户,日常业务遵循最小权限原则。
四 快速上手示例 SASL/SCRAM + ACL(非容器)
- 服务端配置 server.properties
- 启用监听器与机制:
listeners=SASL_SSL://0.0.0.0:9093
security.inter.broker.protocol=SASL_SSL
sasl.enabled.mechanisms=SCRAM-SHA-512
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-512
- 启用 ACL 与超级用户:
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
super.users=User:admin
- JAAS 配置(kafka_server_jaas.conf):
KafkaServer {
org.apache.kafka.common.security.scram.ScramLoginModule required
username=“admin” password=“admin-secret”
user_admin=“admin-secret”
user_producer=“producer-secret”
user_consumer=“consumer-secret”;
};
- 启动参数:在 kafka-server-start.sh 中加入
export KAFKA_OPTS=“-Djava.security.auth.login.config=/path/to/kafka_server_jaas.conf”
- 创建 SCRAM 用户(示例)
bin/kafka-configs.sh --zookeeper localhost:2181 --alter
–entity-type users --entity-name producer
–add-config ‘SCRAM-SHA-512=[iterations=8192,password=producer-secret]’
bin/kafka-configs.sh --zookeeper localhost:2181 --alter
–entity-type users --entity-name consumer
–add-config ‘SCRAM-SHA-512=[iterations=8192,password=consumer-secret]’
- 配置客户端(示例)
- producer.properties/consumer.properties:
security.protocol=SASL_SSL
sasl.mechanism=SCRAM-SHA-512
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required
username=“producer” password=“producer-secret”;
- 配置 ACL(示例)
- 允许 producer 写主题、consumer 读主题与消费组:
bin/kafka-acls.sh --bootstrap-server localhost:9093 --add
–allow-principal User:producer --operation Write --topic test_topic
bin/kafka-acls.sh --bootstrap-server localhost:9093 --add
–allow-principal User:consumer --operation Read --topic test_topic --group ‘*’
五 生产实践与运维建议
- 加密与认证:对外与对内统一使用 TLS;凭据优先用 SCRAM 或 mTLS,避免 SASL/PLAIN 在明文中传输密码。
- 授权治理:遵循最小权限;按 Topic/Group/Cluster/TransactionalID 精细化授权;定期审计与清理过期 ACL。
- 高可用与容灾:为 Broker 间通信 与 KRaft 元数据通信 配置强认证;跨机房/公网访问强制 mTLS。
- 网络与隔离:结合 NetworkPolicy/安全组 限制来源 IP 与命名空间访问,仅暴露必要端口(如 9093/9094)。
- 凭据与轮换:SCRAM 凭据支持在线滚动更新;mTLS 证书设置合理有效期并自动化轮换;密钥集中托管与审计。
- 监控与告警:关注 认证失败率、ACL 拒绝率、TLS 握手失败 等指标,异常时快速阻断来源。