支援版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援版本:12 / 11 / 10

53.3. SASL 驗證 #

SASL 是一種用於連線導向協議中驗證的框架。目前,PostgreSQL 實作了兩種 SASL 驗證機制,SCRAM-SHA-256 和 SCRAM-SHA-256-PLUS。未來可能會新增更多。以下步驟說明 SASL 驗證的一般執行方式,而下一個小節將詳細說明 SCRAM-SHA-256 和 SCRAM-SHA-256-PLUS。

SASL 驗證訊息流程

  1. 要開始 SASL 驗證交換,伺服器會傳送一個 AuthenticationSASL 訊息。它包含伺服器可以接受的 SASL 驗證機制清單,依伺服器的優先順序排列。

  2. 用戶端從清單中選擇其中一種支援的機制,並向伺服器傳送 SASLInitialResponse 訊息。該訊息包含所選機制的名稱,以及可選的初始客戶端回應(如果所選機制使用該回應)。

  3. 接下來會傳送一個或多個伺服器挑戰和客戶端回應訊息。每個伺服器挑戰都在 AuthenticationSASLContinue 訊息中傳送,後跟來自客戶端的 SASLResponse 訊息回應。這些訊息的具體內容取決於機制。

  4. 最後,當驗證交換成功完成時,伺服器會傳送 AuthenticationSASLFinal 訊息,然後立即傳送 AuthenticationOk 訊息。 AuthenticationSASLFinal 包含其他伺服器到用戶端的資料,其內容取決於所選的驗證機制。如果驗證機制不使用在完成時傳送的其他資料,則不會傳送 AuthenticationSASLFinal 訊息。

發生錯誤時,伺服器可以在任何階段中止驗證,並傳送 ErrorMessage。

53.3.1. SCRAM-SHA-256 驗證 #

目前實作的 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。設定使用者密碼時,會使用 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 連線失敗。

範例

  1. 伺服器會傳送 AuthenticationSASL 訊息。它包含伺服器可以接受的 SASL 驗證機制清單。如果伺服器是使用 SSL 支援構建的,則該清單將是 SCRAM-SHA-256-PLUSSCRAM-SHA-256,否則僅包含後者。

  2. 用戶端透過傳送 SASLInitialResponse 訊息來回應,該訊息指示所選的機制 SCRAM-SHA-256SCRAM-SHA-256-PLUS。(用戶端可以自由選擇任一種機制,但為了獲得更好的安全性,如果可以支援,則應選擇通道綁定變體。)在 Initial Client response 欄位中,該訊息包含 SCRAM client-first-messageclient-first-message 也包含用戶端選擇的通道綁定類型。

  3. 伺服器傳送 AuthenticationSASLContinue 訊息,其中包含 SCRAM server-first-message 作為內容。

  4. 用戶端傳送 SASLResponse 訊息,其中包含 SCRAM client-final-message 作為內容。

  5. 伺服器傳送 AuthenticationSASLFinal 訊息,其中包含 SCRAM server-final-message,然後立即傳送 AuthenticationOk 訊息。

提交更正

如果您在文件中發現任何不正確、與特定功能的使用體驗不符或需要進一步澄清的地方,請使用此表格報告文件問題。