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

20.10. LDAP 身份驗證 #

此身份驗證方法的操作類似於 password,只是它使用 LDAP 作為密碼驗證方法。LDAP 僅用於驗證使用者名稱/密碼對。因此,在使用 LDAP 進行身份驗證之前,使用者必須已存在於資料庫中。

LDAP 身份驗證可以有兩種模式。第一種模式,我們稱之為簡單繫結模式,伺服器將繫結到由 prefix username suffix 構成的專有名稱 (DN)。通常,prefix 引數用於指定 cn=,或者在 Active Directory 環境中指定 DOMAIN\suffix 用於在非 Active Directory 環境中指定 DN 的其餘部分。

在第二種模式,我們稱之為搜尋+繫結模式,伺服器首先使用指定的 ldapbinddnldapbindpasswd 以固定的使用者名稱和密碼繫結到 LDAP 目錄,並搜尋嘗試登入資料庫的使用者。如果未配置使用者和密碼,將嘗試匿名繫結到目錄。搜尋將在 ldapbasedn 指定的子樹下進行,並嘗試精確匹配 ldapsearchattribute 中指定的屬性。一旦在搜尋中找到該使用者,伺服器將以該使用者身份重新繫結到目錄,使用客戶端提供的密碼來驗證登入是否正確。此模式與 PostgreSQL 中的其他軟體(如 Apache mod_authnz_ldappam_ldap)中的 LDAP 身份驗證方案所使用的模式相同。此方法在使用者物件位於目錄中的位置方面提供了更大的靈活性,但會導致對 LDAP 伺服器進行兩次額外的請求。

以下配置選項在兩種模式下都使用

ldapserver

要連線的 LDAP 伺服器的名稱或 IP 地址。可以指定多個伺服器,用空格分隔。

ldapport

要連線的 LDAP 伺服器的埠號。如果未指定埠,將使用 LDAP 庫的預設埠設定。

ldapscheme

設定為 ldaps 以使用 LDAPS。這是一種非標準的 LDAP over SSL 使用方式,受某些 LDAP 伺服器實現支援。另請參閱 ldaptls 選項作為替代。

ldaptls

設定為 1 以使 PostgreSQL 和 LDAP 伺服器之間的連線使用 TLS 加密。這會使用 RFC 4513 中定義的 StartTLS 操作。另請參閱 ldapscheme 選項作為替代。

請注意,使用 ldapschemeldaptls 僅加密 PostgreSQL 伺服器和 LDAP 伺服器之間的流量。除非也在此處使用 SSL,否則 PostgreSQL 伺服器和 PostgreSQL 客戶端之間的連線仍將是未加密的。

以下選項僅在簡單繫結模式下使用

ldapprefix

在執行簡單繫結身份驗證時,用於構成要繫結的 DN 的使用者名稱字串字首。

ldapsuffix

在執行簡單繫結身份驗證時,用於構成要繫結的 DN 的使用者名稱字串字尾。

以下選項僅在搜尋+繫結模式下使用

ldapbasedn

執行搜尋+繫結身份驗證時,用於開始搜尋使用者的根 DN。

ldapbinddn

執行搜尋+繫結身份驗證時,用於繫結到目錄以執行搜尋的使用者 DN。

ldapbindpasswd

執行搜尋+繫結身份驗證時,用於繫結到目錄以執行搜尋的使用者的密碼。

ldapsearchattribute

執行搜尋+繫結身份驗證時,用於在搜尋中匹配使用者名稱的屬性。如果未指定屬性,則使用 uid 屬性。

ldapsearchfilter

執行搜尋+繫結身份驗證時使用的搜尋過濾器。$username 的所有出現都將替換為使用者名稱。這允許比 ldapsearchattribute 更靈活的搜尋過濾器。

以下選項可作為一種更簡潔、更標準的替代方式來編寫上述某些 LDAP 選項

ldapurl

一個 RFC 4516 LDAP URL。格式為:

ldap[s]://host[:port]/basedn[?[attribute][?[scope][?[filter]]]]

