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

20.6. GSSAPI 驗證 #

GSSAPI 是一種工業標準的安全驗證協議,定義於 RFC 2743PostgreSQL 支援 GSSAPI 用於驗證、通訊加密或兩者兼具。GSSAPI 為支援它的系統提供自動驗證(單一登入)。驗證本身是安全的。如果使用 GSSAPI 加密或SSL加密,沿資料庫連線傳送的資料將會被加密;否則,它將不會被加密。

當建置 PostgreSQL 時,必須啟用 GSSAPI 支援;請參閱 第 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

設定要比對使用者主體名稱的 realm。如果設定了這個參數,只會接受該 realm 的使用者。如果未設定,則任何 realm 的使用者都可以連線,前提是使用者名稱對應的方式允許。

除了這些設定(對於不同的 pg_hba.conf 條目可能不同)之外,還有伺服器範圍的 krb_caseins_users 設定參數。如果將其設定為 true,則客戶端主體將以不區分大小寫的方式與使用者對應條目進行比對。如果設定了 krb_realm,也會以不區分大小寫的方式進行比對。

提交更正

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