此身份驗證方法的操作類似於 password,只是它使用 LDAP 作為密碼驗證方法。LDAP 僅用於驗證使用者名稱/密碼對。因此,在使用 LDAP 進行身份驗證之前,使用者必須已存在於資料庫中。
LDAP 身份驗證可以有兩種模式。第一種模式,我們稱之為簡單繫結模式,伺服器將繫結到由 prefix username suffix 構成的專有名稱 (DN)。通常,prefix 引數用於指定 cn=,或者在 Active Directory 環境中指定 DOMAIN\。suffix 用於在非 Active Directory 環境中指定 DN 的其餘部分。
在第二種模式,我們稱之為搜尋+繫結模式,伺服器首先使用指定的 ldapbinddn 和 ldapbindpasswd 以固定的使用者名稱和密碼繫結到 LDAP 目錄,並搜尋嘗試登入資料庫的使用者。如果未配置使用者和密碼,將嘗試匿名繫結到目錄。搜尋將在 ldapbasedn 指定的子樹下進行,並嘗試精確匹配 ldapsearchattribute 中指定的屬性。一旦在搜尋中找到該使用者,伺服器將以該使用者身份重新繫結到目錄,使用客戶端提供的密碼來驗證登入是否正確。此模式與 PostgreSQL 中的其他軟體(如 Apache mod_authnz_ldap 和 pam_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 選項作為替代。
請注意,使用 ldapscheme 或 ldaptls 僅加密 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 必須是 base、one、sub 中的一個,通常是最後一個。(預設值為 base,這在此應用中通常無用。)attribute 可以指定單個屬性,在這種情況下,它被用作 ldapsearchattribute 的值。如果 attribute 為空,則 filter 可用作 ldapsearchfilter 的值。
URL 方案 ldaps 選擇 LDAPS 方法,用於透過 SSL 進行 LDAP 連線,等同於使用 ldapscheme=ldaps。要使用 StartTLS 操作進行加密的 LDAP 連線,請使用常規 URL 方案 ldap,並在 ldapurl 之外指定 ldaptls 選項。
對於非匿名繫結,ldapbinddn 和 ldapbindpasswd 必須作為單獨的選項指定。
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,其中 DOMAIN 從 ldapbasedn 中提取。
以下是一個簡單繫結 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"
這比單獨指定 ldapserver、ldapscheme 和 ldapport 更緊湊。
以下是一個搜尋+繫結配置的示例
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 選項時,通常需要使用雙引號括起來的引數值,如示例所示。
如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 來報告文件問題。