scope 必須是 baseonesub 中的一個,通常是最後一個。(預設值為 base,這在此應用中通常無用。)attribute 可以指定單個屬性,在這種情況下,它被用作 ldapsearchattribute 的值。如果 attribute 為空,則 filter 可用作 ldapsearchfilter 的值。

URL 方案 ldaps 選擇 LDAPS 方法,用於透過 SSL 進行 LDAP 連線,等同於使用 ldapscheme=ldaps。要使用 StartTLS 操作進行加密的 LDAP 連線,請使用常規 URL 方案 ldap,並在 ldapurl 之外指定 ldaptls 選項。

對於非匿名繫結,ldapbinddnldapbindpasswd 必須作為單獨的選項指定。

LDAP URL 目前僅支援 OpenLDAP,不支援 Windows。

混合使用簡單繫結模式的配置選項和搜尋+繫結模式的選項是錯誤的。要在簡單繫結模式下使用 ldapurl,URL 不能包含 basedn 或查詢元素。

使用搜索+繫結模式時,可以透過 ldapsearchattribute 指定的單個屬性,或透過 ldapsearchfilter 指定的自定義搜尋過濾器來執行搜尋。ldapsearchattribute=foo 等同於指定 ldapsearchfilter="(foo=$username)"。如果未指定任一選項,則預設為 ldapsearchattribute=uid

如果 PostgreSQL 是使用 OpenLDAP 作為 LDAP 客戶端庫編譯的,則可以省略 ldapserver 設定。在這種情況下,將透過 RFC 2782 DNS SRV 記錄查詢主機名和埠列表。將查詢名稱 _ldap._tcp.DOMAIN,其中 DOMAINldapbasedn 中提取。

以下是一個簡單繫結 LDAP 配置的示例

host ... ldap ldapserver=ldap.example.net ldapprefix="cn=" ldapsuffix=", dc=example, dc=net"

當請求以資料庫使用者 someuser 連線到資料庫伺服器時,PostgreSQL 將嘗試使用 DN cn=someuser, dc=example, dc=net 和客戶端提供的密碼繫結到 LDAP 伺服器。如果該連線成功,則授予資料庫訪問許可權。

以下是另一個簡單繫結配置,它使用 LDAPS 方案和自定義埠號,以 URL 的形式編寫

host ... ldap ldapurl="ldaps://ldap.example.net:49151" ldapprefix="cn=" ldapsuffix=", dc=example, dc=net"

這比單獨指定 ldapserverldapschemeldapport 更緊湊。

以下是一個搜尋+繫結配置的示例

host ... ldap ldapserver=ldap.example.net ldapbasedn="dc=example, dc=net" ldapsearchattribute=uid

當請求以資料庫使用者 someuser 連線到資料庫伺服器時,PostgreSQL 將嘗試匿名繫結(因為未指定 ldapbinddn)到 LDAP 伺服器,在指定的基 DN 下搜尋 (uid=someuser)。如果找到條目,它將嘗試使用找到的資訊和客戶端提供的密碼進行繫結。如果第二次繫結成功,則授予資料庫訪問許可權。

以下是以 URL 形式編寫的相同搜尋+繫結配置

host ... ldap ldapurl="ldap://ldap.example.net/dc=example,dc=net?uid?sub"

其他一些支援針對 LDAP 進行身份驗證的軟體也使用相同的 URL 格式,因此更容易共享配置。

以下是一個搜尋+繫結配置的示例,該配置使用 ldapsearchfilter 而不是 ldapsearchattribute,以允許透過使用者 ID 或電子郵件地址進行身份驗證

host ... ldap ldapserver=ldap.example.net ldapbasedn="dc=example, dc=net" ldapsearchfilter="(|(uid=$username)(mail=$username))"

以下是一個搜尋+繫結配置的示例,該配置使用 DNS SRV 發現來查詢域名 example.net 的 LDAP 服務的(主機)名和(埠)號

host ... ldap ldapbasedn="dc=example,dc=net"

提示

由於 LDAP 通常使用逗號和空格來分隔 DN 的不同部分,因此在配置 LDAP 選項時,通常需要使用雙引號括起來的引數值,如示例所示。

提交更正

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