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

20.10. LDAP 驗證 #

此驗證方法與 password 類似,不同之處在於它使用 LDAP 作為密碼驗證方法。 LDAP 僅用於驗證使用者名稱/密碼對。 因此,在使用 LDAP 進行驗證之前,使用者必須已存在於資料庫中。

LDAP 驗證可以兩種模式運作。 在第一種模式中,我們將其稱為簡單繫結模式,伺服器將繫結到建構為 prefix username suffix 的 distinguished name。 通常,prefix 參數用於指定 cn=,或 Active Directory 環境中的 DOMAIN\suffix 用於指定非 Active Directory 環境中 DN 的剩餘部分。

在第二種模式中,我們將其稱為搜尋+繫結模式,伺服器首先使用固定的使用者名稱和密碼繫結到 LDAP 目錄,這些使用者名稱和密碼使用 ldapbinddnldapbindpasswd 指定,並搜尋嘗試登入資料庫的使用者。 如果沒有配置使用者和密碼,將嘗試對目錄進行匿名繫結。 搜尋將在 ldapbasedn 的子樹上執行,並嘗試完全比對 ldapsearchattribute 中指定的屬性。 一旦在此搜尋中找到使用者,伺服器會使用客戶端指定的密碼,重新以該使用者身分繫結到目錄,以驗證登入是否正確。 此模式與其他軟體(例如 Apache mod_authnz_ldappam_ldap)中的 LDAP 驗證方案使用的模式相同。 此方法允許在目錄中放置使用者物件的位置具有更大的彈性,但會導致向 LDAP 伺服器發出兩個額外的請求。

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

ldapserver

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

ldapport

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

ldapscheme

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

ldaptls

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

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

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

ldapprefix

在執行簡單繫結驗證時,在形成要繫結的 DN 時,要附加到使用者名稱的字串。

ldapsuffix

在執行簡單繫結驗證時,在形成要繫結的 DN 時,要附加到使用者名稱的字串。

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

ldapbasedn

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

ldapbinddn

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

ldapbindpasswd

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

ldapsearchattribute

在執行搜尋+繫結驗證時,要與搜尋中的使用者名稱比對的屬性。 如果未指定屬性,將使用 uid 屬性。

ldapsearchfilter

在執行搜尋+繫結驗證時要使用的搜尋篩選器。 $username 的出現次數將替換為使用者名稱。 這允許比 ldapsearchattribute 更靈活的搜尋篩選器。

ldapurl

一個 RFC 4516 LDAP URL。 這是一種以更緊湊和標準的形式編寫其他一些 LDAP 選項的替代方法。 格式為

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 指定為單獨的選項。

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

將簡單繫結的配置選項與搜尋+繫結的選項混合使用是一種錯誤。

使用搜尋+繫結模式時,可以使用 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 伺服器。 如果該連線成功,則授予資料庫存取權。

以下是一個搜尋+綁定配置的範例

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

當請求以資料庫使用者 someuser 連接到資料庫伺服器時,PostgreSQL 將嘗試匿名綁定到 LDAP 伺服器(因為未指定 ldapbinddn),並在指定的基礎 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 選項時,通常需要使用雙引號引起來的參數值,如範例所示。

提交更正

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