1. kafka

Kafka SASL认证授权(四)认证源码解析

一、认证流程

在了解kafka网络模型的基础上,了解它的认证流程:

ApiVersionsRequest->SaslHandshakeRequest->a series of SASL client and server tokens corresponding to the mechanism are sent->认证成功,继续处理后续的请求,否则关闭连接。

状态转换见SaslServerAuthenticator

https://kafka.apache.org/protocol#sasl_handshake

具体逻辑chanel验证流程以sasl/plain为例:

分析这个包的内容:

server factory创建sasl plain server单例。server负责按协议获取username 与 password,再最终调用plain server callback handler进行验证(handler的指定是在SaslChannelBuilder中根据具体配的协议类型进行指定)。

下面看一下关键类SaslChannelBuilder,创建sasl channel的实现:

初始化时,配置handler:

再看具体的channel,结合selector poll的过程KafkaChannel:

java doc有说明具体的网络模型:

我们来看prepare方法:

prepare触发的地方,调用频率在selector,事件通知触发:

也就是每次网络读事件且channle尚未验证成功都会触发认证,和官方文档描述一致。一旦验证通过就不再认证。所以开启认证对吞吐影响可以忽略不计。

校验不过,会直接抛异常捕获后,断开连接了。

复用之前的验证结果

二、总结

以上我们了解到kafka sasl的认证流程,现在,可以自己添加认证方式,例如加上自己公司平台的权限认证,注意尽量使用轻量级的方式即cache。

scram方式,除了以上流程,还会多一步,见ScramSaslServer。第一步获取credential,无效则报错,第二步计算校验。详见scram rfc定义:这里

scram rfc

kafka server这边的final message 截图:

自定义认证可以参考这篇:博文

三、token验证

kafka实现了基于token验证的sasl。详见这里:文档

流程是:admin client管理client(创建和刷新),存放在zk上,验证时会验token是否存在,以及用户信息,密码是否一致。token的生命周期内有效,过期无效。

弊端:在公司内一般不会频繁用到这种方式, 因为用户很多,场景应该是临时用户访问。

token的管理代码在这里:

Comments to: Kafka SASL认证授权(四)认证源码解析

Your email address will not be published. Required fields are marked *