16.5 Avro SASL概述

SASL(Simple Authentication and Security Layer,简单验证安全层)是网络协议中提供验证和安全的框架,它将验证机制从用户程序协议中分离出来,使得采用SASL的程序可以使用任何SASL所支持的验证机制,同样也支持代理验证。SASL提供的数据安全层能够提供数据完整性和数据加密服务,支持SASL的用户协议,也支持SASL服务所需的安全传输层协议,其中安全传输层协议是为因特网上通信提供安全性的加密协议。开发者可通过SASL对通用API进行编码,此方法避免了对特定机制的依赖。采用SASL的协议需要定义SASL profile,即如何使用SASL进行验证协商。下面对Avro RPC采用的SASL进行介绍。

SASL协商过程可以看成是客户端和服务器使用特定的SASL机制、在连接的基础上进行一系列消息的交互。客户端通过发送带有初始消息(可能为空)的机制名称(这里是SASL)来协商过程。协商过程一直伴随着消息的交换直到某一方表明协商成功或失败。消息的内容由具体的机制决定,如果协商成功就可以通过连接进行会话,否则将被抛弃。一些机制在协商之后会继续处理会话的数据(如对数据进行加密),而一些机制会指定会话数据传输不需修改。

Avro SASL协商使用4个单字节命令,分别是:

0:START(开始),使用于客户端初始消息中;

1:CONTINUE(继续),使用于协商进行中;

2:FAIL(失败),协商失败;

3:COMPLETE(完成),成功完成协商。

开始消息的格式是:


|0|4字节的机制名称的长度|机制名称|4字节的有效负载的长度|有效负载数据|


继续消息的格式是:


|1|4字节的有效负载的长度|有效负载数据|


失败消息的格式是:


|2|4字节的消息长度|UTF-8的消息|


完成消息的格式是:


|3|4字节的有效负载的长度|有效负载数据|


协商以客户端发送START命令开始,START命令中包含客户端选定的机制名称和指定机制的有效负载数据。然后,服务器和客户端交换一些CONTINUE消息,每个消息包含由安全机制生成的下个消息的有效负载数据。一旦客户端或者服务器发送FAIL消息,协商就会失败,失败消息中包含UTF-8编码的文本。只要接收到或发送了FAIL消息,或者在协商过程中发生了任何错误,基于此次连接的通信就必须结束。如果客户端或服务器发送COMPLETE消息,那么协商将成功完成,会话数据可以通过此次连接进行传输直到一方关闭。

如果SASL QOP(Quality of Protection,品质保证)没有进行协商,则基于此次连接的读/写无需修改,特别是传输的消息使用了Avro框架并采用了下面的形式:


|4字节的框架长度|框架数据|……|4个零字节|


如果SASL QOP协商且成功,则此次连接后的消息传输使用QOP。写数据时使用安全机制对非空的框架进行封装,读取数据时需要解开。完整的框架必须传送到安全机制进行解封装,之后传送到应用程序中。如果在封装、解封装或者框架处理时发生错误,那么此次连接的通信必须结束。

SASL的匿名机制很容易实现,特别之处在于,一个初始的匿名请求可以用以下静态序列作为前缀:


|0|009|ANONYMOUS|0000|


如果服务器使用匿名机制,则它应检查所接收到的请求前缀,即开始消息的机制名称是否为“ANONYMOUS”,然后对带有COMPLETE消息的初始响应前加上前缀:


|3|0000|


如果匿名服务器接收到带有其他机制名称的请求,那么它将发送FAIL消息:


|2|0000|


注意,匿名机制不会在客户端和服务器之间增加多余的往返,START消息附加在初始请求中,而COMPLETE和FAIL消息则附加在初始响应中。