?
このドキュメントでは、 php中國(guó)語(yǔ)ネットマニュアル リリース
下面的小節(jié)更詳細(xì)地描述認(rèn)證方法。
如果聲明了trust認(rèn)證模式, PostgreSQL 就假設(shè)任何可以連接到服務(wù)器的人都可以以任何他聲明的數(shù)據(jù)庫(kù)用戶名 (即便是超級(jí)用戶)連接。當(dāng)然,在database 和 user字段里面的限制仍然適用。 這個(gè)方法應(yīng)該用于那些在連接到服務(wù)器已經(jīng)有足夠操作系統(tǒng)層次保護(hù)的環(huán)境里。
trust認(rèn)證對(duì)于單用戶工作站的本地連接是非常合適和方便的。 通常它本身并不適用于多用戶環(huán)境的機(jī)器。 不過(guò),即使在多用戶的機(jī)器上,你也可以使用trust , 只要你利用文件系統(tǒng)權(quán)限限制了對(duì)服務(wù)器的Unix域套接字文件的訪問(wèn)。 要做這些限制,你可以設(shè)置unix_socket_permissions參數(shù) (以及可能還有unix_socket_group),就像Section 18.3里描述的那樣。 或者你可以設(shè)置unix_socket_directory, 把Unix域套接字文件放在一個(gè)經(jīng)過(guò)恰當(dāng)限制的目錄里。
設(shè)置文件系統(tǒng)權(quán)限只能幫助Unix套接字連接, 它不會(huì)通過(guò)文件系統(tǒng)權(quán)限限制本地TCP/IP連接。 因此,如果你想利用文件系統(tǒng)權(quán)限來(lái)控制本地安全, 那么刪除pg_hba.conf文件中的host ... 127.0.0.1 ... 行, 或者把它改為一個(gè)非trust的認(rèn)證方法。
trust認(rèn)證模式只適合TCP/IP連接, 只有在你信任那些pg_hba.conf行上所有機(jī)器中的所有用戶的時(shí)候才是合適的。 很少有理由使用trust作為任何除來(lái)自localhost(127.0.0.1) 以外的TCP/IP連接的認(rèn)證方式。
以口令為基礎(chǔ)的認(rèn)證方法包括md5和password 。 這些方法操作上非常類似,只不過(guò)口令通過(guò)連接傳送的方法不同:MD5散列、crypt加密、明文。 一個(gè)限制是crypt不能使用存儲(chǔ)在pg_authid中已加密的口令。
如果你擔(dān)心口令"sniffing"被竊聽,那么md5比較合適,簡(jiǎn)單的password應(yīng)始終盡量避免。然而,md5不能和db_user_namespace特性一起使用。如果連接受SSL加密保護(hù),那么password使用安全(盡管SSL證書認(rèn)證可能是一個(gè)更好的選擇,如果一個(gè)是取決于使用SSL)。
PostgreSQL 數(shù)據(jù)庫(kù)口令與任何操作系統(tǒng)用戶口令無(wú)關(guān)。各個(gè)數(shù)據(jù)庫(kù)用戶的口令是存儲(chǔ)在pg_authid系統(tǒng)表里面。口令可以用SQL語(yǔ)言命令CREATE USER和ALTER USER等管理(比如CREATE USER foo WITH PASSWORD 'secret'; 。缺省時(shí),如果沒(méi)有明確設(shè)置口令,那么存儲(chǔ)的口令是空并且該用戶的口令認(rèn)證總會(huì)失敗。
GSSAPI是在RFC 2743中定義的安全認(rèn)證的一個(gè)行業(yè)標(biāo)準(zhǔn)協(xié)議。 PostgreSQL按照RFC 1964支持GSSAPI和Kerberos認(rèn)證。 GSSAPI為支持系統(tǒng)提供自動(dòng)驗(yàn)證(單點(diǎn)登錄)。認(rèn)證本身是安全的,但通過(guò)數(shù)據(jù)庫(kù)連接發(fā)送的數(shù)據(jù)將不加密發(fā)送,除非使用SSL。
當(dāng)GSSAPI使用Kerberos, 在形式servicename/hostname@realm 中使用標(biāo)準(zhǔn)格式。對(duì)于信息的主要部分,如何建立所需的密鑰,參閱Section 19.3.5。
當(dāng)建立PostgreSQL時(shí),GSSAPI支持必須啟用,參閱Chapter 15獲取詳細(xì)信息。
GSSAPI下列配置選項(xiàng):
如果設(shè)置為1,認(rèn)證用戶的名字范圍 主要包括通過(guò)用戶名映射(Section 19.2)的系統(tǒng)用戶名。這對(duì)處理來(lái)自多個(gè)領(lǐng)域的用戶非常有用。
允許在系統(tǒng)和數(shù)據(jù)庫(kù)用戶名之間映射。參閱Section 19.2 獲得詳情。 一個(gè)Kerberos原則username/hostbased@EXAMPLE.COM, 如果include_realm和 username/hostbased@EXAMPLE.COM被禁用,include_realm被啟用,用于映射的用戶名是username/hostbased。
設(shè)置匹配用戶主要名稱的范圍。如果這個(gè)參數(shù) 設(shè)置了,該領(lǐng)域唯一的用戶將被接受。如果沒(méi)有設(shè)置, 任何領(lǐng)域的用戶可以連接,服從任何用戶名映射。
SSPI是單點(diǎn)登錄的安全認(rèn)證Windows技術(shù)。 PostgreSQL在negotiate模式中使用SSPI, 在可能的情況,并自動(dòng)回落到任何情況下的NTLM時(shí)。這將使用Kerberos。 當(dāng)服務(wù)器和客戶機(jī)正在運(yùn)行Windows時(shí),僅運(yùn)行SSPI認(rèn)證。
當(dāng)正在使用Kerberos認(rèn)證時(shí),SSPI和GSSAPI 的工作方式相同;參閱Section 19.3.3獲得詳情。
SSPI支持下列配置選項(xiàng):
如果設(shè)置為1,認(rèn)證用戶的名字范圍 主要包括通過(guò)用戶名映射(Section 19.2)的系統(tǒng)用戶名。這對(duì)處理來(lái)自多個(gè)領(lǐng)域的用戶非常有用。
允許系統(tǒng)和數(shù)據(jù)庫(kù)的用戶名之間映射。參閱Section 19.2獲得詳情。
設(shè)置匹配用戶主要名稱的范圍。如果這個(gè)參數(shù) 設(shè)置了,該領(lǐng)域唯一的用戶將被接受。如果沒(méi)有設(shè)置, 任何領(lǐng)域的用戶可以連接,服從任何用戶名映射。
Note: 本地Kerberos認(rèn)證已過(guò)時(shí),只是為了向后兼容。新的和升級(jí)安裝 鼓勵(lì)使用行業(yè)標(biāo)準(zhǔn)GSSAPI認(rèn)證方法(參閱Section 19.3.3)。
Kerberos是一種適用于在公共網(wǎng)絡(luò)上進(jìn)行分布計(jì)算的工業(yè)標(biāo)準(zhǔn)的安全認(rèn)證系統(tǒng)。 對(duì)Kerberos系統(tǒng)的敘述遠(yuǎn)遠(yuǎn)超出了本文檔的范圍; 總的說(shuō)來(lái)它是相當(dāng)復(fù)雜(同樣也相當(dāng)強(qiáng)大)的系統(tǒng)。 KerberosFAQ 或MIT Kerberos page是個(gè)開始學(xué)習(xí)的好地方。 現(xiàn)存在好幾種Kerberos發(fā)布的源代碼。Kerberos只提供安全認(rèn)證, 但并不加密在網(wǎng)絡(luò)上傳輸?shù)牟樵兒蛿?shù)據(jù),SSL可以用于這個(gè)目的。
PostgreSQL支持Kerberos 5,Kerberos支持必須在PostgreSQL編譯的時(shí)候打開。參閱Chapter 15獲取更多信息。
PostgreSQL運(yùn)行時(shí)像一個(gè)普通的Kerberos服務(wù)。 服務(wù)主的名字是servicename/hostname@realm 。
servicename 可以用 krb_srvname 配置參數(shù)在服務(wù)器端設(shè)置, 或者在客戶端使用krbsrvname連接參數(shù)設(shè)置(又見Section 31.1)。編譯的時(shí)候, 可以把安裝時(shí)的缺省postgres 修改掉, 方法是使用./configure --with-krb-srvnam=whatever。 在大多數(shù)情況下,我們不需要修改這個(gè)參數(shù)。 但是,如果需要在同一臺(tái)主機(jī)上同時(shí)安裝多套PostgreSQL , 那么這個(gè)就是必須的了。有些Kerberos實(shí)現(xiàn)還可能要求其它的服務(wù)名, 比如Microsoft Active Directory就要求服務(wù)名必須是大寫的(POSTGRES)。
hostname是服務(wù)器的全限定主機(jī)名。服務(wù)主的領(lǐng)域就是主機(jī)的首選領(lǐng)域。
客戶主自己必須用它們自己的PostgreSQL用戶名作為第一個(gè)部件, 比如pgusername/otherstuff@realm 。另外,你可以使用一個(gè)用戶名 映射對(duì)主體名的第一個(gè)組件到數(shù)據(jù)庫(kù)用戶名。 默認(rèn)情況下,PostgreSQL沒(méi)有檢查客戶的域;如果你有跨域 啟用認(rèn)證和需要驗(yàn)證域,使用krb_realm參數(shù),或啟用include_realm 和使用用戶名映射到檢查域。 因此如果你打開了跨域的認(rèn)證, 那么在任意域里任何可以和你通訊的主都會(huì)被接受。
確認(rèn)服務(wù)器的密鑰表文件是可以被 PostgreSQL服務(wù)器帳戶讀取(最好就是只讀的) (又見Section 17.1)密鑰文件(keytab)的位置是用 配置參數(shù) krb_server_keyfile 聲明的。 缺省是/usr/local/pgsql/etc/krb5.keytab (或者任何在編譯的時(shí)候聲明為sysconfdir的目錄)。
密鑰表文件(keytab)是在Kerberos軟件里生成的,參閱Kerberos文檔獲取細(xì)節(jié)。 下面的例子是可以用于MIT兼容的Kerberos 5實(shí)現(xiàn):
kadmin% ank -randkey postgres/server.my.domain.org kadmin% ktadd -k krb5.keytab postgres/server.my.domain.org
當(dāng)連接到數(shù)據(jù)庫(kù),確保你有一個(gè)主要匹配請(qǐng)求數(shù)據(jù)庫(kù)用戶名的標(biāo)簽 。例如,對(duì)于數(shù)據(jù)庫(kù)用戶的名稱 fred,主要 fred@EXAMPLE.COM將能夠連接。也允許 主要fred/users.example.com@EXAMPLE.COM,使用一個(gè)用戶名地圖,正如在Section 19.2 描述的。
如果你在Apache服務(wù)器上使用了 mod_auth_kerb 和mod_perl 模塊, 你可以用一個(gè)mod_perl 腳本進(jìn)行 AuthType KerberosV5SaveCredentials 。 這樣就有了一個(gè)通過(guò)web的安全數(shù)據(jù)庫(kù)訪問(wèn),不需要額外的口令。
下面配置選項(xiàng)支持Kerberos:
允許系統(tǒng)和數(shù)據(jù)庫(kù)的用戶名之間映射。參閱Section 19.2獲得詳情。
如果設(shè)置為1,認(rèn)證用戶的名字范圍 主要包括通過(guò)用戶名映射(Section 19.2)的系統(tǒng)用戶名。這對(duì)處理來(lái)自多個(gè)領(lǐng)域的用戶非常有用。
設(shè)置匹配用戶主要名稱的范圍。如果這個(gè)參數(shù) 設(shè)置了,該領(lǐng)域唯一的用戶將被接受。如果沒(méi)有設(shè)置, 任何領(lǐng)域的用戶可以連接,服從任何用戶名映射。
設(shè)置主服務(wù)器主體名稱的一部分。 即,連接krb_srvname,用于生成 完整的服務(wù)主體,也就是 krb_srvname/krb_server_hostname@REALM。 如果沒(méi)有設(shè)置,默認(rèn)是服務(wù)器主機(jī)名。
ident認(rèn)證方法是通過(guò)獲取客戶端的操作系統(tǒng)用戶名,使用它作為允許數(shù)據(jù)庫(kù)用戶 名稱(可選的用戶名映射),判斷客戶端的用戶名是非常關(guān)鍵的安全點(diǎn),根據(jù)連接類型的不同,它的實(shí)現(xiàn)方法也略有不同,正如下面描述的。
下面配置選項(xiàng)支持ident:
允許在系統(tǒng)和數(shù)據(jù)庫(kù)用戶名之間匹配。參閱Section 19.2獲取詳情。
"Identification Protocol"(標(biāo)識(shí)協(xié)議) 在RFC 1413里面描述。 實(shí)際上每個(gè)類Unix的操作系統(tǒng)都帶著一個(gè)缺省時(shí)偵聽113端口的身份服務(wù)器。 身份服務(wù)器的基本功能是回答類似這樣的問(wèn)題: "是什么用戶從你的端口X初始化出來(lái)連接到我的端口Y上來(lái)了?" 。 因?yàn)樵诮⑵鹞锢磉B接后,PostgreSQL既知道X也知道Y, 因此它可以詢問(wèn)運(yùn)行嘗試連接的客戶端的主機(jī),并且理論上可以用這個(gè)方法判斷發(fā)起連接的操作系統(tǒng)用戶。
這樣做的缺點(diǎn)是它取決于客戶端的完整性: 如果客戶端不可信或者被攻擊者攻破, 而且它們可以在113端口上運(yùn)行任何程序并且返回他們選擇的任何用戶的話, 就無(wú)法認(rèn)證了。因此這個(gè)認(rèn)證方法只適用于封閉的網(wǎng)絡(luò), 這樣的網(wǎng)絡(luò)里的每臺(tái)客戶機(jī)都處于嚴(yán)密的控制下并且數(shù)據(jù)庫(kù)和操作系統(tǒng)管理員可以比較方便地聯(lián)系上。 換句話說(shuō),你必須信任運(yùn)行身份(ident)服務(wù)的機(jī)器。下面是警告:
? | 身份標(biāo)識(shí)協(xié)議并不適用于認(rèn)證或者訪問(wèn)控制協(xié)議。 |
? |
--RFC 1413 | ? |
有些身份服務(wù)器有一個(gè)非標(biāo)準(zhǔn)的選項(xiàng), 導(dǎo)致返回的用戶名是加密的, 使用的是只有原機(jī)器的管理員知道的一個(gè)密鑰。 在與PostgreSQL配合使用身份認(rèn)證的時(shí)候, 你一定不能使用這個(gè)選項(xiàng),因?yàn)?span id="377j5v51b" class="PRODUCTNAME">PostgreSQL 沒(méi)有任何方法對(duì)返回的字符串進(jìn)行解密以獲取實(shí)際的用戶名。
在支持用于Unix域套接字的SO_PEERCRED請(qǐng)求的系統(tǒng)上 (當(dāng)前Linux, FreeBSD, NetBSD, OpenBSD, BSD/OS,和Solaris), 身份認(rèn)證也可以適用于本地連接。 PostgreSQL用SO_PEERCRED以找出連接客戶端進(jìn)程的操作系統(tǒng)的名稱。 這個(gè)時(shí)候,使用身份認(rèn)證不會(huì)增加安全風(fēng)險(xiǎn); 實(shí)際上這也是在這種系統(tǒng)上使用本地連接時(shí)的首選方法。
在沒(méi)有SO_PEERCRED請(qǐng)求的系統(tǒng)上, 身份認(rèn)證只能通過(guò)TCP/IP連接獲取。 如果需要繞開這個(gè)限制, 我們可以聲明localhost 地址 127.0.0.1 , 然后讓連接指向這個(gè)地址。 這個(gè)方法適用于你信任本機(jī)身份認(rèn)證服務(wù)器的場(chǎng)合。
這個(gè)認(rèn)證方法操作起來(lái)類似password , 只不過(guò)它使用LDAP作為密碼驗(yàn)證方法。 LDAP只用于驗(yàn)證用戶名/口令對(duì)。 因此,在使用LDAP進(jìn)行認(rèn)證之前,用戶必須已經(jīng)存在于數(shù)據(jù)庫(kù)里。
LDAP身份驗(yàn)證可以在兩種模式下運(yùn)行。在第一種模式中, 服務(wù)器將綁定構(gòu)造的prefix username suffix可分辨名稱。 通常情況下,prefix參數(shù)用于指定主目錄環(huán)境下的 cn=, 或者DOMAIN\。suffix用來(lái)指定非主目錄環(huán)境中的DN留下的一部分。
在第二種模式中,服務(wù)器首先用一個(gè)固定的用戶名和密碼綁定到LDAP目錄 ,指定ldapbinduser 和ldapbinddn,并執(zhí)行一個(gè)用戶試圖登錄到數(shù)據(jù)庫(kù)的搜索。 如果沒(méi)有用戶名和密碼配置, 將嘗試匿名綁定到目錄。 在ldapbasedn子樹搜索,將嘗試 做一個(gè)在ldapsearchattribute中指定屬性的精確匹配。 如果沒(méi)有指定屬性, uid屬性將被使用。一旦用戶已發(fā)現(xiàn) 這個(gè)搜索,服務(wù)器斷開,用戶重新結(jié)合目錄,使用由客戶指定的密碼,以驗(yàn)證 登錄是正確的。 這種方法可以在用戶對(duì)象所在的目錄顯示更大的靈活性,但會(huì)造成兩個(gè)單獨(dú)的LDAP服務(wù)器連接。
LDAP支持下列配置選項(xiàng):
LDAP服務(wù)器連接的名稱或IP。
連接到LDAP服務(wù)器的端口號(hào)。如果沒(méi)有指定端口, LDAP庫(kù)的默認(rèn)端口設(shè)置將被使用。
設(shè)置1以使PostgreSQL和 LDAP服務(wù)器之間的連接使用TLS加密。請(qǐng)注意,這里僅加密 LDAP服務(wù)器的流量—客戶端連接 將不被加密,除非使用SSL。
當(dāng)做簡(jiǎn)單綁定認(rèn)證,追加到形成DN綁定為用戶名的字符串。
當(dāng)做簡(jiǎn)單綁定認(rèn)證,追加到形成DN綁定為用戶名的字符串。
當(dāng)做搜索+綁定認(rèn)證時(shí),根DN開始在用戶搜索。
當(dāng)做搜索+綁定認(rèn)證時(shí),用戶的DN綁定到目錄執(zhí)行搜索。
當(dāng)做搜索+綁定認(rèn)證時(shí),用戶密碼綁定到該目錄執(zhí)行搜索。
當(dāng)做搜索+綁定認(rèn)證時(shí),歸因?yàn)樵谒阉髦衅ヅ溆脩裘?
Note: 由于LDAP通常使用逗號(hào)和空格分隔不同 DN的部分,當(dāng)配置LDAP選項(xiàng),它常常需要使用雙引號(hào)參數(shù) 值,例如:
ldapserver=ldap.example.net ldapprefix="cn=" ldapsuffix=", dc=example, dc=net"
這種認(rèn)證方法類似于 password,除非它使用RADIUS 作為密碼驗(yàn)證方式。 RADIUS是只用于驗(yàn)證 用戶名/密碼對(duì)。因此,RADIUS用于認(rèn)證之前,用戶必須已經(jīng)存在數(shù)據(jù)庫(kù)中。
當(dāng)使用RADIUS認(rèn)證時(shí),訪問(wèn)請(qǐng)求消息將被發(fā)送到 配置的RADIUS服務(wù)器。這一請(qǐng)求類型于Authenticate Only, 包含參數(shù)為 user name, password (加密)和 NAS Identifier。請(qǐng)求將使用 與服務(wù)器共享一個(gè)密鑰加密。RADIUS服務(wù)器將響應(yīng)Access Accept或者 Access Reject的服務(wù)器。不支持RADIUS記錄。
RADIUS支持下列配置選項(xiàng):
連接到RADIUS服務(wù)器的名稱或IP地址。此參數(shù)是必需的。
當(dāng)談到RADIUS服務(wù)器,使用共享的秘密。在PostgreSQL和RADIUS服務(wù)器必須有相同的值。建議,這是一個(gè)至少16個(gè)字符的字符串 。此參數(shù)是必需的。
Note: 如果PostgreSQL建立支持OpenSSL,使用加密載體將增強(qiáng)加密。 在其他情況下,傳輸?shù)絉ADIUS服務(wù)器應(yīng)該被視為混淆,沒(méi)有保障, 如有必要,應(yīng)采用外部安全措施。
連接到RADIUS服務(wù)器上的端口號(hào)。如果沒(méi)有指定端口,則默認(rèn)端口1812將使用。
在RADIUS請(qǐng)求中字符串作為NAS Identifier。 這個(gè)參數(shù)作為第二個(gè)參數(shù)標(biāo)識(shí)例子,用戶正試圖認(rèn)證為數(shù)據(jù)庫(kù)用戶。 它可用于策略匹配在RADIUS服務(wù)器。如果沒(méi)有指定標(biāo)識(shí)符,默認(rèn)使用 postgresql。
這種認(rèn)證方法使用SSL客戶端證書執(zhí)行 認(rèn)證。因此,只適用于SSL連接。 使用這種認(rèn)證方法時(shí),服務(wù)器會(huì)要求 客戶端提供一個(gè)有效的證書。沒(méi)有密碼的提示將被發(fā)送 到客戶端。證書的cn(通用名)屬性 將比較被請(qǐng)求的數(shù)據(jù)庫(kù)用戶名,如果匹配 將允許登錄。使用用戶名映射,允許 cn不同于數(shù)據(jù)庫(kù)的用戶名。
SSL證書認(rèn)證支持下列配置選項(xiàng):
允許在系統(tǒng)和數(shù)據(jù)庫(kù)用戶名間映射。參閱Section 19.2獲取詳情。
這個(gè)認(rèn)證方法操作起來(lái)類似password , 只不過(guò)它使用PAM作為認(rèn)證機(jī)制。 缺省的PAM服務(wù)名是postgresql 。 你可以在pg_hba.conf文件的pam關(guān)鍵字后面提供自己的可選服務(wù)名。 PAM只用于驗(yàn)證用戶名/口令對(duì)。 因此,在使用PAM進(jìn)行認(rèn)證之前,用戶必須已經(jīng)存在于數(shù)據(jù)庫(kù)里。 有關(guān)PAM的更多信息,請(qǐng)閱讀 Linux-PAM Page頁(yè)面和 Solaris PAM Page頁(yè)面。
PAM支持下列配置選項(xiàng):
PAM服務(wù)名稱。
Note: 如果PAM設(shè)置讀取/etc/shadow,認(rèn)證 將會(huì)失敗,因?yàn)镻ostgreSQL服務(wù)器是由一個(gè)非root用戶啟動(dòng) 。然而,當(dāng)PAM配置使用LDAP或其他身份驗(yàn)證方法,這不是一個(gè)問(wèn)題。