PostgreSQL LDAP 認證

2021-08-31 15:13 更新

這種認證方法操作起來類似于password,只不過它使用 LDAP 作為密碼驗證方法。LDAP 只被用于驗證用戶名/口令對。因此,在使用 LDAP 進行認證之前,用戶必須已經(jīng)存在于數(shù)據(jù)庫中。

LDAP 認證可以在兩種模式下操作。在第一種模式中(我們將稱之為簡單綁定模式),服務器將綁定到構(gòu)造成prefix username suffix的可區(qū)分名稱。通常,prefix參數(shù)被用于指定 cn=或者一個活動目錄環(huán)境中的DOMAIN\。suffix被用來指定非活動目錄環(huán)境中的DN的剩余部分。

在第二種模式中(我們將稱之為搜索與綁定模式),服務器首先用一個固定的用戶名和密碼(用ldapbinddnldapbindpasswd指定)綁定到 LDAP 目錄 ,并為試圖登入該數(shù)據(jù)庫的用戶執(zhí)行一次搜索。如果沒有配置用戶名和密碼, 將嘗試一次匿名綁定到目錄。搜索將在位于ldapbasedn的子樹上被執(zhí)行,并將嘗試做一次 ldapsearchattribute 中指定屬性的精確匹配。一旦在這次搜索中找到用戶,服務器斷開并且作為這個用戶重新綁定到目錄,使用由客戶端指定的口令來驗證登錄是正確的。這種模式與在其他軟件中的 LDAP 認證所使用的相同,例如 Apache mod_authnz_ldappam_ldap。這種方法允許位于目錄中用戶對象的更大靈活性,但是會導致建立兩個到 LDAP 服務器的獨立連接。

下列配置選項被用于兩種模式:

ldapserver

要連接的LDAP服務器的名稱或IP地址??梢灾付ǘ鄠€服務器,用空格分隔。

ldapport

要連接的LDAP服務器的端口號。如果沒有指定端口,LDAP庫的默認端口設置將被使用。

ldapscheme

設置為ldaps可以使用LDAPS。這是一種非標準的在SSL之上使用LDAP的方法,在有一些LDAP服務器實現(xiàn)上可以支持。其他選擇還可以參考ldaptls選項。

ldaptls

設置為1以使PostgreSQL和LDAP服務器之間的連接使用TLS加密。這會按照RFC 4513使用StartTLS操作。其他選擇還可以參考ldapscheme選項。

注意使用ldapschemeldaptls僅會加密PostgreSQL服務器和LDAP服務器之間的通信。PostgreSQL服務器和PostgreSQL客戶端之間的連接仍是未加密的,除非也在其上使用SSL。

下列選項只被用于簡單綁定模式:

ldapprefix

當做簡單綁定認證時,前置到用戶名形成要用于綁定的DN的字符串。

ldapsuffix

當做簡單綁定認證時,前置到用戶名形成要用于綁定的DN的字符串。

下列選項只被用于搜索與綁定模式:

ldapbasedn

當做搜索與綁定認證時,開始搜索用戶的根DN。

ldapbinddn

當做搜索與綁定認證時,用戶要綁定到目錄開始執(zhí)行搜索的DN。

ldapbindpasswd

當做搜索與綁定認證時,用戶用于綁定到目錄開始執(zhí)行搜索的口令。

ldapsearchattribute

當做搜索與綁定認證時,在搜索中用來與用戶名匹配的屬性。如果沒有指定屬性,將會使用uid屬性。

ldapsearchfilter

在做search+bind認證時使用的搜索過濾器。$username的出現(xiàn)將被替換為用戶名。這允許比ldapsearchattribute更加靈活的搜索過濾器。

ldapurl

一個RFC 4516 LDAP URL。這是一種用更緊湊和標準的形式書寫某些其他LDAP選項的可選方法。格式是

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選項。

對于非匿名綁定,ldapbinddnldapbindpasswd必須被指定為獨立選項。

LDAP URL 當前只支持OpenLDAP,而不支持 Windows。

將簡單綁定的選項中混合用于搜索與綁定的選項是一種錯誤。

在使用search+bind模式時,可以用ldapsearchattribute指定的單個屬性執(zhí)行搜索,或者使用ldapsearchfilter指定的自定義搜索過濾器執(zhí)行搜索。指定ldapsearchattribute=foo等效于指定ldapsearchfilter="(foo=$username)"。如果兩個選項都沒有被指定,則默認為 ldapsearchattribute=uid

如果PostgreSQLOpenLDAP一起編譯為LDAP客戶端庫,ldapserver 設置可能被省略。 在這種情況下,主機名和端口列表通過RFC 2782 DNS SRV記錄來進行查詢。 查詢名稱_ldap._tcp.DOMAINDOMAIN是從 ldapbasedn中摘取的。

這里是一個簡單綁定 LDAP 配置的例子:

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

當請求一個作為數(shù)據(jù)庫用戶someuser到數(shù)據(jù)庫服務器的連接時,PostgreSQL 將嘗試使用cn=someuser, dc=example, dc=net和客戶端提供的口令來綁定到 LDAP 服務器。如果那個連接成功,將被授予數(shù)據(jù)庫訪問。

這里是一個搜索與綁定配置的例子:

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

當請求一個作為數(shù)據(jù)庫用戶someuser到數(shù)據(jù)庫服務器的連接時,PostgreSQL 將嘗試匿名綁定(因為沒有指定ldapbinddn)到 LDAP 服務器,在指定的基礎 DN 下執(zhí)行一次對于(uid=someuser)的搜索。如果找到一個項,則它將嘗試使用找到的信息和客戶端提供的口令進行綁定。如果第二個連接成功,將被授予數(shù)據(jù)庫訪問。

這里是被寫成一個 URL 的相同搜索與綁定配置:

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

一些支持根據(jù) LDAP 認證的其他軟件使用相同的 URL 格式,因此很容易共享該配置。

這里是一個search+bind配置的例子,它使用ldapsearchfilter而不是ldapsearchattribute來允許用用戶ID或電子郵件地址進行認證:

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

這是一個search+bind配置的例子,它使用DNS SRV discovery來查找域名example.net的LDAP服務的主機名和端口。

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

提示

如例子中所示,由于 LDAP 通常使用逗號和空格來分割一個 DN 的不同部分,在配置 LDAP 選項時通常有必要使用雙引號包圍的參數(shù)值。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號