2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3

18.7. 防止伺服器欺騙 #

伺服器執行時,惡意使用者無法取代正常的資料庫伺服器。然而,當伺服器關閉時,本地使用者可以透過啟動自己的伺服器來欺騙正常的伺服器。欺騙伺服器可以讀取客戶端傳送的密碼和查詢,但無法返回任何資料,因為 PGDATA 目錄由於目錄許可權的保護仍然是安全的。欺騙是可能的,因為任何使用者都可以啟動資料庫伺服器;客戶端無法識別一個無效的伺服器,除非它經過特殊配置。

防止欺騙 local 連線的一種方法是使用一個只有可信本地使用者才有寫許可權的 Unix 域套接字目錄 (unix_socket_directories)。這可以防止惡意使用者在該目錄中建立自己的套接字檔案。如果你擔心某些應用程式可能仍然引用 /tmp 作為套接字檔案,從而容易受到欺騙攻擊,那麼在作業系統啟動時,建立一個符號連結 /tmp/.s.PGSQL.5432 指向重定位的套接字檔案。你還可能需要修改你的 /tmp 清理指令碼,以防止刪除該符號連結。

對於 local 連線的另一種選擇是讓客戶端使用 requirepeer 來指定連線到套接字的服務程序的所需所有者。

為了防止 TCP 連線上的欺騙,請使用 SSL 證書並確保客戶端檢查伺服器的證書,或者使用 GSSAPI 加密(如果它們在不同的連線上,則兩者都使用)。

為了防止 SSL 欺騙,伺服器必須配置為只接受 hostssl 連線 (第 20.1 節),並且擁有 SSL 金鑰和證書檔案 (第 18.9 節)。TCP 客戶端必須使用 sslmode=verify-caverify-full 進行連線,並安裝相應的根證書檔案 (第 32.19.1 節)。或者,可以使用 sslrootcert=system 來使用 SSL 實現定義的 系統 CA 池;在這種情況下,為了安全起見,會強制使用 sslmode=verify-full,因為由公共 CA 簽名的證書通常很容易獲得。

為了防止在使用 scram-sha-256 密碼認證透過網路進行時發生伺服器欺騙,您應該確保使用 SSL 連線到伺服器,並使用上文所述的防欺騙方法之一。此外,libpq 中的 SCRAM 實現無法保護整個認證交換過程,但使用 channel_binding=require 連線引數可以緩解伺服器欺騙。攻擊者使用偽造的伺服器攔截 SCRAM 交換,可以透過離線分析來潛在地確定來自客戶端的雜湊密碼。

為了防止 GSSAPI 欺騙,伺服器必須配置為只接受 hostgssenc 連線 (第 20.1 節),並與它們一起使用 gss 認證。TCP 客戶端必須使用 gssencmode=require 進行連線。

提交更正

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