2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11

20.6. GSSAPI 身份驗證 #

GSSAPI 是一個行業標準的身份驗證協議,在 RFC 2743 中定義。PostgreSQL 支援 GSSAPI 進行身份驗證、通訊加密,或兩者兼有。GSSAPI 為支援它的系統提供了自動身份驗證(單點登入)。身份驗證本身是安全的。如果使用 GSSAPI 加密或SSL加密,那麼沿著資料庫連線傳送的資料將被加密;否則,將不加密。

GSSAPI 支援必須在構建 PostgreSQL 時啟用;有關更多資訊,請參見 第 17 章

GSSAPI 使用 Kerberos 時,它使用標準的服務主體(身份驗證身份)名稱,格式為 servicename/hostname@realm。特定安裝使用的主體名稱不會以任何方式編碼到 PostgreSQL 伺服器中;相反,它是在伺服器讀取以確定其身份的 *keytab* 檔案中指定的。如果 keytab 檔案中列出了多個主體,伺服器將接受其中任何一個。伺服器的領域名稱是在伺服器可訪問的 Kerberos 配置檔案中指定的首選領域。

連線時,客戶端必須知道它打算連線的伺服器的主體名稱。主體名稱的 *servicename* 部分通常是 postgres,但可以透過 libpqkrbsrvname 連線引數選擇其他值。*hostname* 部分是 libpq 被告知連線的完全限定主機名。領域名稱是在客戶端可訪問的 Kerberos 配置檔案中指定的首選領域。

客戶端也將擁有一個代表其自身身份的主體名稱(並且它必須擁有該主體的有效票證)。要使用 GSSAPI 進行身份驗證,客戶端主體必須與 PostgreSQL 資料庫使用者名稱相關聯。pg_ident.conf 配置檔案可用於將主體對映到使用者名稱;例如,pgusername@realm 可以對映到 pgusername。或者,您可以直接在 PostgreSQL 中將完整的 username@realm 主體用作角色名稱,而無需任何對映。

PostgreSQL 還支援透過簡單地剝離主體名稱中的領域來將客戶端主體對映到使用者名稱。此方法支援是為了向後相容,並且強烈不建議使用,因為它在這種情況下無法區分來自不同領域但具有相同使用者名稱的不同使用者。要啟用此功能,請將 include_realm 設定為 0。對於簡單的單領域安裝,這樣做並結合設定 krb_realm 引數(該引數會檢查主體的領域是否與 krb_realm 引數中的內容完全匹配)仍然是安全的;但與在 pg_ident.conf 中指定顯式對映相比,這是一種功能較弱的方法。

伺服器 keytab 檔案的位置由 krb_server_keyfile 配置引數指定。出於安全原因,建議為 PostgreSQL 伺服器使用單獨的 keytab,而不是允許伺服器讀取系統 keytab 檔案。請確保您的伺服器 keytab 檔案可被 PostgreSQL 伺服器賬戶讀取(最好是僅可讀,不可寫)。(另請參見 第 18.1 節。)

keytab 檔案是使用 Kerberos 軟體生成的;有關詳細資訊,請參閱 Kerberos 文件。以下示例展示瞭如何使用 MIT Kerberos 的 kadmin 工具執行此操作

kadmin% addprinc -randkey postgres/server.my.domain.org
kadmin% ktadd -k krb5.keytab postgres/server.my.domain.org

以下身份驗證選項支援 GSSAPI 身份驗證方法

include_realm

如果設定為 0,則在透過使用者名稱對映(第 20.2 節)傳遞之前,會剝離經過身份驗證的使用者主體名稱中的領域名稱。不建議這樣做,主要用於向後相容,在多領域環境中不安全,除非同時使用了 krb_realm。建議將 include_realm 設定為預設值(1),並在 pg_ident.conf 中提供顯式對映,將主體名稱轉換為 PostgreSQL 使用者名稱。

map

允許從客戶端主體對映到資料庫使用者名稱。有關詳細資訊,請參見 第 20.2 節。對於 GSSAPI/Kerberos 主體,例如 username@EXAMPLE.COM(或不常見的情況,username/hostbased@EXAMPLE.COM),用於對映的使用者名稱是 username@EXAMPLE.COM(或 username/hostbased@EXAMPLE.COM),除非 include_realm 已設定為 0,在這種情況下,username(或 username/hostbased)是對映時看到的系統使用者名稱。

krb_realm

設定用於匹配使用者主體名稱的領域。如果設定了此引數,則只接受來自該領域的使用者。如果未設定,則任何領域的使用者都可以連線,具體取決於所進行的任何使用者名稱對映。

除了這些針對不同 pg_hba.conf 條目可能不同的設定外,還有一個伺服器範圍的 krb_caseins_users 配置引數。如果將其設定為 true,則客戶端主體將不區分大小寫地匹配到使用者對映條目。krb_realm(如果已設定)也將不區分大小寫地匹配。

提交更正

如果您在文件中看到任何不正確的內容、與您對特定功能的體驗不符的內容或需要進一步澄清的內容,請使用 此表單 報告文件問題。