SASL 是面向连接协议中身份验证的框架。目前,PostgreSQL 实施了两种 SASL 身份验证机制,SCRAM-SHA-256 和 SCRAM-SHA-256-PLUS。将来可能会添加更多机制。以下步骤说明了 SASL 身份验证通常是如何执行的,而下一节将详细介绍 SCRAM-SHA-256 和 SCRAM-SHA-256-PLUS。
SASL 身份验证消息流
要开始 SASL 身份验证交换,服务器会发送 AuthenticationSASL 消息。它包含服务器可以接受的 SASL 身份验证机制列表,按服务器首选的顺序排列。
客户端从列表中选择一种支持的机制,并向服务器发送 SASLInitialResponse 消息。该消息包含所选机制的名称,以及可选的初始客户端响应(如果所选机制使用该响应)。
接下来将是一条或多条服务器挑战和客户端响应消息。每个服务器挑战都以 AuthenticationSASLContinue 消息发送,然后是客户端在 SASLResponse 消息中的响应。消息的细节是特定于机制的。
最后,当身份验证交换成功完成时,服务器会发送 AuthenticationSASLFinal 消息,紧随其后的是 AuthenticationOk 消息。AuthenticationSASLFinal 包含额外的服务器到客户端数据,其内容特定于所选身份验证机制。如果身份验证机制不使用在完成时发送的额外数据,则不会发送 AuthenticationSASLFinal 消息。
发生错误时,服务器可以在任何阶段中止身份验证并发送 ErrorMessage。
目前实施的 SASL 机制是 SCRAM-SHA-256
及其具有通道绑定的变体 SCRAM-SHA-256-PLUS
。它们在 RFC 7677 和 RFC 5802 中有详细描述。
当在 PostgreSQL 中使用 SCRAM-SHA-256 时,服务器将忽略客户端在 client-first-message
中发送的用户名。相反,将使用已在启动消息中发送的用户名。 PostgreSQL 支持多种字符编码,而 SCRAM 规定将 UTF-8 用于用户名,因此可能无法在 UTF-8 中表示 PostgreSQL 用户名。
SCRAM 规范规定密码也使用 UTF-8,并使用 SASLprep 算法进行处理。然而,PostgreSQL 不要求使用 UTF-8 来设置密码。当设置用户的密码时,它将使用 SASLprep 进行处理,就好像它是 UTF-8 一样,而不管实际使用的编码是什么。但是,如果它不是合法的 UTF-8 字节序列,或者它包含 SASLprep 算法禁止的 UTF-8 字节序列,则将使用原始密码而不进行 SASLprep 处理,而不是抛出错误。这允许在密码是 UTF-8 时对其进行规范化,但仍然允许使用非 UTF-8 密码,并且不需要系统知道密码的编码。
通道绑定 在具有 SSL 支持的 PostgreSQL 版本中受支持。具有通道绑定的 SCRAM 的 SASL 机制名称为 SCRAM-SHA-256-PLUS
。PostgreSQL 使用的通道绑定类型为 tls-server-end-point
。
在SCRAM没有通道绑定时,服务器会选择一个随机数并将其传输给客户端,以便与用户提供的密码在传输的密码哈希中混合。虽然这可以防止密码哈希在以后的会话中被成功地重新传输,但它不能阻止真实服务器和客户端之间的一个假服务器通过服务器的随机值并成功进行身份验证。
SCRAM有通道绑定可以防止这种中间人攻击,方法是将服务器证书的签名混合到传输的密码哈希中。虽然一个假服务器可以重新传输真实服务器的证书,但它没有访问与该证书匹配的私钥,因此无法证明它是所有者,从而导致 SSL 连接失败。
示例
服务器会发送 AuthenticationSASL 消息。它包含服务器可以接受的 SASL 身份验证机制列表。如果服务器是使用 SSL 支持构建的,则列表将是 SCRAM-SHA-256-PLUS
和 SCRAM-SHA-256
,否则只有后者。
客户端通过发送 SASLInitialResponse 消息进行响应,该消息指示所选机制,SCRAM-SHA-256
或 SCRAM-SHA-256-PLUS
。(客户端可以自由选择任一机制,但为了更好的安全性,如果它可以支持,它应该选择通道绑定变体。)在初始客户端响应字段中,消息包含 SCRAM client-first-message
。 client-first-message
还包含客户端选择的通道绑定类型。
服务器会发送 AuthenticationSASLContinue 消息,其中包含 SCRAM server-first-message
作为内容。
客户端会发送 SASLResponse 消息,其中包含 SCRAM client-final-message
作为内容。
服务器会发送 AuthenticationSASLFinal 消息,其中包含 SCRAM server-final-message
,紧随其后的是 AuthenticationOk 消息。
如果您在文档中看到任何不正确的内容,与您对特定功能的体验不符,或者需要进一步澄清,请使用 此表格 报告文档问题。