Kafka 的认证机制主要围绕客户端与 broker、broker 与 broker、broker 与 Controller、工具类(如 kafka-console-producer)与 broker 之间的身份验证展开,官方及社区主流支持的认证方式可分为六大类,涵盖从简单的用户名密码到强安全的证书认证,以下是详细说明:
一、核心认证维度说明
Kafka 认证的核心是基于 SASL(Simple Authentication and Security Layer) 框架(主流)和少量非 SASL 方式(如 SSL 证书认证),不同认证方式适配不同的安全等级、部署复杂度和场景需求:
| 认证方式 | 安全等级 | 部署复杂度 | 核心适用场景 |
|---|---|---|---|
| SASL/PLAIN | 低 | 极低 | 测试 / 内网环境、简单身份校验 |
| SASL/SCRAM | 中 | 低 | 生产环境、需密码加密存储 |
| SASL/GSSAPI (Kerberos) | 高 | 高 | 企业级统一认证、Kerberos 生态集成 |
| SASL/OAUTHBEARER | 高 | 中 | 云原生 / 微服务、OAuth2.0 生态 |
| SSL/TLS 证书认证 | 高 | 中 | 强身份校验、双向证书验证 |
| Delegation Tokens | 高 | 中 | 临时权限、跨服务无密钥访问 |
二、详细认证方式说明
1. SASL/PLAIN(明文用户名密码)
核心原理
基于 SASL 框架的最简单认证方式,客户端直接将明文用户名 + 密码(传输时可通过 SSL 加密通道)发送给 broker,broker 校验是否匹配配置的用户列表(或外部存储)。
关键特点
-
优点:配置极简、无依赖、易上手;
-
缺点:密码若未通过 SSL 加密传输,易被抓包泄露;密码通常明文存储在 broker 配置中(风险高);
-
核心配置(broker 端): properties
# 启用SASL_PLAINTEXT协议(或SASL_SSL,结合SSL加密传输) listeners=SASL_PLAINTEXT://:9092 sasl.enabled.mechanisms=PLAIN sasl.mechanism.inter.broker.protocol=PLAIN # 配置用户密码(明文,生产不推荐) sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \ username="admin" \ password="admin123" \ user_admin="admin123" \ user_producer="producer123";
适用场景:测试环境、内网低安全需求场景,生产环境需配合 SSL 加密传输。
2. SASL/SCRAM(加盐哈希密码认证)
核心原理
SCRAM(Salted Challenge Response Authentication Mechanism)是 PLAIN 的安全升级版:
- Broker 存储用户的用户名 + 盐值 + 哈希密码 + 迭代次数(而非明文);
- 认证时 Broker 向客户端发送随机挑战值,客户端基于密码、盐值、挑战值计算响应;
- Broker 验证响应是否匹配,全程不传输明文密码。
关键特点
-
支持 SCRAM-SHA-256/SCRAM-SHA-512(哈希算法),安全性远高于 PLAIN;
-
密码可动态管理(通过 Kafka 命令行新增 / 删除用户),无需重启 broker;
-
核心配置(broker 端): properties
sasl.enabled.mechanisms=SCRAM-SHA-256 sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256 sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required \ username="admin" \ password="admin123"; -
动态创建用户: bash
运行
# 创建SCRAM用户 kafka-configs.sh --bootstrap-server localhost:9092 --alter --add-config 'SCRAM-SHA-256=[password=admin123]' --entity-type users --entity-name admin
适用场景:生产环境、无 Kerberos 生态、需安全的密码认证。
3. SASL/GSSAPI(Kerberos 认证)
核心原理
基于 Kerberos 协议的企业级认证,核心是票据(Ticket) 认证而非密码:
- 客户端从 Kerberos KDC(密钥分发中心)获取 TGT(票据授予票据);
- 客户端用 TGT 向 KDC 申请访问 Kafka 的服务票据;
- 客户端将服务票据发送给 broker,broker 通过 KDC 验证票据合法性。
关键特点
-
优点:无密码传输、集中式身份管理(企业统一认证)、支持单点登录;
-
缺点:部署复杂(需搭建 KDC)、运维成本高;
-
核心配置(broker 端): properties
sasl.enabled.mechanisms=GSSAPI sasl.mechanism.inter.broker.protocol=GSSAPI sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required \ useKeyTab=true \ keyTab="/etc/kafka/kafka.keytab" \ principal="kafka/broker.example.com@EXAMPLE.COM"; # Kerberos配置文件路径 java.security.krb5.conf=/etc/krb5.conf
适用场景:大型企业、已有 Kerberos 生态(如 Hadoop 集群)、高安全等级需求。
4. SASL/OAUTHBEARER(OAuth2.0 认证)
核心原理
基于 OAuth2.0 框架的令牌认证,适用于云原生、微服务场景:
- 客户端从 OAuth2.0 授权服务器(如 Keycloak、Auth0)获取 JWT 令牌;
- 客户端将令牌(Bearer Token)发送给 broker;
- broker 验证令牌的签名、有效期、权限(如角色)。
关键特点
-
优点:无密钥硬编码、支持短期令牌(自动过期)、适配云原生架构;
-
缺点:需依赖 OAuth2.0 授权服务器;
-
核心配置(客户端): properties
sasl.mechanism=OAUTHBEARER sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ oauth.token.endpoint.url="https://auth.example.com/token" \ oauth.client.id="kafka-client" \ oauth.client.secret="client-secret";
适用场景:云原生部署(K8s)、微服务架构、需统一的 OAuth2.0 认证体系。
5. SSL/TLS 证书认证(双向认证)
核心原理
基于 X.509 证书的身份验证,分为单向认证 (broker 验证客户端)和双向认证(客户端也验证 broker):
- 证书由 CA(证书颁发机构)签发,包含公钥和身份信息;
- 双向认证时,客户端向 broker 发送客户端证书,broker 验证证书的合法性(是否由信任 CA 签发、未过期);
- 同时 broker 向客户端发送服务端证书,客户端验证其合法性。
关键特点
-
优点:强身份校验、传输加密与认证合一、无密码泄露风险;
-
缺点:证书管理成本高(签发、续期、吊销);
-
核心配置(broker 端): properties
# 启用SSL协议 listeners=SSL://:9093 # 服务端证书/密钥 ssl.keystore.location=/etc/kafka/server.keystore.jks ssl.keystore.password=keystore123 ssl.key.password=key123 # 信任CA证书(验证客户端证书) ssl.truststore.location=/etc/kafka/server.truststore.jks ssl.truststore.password=truststore123 # 启用双向认证 ssl.client.auth=required
适用场景:高安全等级场景(如金融、政务)、需严格的身份绑定(证书与客户端一一对应)。
6. Delegation Tokens(委托令牌)
核心原理
一种临时的、无密钥的认证方式,适用于跨服务访问(如 Flink 消费 Kafka):
- 客户端用已有认证(如 Kerberos/SSL)向 broker 申请委托令牌;
- 令牌包含有效期、权限范围,客户端用令牌访问 Kafka;
- 令牌可撤销,过期自动失效。
关键特点
-
优点:无需硬编码密钥、临时权限管控、降低密钥泄露风险;
-
核心命令(创建令牌): bash
运行
kafka-delegation-tokens.sh --bootstrap-server localhost:9092 --create --max-life-time 86400000 --renewal-time 3600000 --owner principal:user1
适用场景:临时访问授权、跨服务无密钥访问、批量任务执行。
三、补充说明
- 混合认证:Kafka 支持同时启用多种认证方式(如 SSL+SASL/SCRAM),既加密传输又验证身份;
- 版本兼容性 :
- SASL/SCRAM:Kafka 0.10.2 + 支持;
- SASL/OAUTHBEARER:Kafka 2.0 + 支持;
- Delegation Tokens:Kafka 1.1 + 支持;
- 认证 vs 授权:认证是 "验证身份",授权(如 ACL)是 "验证权限",通常认证后需配合 ACL 控制读写权限。
四、选型建议
- 测试环境:SASL/PLAIN(简单);
- 中小规模生产:SASL/SCRAM + SSL(平衡安全与复杂度);
- 大型企业:Kerberos + SSL(统一认证);
- 云原生:OAUTHBEARER + SSL(适配微服务);
- 高安全需求:SSL 双向认证 + SCRAM(双重校验)。