24/ZMTP-PLAIN

24/ZMTP-PLAIN

ZMTP PLAIN

ZMTP PLAIN 机制为 ZMTP 3.0 定义了一个简单的用户名/密码机制,允许服务器对客户端进行认证。PLAIN 不涉及安全或保密性尝试。它旨在用于安全要求较低的内部网络。

另请参阅:https://rfc.zeromq.cn/spec:23/ZMTP

前言

版权所有 (c) 2013 iMatix Corporation.

本规范是自由软件;您可以根据自由软件基金会发布的 GNU 通用公共许可证的条款,重新分发和/或修改它;无论是该许可证的第 3 版,还是(由您选择)任何后续版本。分发本规范是希望它会有用,但没有任何保证;甚至不包括对适销性或特定用途适用性的暗示保证。有关更多详细信息,请参阅 GNU 通用公共许可证。您应该已收到本程序随附的 GNU 通用公共许可证的副本;如果未收到,请参阅 https://gnu.ac.cn/licenses

本规范是一个 自由开放标准,受数字标准组织 共识导向规范系统 的约束。

本文档中的关键词“MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、“MAY”和“OPTIONAL”应按照 RFC 2119 中的描述进行解释。

目标

ZMTP PLAIN 机制为 ZMTP 3.0 定义了一个简单的用户名/密码机制,允许服务器对客户端进行认证。PLAIN 不涉及安全或保密性尝试。它旨在用于安全要求较低的内部网络。

此机制解决了我们在 0MQ 架构中面临的一系列特定挑战

  • 当我们在同一网络上运行多个服务(例如,开发服务器和生产服务器)时,客户端必须确保他们正在访问正确的服务器。

  • 当我们希望对客户端执行最少认证(以避免配置错误)时。

以前,应用程序尝试使用套接字身份进行此类认证。这些方法并非适用于所有套接字类型,也无法清晰地映射到用户身份。PLAIN 机制允许客户端根据独立于套接字身份、IP 地址和其他传输层身份的用户身份请求访问。

PLAIN 机制即使对于最简单的流量窥探或欺骗攻击也不健壮,在没有传输层安全(例如通过 VPN)的公共基础设施上不应使用它。

实现

PLAIN 机制使用 greeting 中的 as-server 字段来标识哪个对等方是“客户端”,哪个对等方是“服务器”。

客户端通过发送 HELLO 命令向服务器进行身份验证。服务器接受或拒绝此认证。如果接受,则回复 WELCOME 命令。否则,它会关闭连接。客户端随后发送一个 INITIATE 命令,服务器会解析并验证该命令。服务器回复一个 READY 命令。客户端在收到服务器的 READY 命令后可以发送消息。服务器在发送 READY 命令后可以立即开始发送消息。

以下 ABNF 语法定义了 PLAIN 安全握手和消息流

plain = C:hello ( S:welcome | S:error )
        C:initiate ( S:ready | S:error )
     *( C:message | S:message )

hello = command-size %d5 "HELLO" username password
username = OCTET *VCHAR
password = OCTET *VCHAR

welcome = command-size %d7 "WELCOME"

initiate = command-size %d8 "INITIATE" metadata

ready = command-size %d5 "READY" metadata

所有命令主体由一个 8 字符的命令名称(用空格填充)后跟格式化的二进制字段组成。ZMTP 3.0 规范定义了消息、command-size、metadata 和 error 的语法。