Postgresql 中文操作指南

55.3. SASL Authentication #

SASL 是一个针对面向连接协议中的认证的框架。目前,PostgreSQL 实现了两种 SASL 认证机制,即 SCRAM-SHA-256 和 SCRAM-SHA-256-PLUS。将来可能还会添加更多。以下步骤说明了通常情况下 SASL 认证的执行方式,而下一小节将更详细地介绍 SCRAM-SHA-256 和 SCRAM-SHA-256-PLUS。

SASL Authentication Message Flow

如果发生错误,服务器可以在任何阶段中止认证,然后发送一个 ErrorMessage。

55.3.1. SCRAM-SHA-256 Authentication #

目前实现的 SASL 机制为 SCRAM-SHA-256 及其带有通道绑定的变体 SCRAM-SHA-256-PLUS。它们在 RFC 7677RFC 5802 中有详细介绍。

当在 PostgreSQL 中使用 SCRAM-SHA-256 时,服务器会忽略客户端在 client-first-message 中发送的用户名。而是使用已在启动消息中发送的用户名。PostgreSQL 支持多种字符编码,而 SCRAM 规定用户名的编码应为 UTF-8,因此可能会无法以 UTF-8 表示 PostgreSQL 用户名。

SCRAM 规范规定密码也应为 UTF-8,并且使用 SASLprep 算法进行处理。但是,PostgreSQL 不要求密码使用 UTF-8。当设置用户的密码时,会将其按 UTF-8 进行 SASLprep 处理,无论实际使用的编码是什么。但是,如果它不是合法的 UTF-8 字节序列,或者它包含 SASLprep 算法禁止的 UTF-8 字节序列,那么会使用原始密码(不进行 SASLprep 处理),而不是抛出一个错误。这样一来,可以对 UTF-8 密码进行规范化,但仍然允许使用非 UTF-8 密码,并且无需系统知道密码采用的编码内容。

在带有 SSL 支持的 PostgreSQL 构建中支持 Channel binding。具有通道绑定的 SCRAM 的 SASL 机制名称为 SCRAM-SHA-256-PLUS。PostgreSQL 使用的通道绑定类型为 tls-server-end-point

在没有通道绑定的 SCRAM 中,服务器选择一个随机数字,将其传输给客户端,以便与传输的密码哈希中的用户提供的密码进行混合。虽然这可以防止密码哈希在后续会话中成功重新传输,但这并不能防止真实服务器和客户端之间的假服务器传递服务器的随机值并成功进行身份验证。

使用通道绑定的 SCRAM 通过将服务器证书的签名与传输的密码哈希混合来防止此类中间人攻击。虽然假服务器可以重新传输真实服务器的证书,但它无法访问与该证书匹配的私钥,因此无法证明自己是所有者,从而导致 SSL 连接失败。

Example