?
This document uses PHP Chinese website manual Release
客戶端認(rèn)證是由一個(gè)配置文件 通常名為 pg_hba.conf 控制的,它存放在數(shù)據(jù)庫(kù)集群的數(shù)據(jù)目錄里。 (HBA的意思是host-based authentication,也就是基于主機(jī)的認(rèn)證)。 在initdb初始化數(shù)據(jù)目錄的時(shí)候,它會(huì)安裝一個(gè)缺省的pg_hba.conf文件。不過我們也可以把認(rèn)證配置文件放在其它地方; 參閱hba_file 配置參數(shù)。
pg_hba.conf文件的常用格式是一組記錄,每行一條??瞻仔袑⒈缓雎裕? # 開頭的注釋也被忽略。 一條記錄是由若干用空格和/或制表符分隔的字段組成。如果字段用引號(hào)包圍,那么它可以包含空白。 在數(shù)據(jù)庫(kù)或用戶名稱字段中引用關(guān)鍵字之一(例如, all或者replication)使字失去其特殊的 字符,只是匹配數(shù)據(jù)庫(kù)或使用該名稱的用戶。
每條記錄聲明一種連接類型、一個(gè)客戶端IP地址范圍(如果和連接類型相關(guān)的話)、一個(gè)數(shù)據(jù)庫(kù)名、一個(gè)用戶名字、對(duì)匹配這些參數(shù)的連接使用的認(rèn)證方法。第一條匹配連接類型、客戶端地址、連接請(qǐng)求的數(shù)據(jù)庫(kù)名和用戶名的記錄將用于執(zhí)行認(rèn)證。這個(gè)處理過程沒有"fall-through"或者"backup"的說法:如果選擇了一條記錄而且認(rèn)證失敗,那么將不再考慮后面的記錄。如果沒有匹配的記錄,那么訪問將被拒絕。
每條記錄可以是下面七種格式之一:
local database user auth-method [auth-options] host database user CIDR-address auth-method [auth-options] hostssl database user CIDR-address auth-method [auth-options] hostnossl database user CIDR-address auth-method [auth-options] host database user IP-address IP-mask auth-method [auth-options] hostssl database user IP-address IP-mask auth-method [auth-options] hostnossl database user IP-address IP-mask auth-method [auth-options]
各個(gè)字段的含義如下:
這條記錄匹配企圖通過Unix域套接字進(jìn)行的連接。沒有這種類型的記錄,就不允許Unix域套接字的連接。
這條記錄匹配企圖通過TCP/IP進(jìn)行的連接。host記錄匹配SSL和非SSL的連接嘗試。
Note: 除非服務(wù)器帶著合適的 listen_addresses配置參數(shù), 配置參數(shù)值啟動(dòng),否則將不可能進(jìn)行遠(yuǎn)程的TCP/IP連接,因?yàn)槿笔〉男袨槭侵槐O(jiān)聽本地自環(huán)地址localhost的連接。
這條記錄匹配企圖使用TCP/IP的SSL連接。但必須是使用SSL加密的連接。
要使用這個(gè)選項(xiàng),編譯服務(wù)器的時(shí)候必須打開SSL支持。而且在服務(wù)器啟動(dòng)的時(shí)候必須打開SSL配置選項(xiàng) 參閱Section 17.8.
這條記錄與hostssl相反;它只匹配那些在TCP/IP上不使用SSL的連接請(qǐng)求。
聲明記錄所匹配的數(shù)據(jù)庫(kù)名稱。 值all表明該記錄匹配所有數(shù)據(jù)庫(kù),值 sameuser表示如果被請(qǐng)求的數(shù)據(jù)庫(kù)和請(qǐng)求的用戶同名,則匹配。值samerole 表示請(qǐng)求的用戶必須是一個(gè)與數(shù)據(jù)庫(kù)同名的角色中的成員 (samegroup是一個(gè)已經(jīng)廢棄了,但目前仍然被接受的samerole同義詞。) replication值指定記錄匹配,如果復(fù)制連接請(qǐng)求(注意:復(fù)制連接不指定任何特定的數(shù)據(jù)庫(kù))。 在其它情況里,這就是一個(gè)特定的PostgreSQL數(shù)據(jù)庫(kù)名字。可以通過用逗號(hào)分隔的方法聲明多個(gè)數(shù)據(jù)庫(kù),也可以通過前綴@來(lái)聲明一個(gè)包含數(shù)據(jù)庫(kù)名的文件。
為這條記錄聲明所匹配的數(shù)據(jù)庫(kù)用戶。 值all 表明它匹配于所有用戶。 否則,它就是特定數(shù)據(jù)庫(kù)用戶的名字或者是一個(gè)前綴+的組名稱。 請(qǐng)注意,在PostgreSQL里,用戶和組沒有真正的區(qū)別, +實(shí)際上只是意味著"匹配任何直接或者間接屬于這個(gè)角色的成員", 而沒有+記號(hào)的名字只匹配指定的角色。 多個(gè)用戶名可以通過用逗號(hào)分隔的方法聲明。 一個(gè)包含用戶名的文件可以通過在文件名前面前綴@ 來(lái)聲明。
聲明這條記錄匹配的客戶端機(jī)器的IP地址范圍。 它包含一個(gè)標(biāo)準(zhǔn)的點(diǎn)分十進(jìn)制的IP地址 (只能用數(shù)值而不能用域或主機(jī)名)和一個(gè)CIDR掩碼長(zhǎng)度。 掩碼長(zhǎng)度表示客戶端IP地址必須匹配的高位二進(jìn)制位數(shù)。 在給出的IP地址里,這個(gè)長(zhǎng)度的右邊的二進(jìn)制位必須為零。 在IP地址、/、CIDR掩碼長(zhǎng)度之間不能有空白。
可以用samehost代替CIDR-address來(lái)匹配任何服務(wù)器自己的IP地址,或samenet匹配任何直接連接到服務(wù)器子網(wǎng)的地址。
典型的CIDR-address舉例:172.20.143.89/32表示一個(gè)主機(jī),172.20.143.0/24表示一個(gè)小子網(wǎng),10.6.0.0/16表示一個(gè)大子網(wǎng),0.0.0.0/0 ("all balls")表示所有地址。要聲明單個(gè)主機(jī),給IPv4地址聲明CIDR掩碼32,給IPv6地址聲明128。不要在地址中省略結(jié)尾的0 。
以IPv4格式給出的IP地址會(huì)匹配那些擁有對(duì)應(yīng)地址的IPv6連接,比如127.0.0.1將匹配IPv6地址::ffff:127.0.0.1。一個(gè)以IPv6格式給出的記錄將只匹配IPv6連接,即使對(duì)應(yīng)的地址在IPv4-in-IPv6范圍內(nèi)。請(qǐng)注意如果系統(tǒng)的C庫(kù)不支持IPv6地址,那么IPv6的格式將被拒絕。
這個(gè)字段只適用于host,hostssl和hostnossl記錄。
這些方法可以用于作為 CIDR-address表示法的替補(bǔ)。 它不是聲明掩碼的長(zhǎng)度,而是在另外一個(gè)字段里聲明實(shí)際的掩碼。 比如,255.0.0.0表示IPv4 CIDR掩碼長(zhǎng)度8,而255.255.255.255表示CIDR掩碼長(zhǎng)度32。
這些字段只適用于host, hostssl和hostnossl記錄。
聲明通過這條記錄連接的時(shí)候使用的認(rèn)證方法??赡艿倪x擇在下面簡(jiǎn)介,詳細(xì)情況在Section 19.3中介紹。
無(wú)條件地允許連接。這個(gè)方法允許任何可以與PostgreSQL數(shù)據(jù)庫(kù)服務(wù)器連接的用戶以他們期望的任意PostgreSQL數(shù)據(jù)庫(kù)用戶身份進(jìn)行連接,而不需要口令或者其他任何認(rèn)證。 參閱Section 19.3.1 獲取詳細(xì)信息。
無(wú)條件地拒絕連接。篩選出若干主機(jī)是有用的,例如 reject行可以阻止一個(gè)特定的主機(jī)連接, 而稍后線允許在一個(gè)特定的其余主機(jī)進(jìn)行 網(wǎng)絡(luò)連接。
要求客戶端提供一個(gè)MD5加密的口令進(jìn)行認(rèn)證。 參閱Section 19.3.2 獲得詳細(xì)信息.
要求客戶端提供一個(gè)未加密的口令進(jìn)行認(rèn)證。因?yàn)榭诹钍且悦魑男问皆诰W(wǎng)絡(luò)上傳遞的,所以我們不應(yīng)該在不安全的網(wǎng)絡(luò)上使用這個(gè)方式。并且它通常還不能和線程化的客戶端應(yīng)用一起使用。 參閱Section 19.3.2 獲得信息信息。
用GSSAPI認(rèn)證用戶。只有在進(jìn)行TCP/IP連接的時(shí)候才可能用。參閱Section 19.3.3獲得詳細(xì)信息。
用SSPI來(lái)認(rèn)證用戶。這僅僅是 在Windows上使用。參閱Section 19.3.4獲得詳細(xì)信息。
用Kerberos V5 認(rèn)證用戶。只有在進(jìn)行TCP/IP連接的時(shí)候才能用。 參閱 Section 19.3.5獲得詳細(xì)信息.
獲取客戶的操作系統(tǒng)名然后檢查該用戶是否允許以要求的數(shù)據(jù)庫(kù)用戶名進(jìn)行連接, 對(duì)于TCP/IP連接,通過連接在客戶端上的ident服務(wù)器進(jìn)行判斷的,對(duì)于本地連接,它是從操作系統(tǒng)獲取的。 參見Section 19.3.6獲得詳細(xì)信息.
使用LDAP服務(wù)器認(rèn)證。參閱Section 19.3.7獲得詳細(xì)信息。
用RADIUS服務(wù)器認(rèn)證,參閱Section 19.3.8獲得詳細(xì)信息。
使用SSL客戶端證書認(rèn)證。參閱Section 19.3.9獲得詳細(xì)信息。
使用操作系統(tǒng)提供的可插入認(rèn)證模塊服務(wù)(PAM)來(lái)認(rèn)證。 參閱Section 19.3.10 獲得詳細(xì)信息.
auth-method字段之后,形式name=value的字段集 是認(rèn)證方法的指定選擇。關(guān)于選項(xiàng)可用的詳情,認(rèn)證方法在下面。
用@構(gòu)造包含的文件是當(dāng)作一列名字讀取的, 這些名字可以用空白或者逗號(hào)分隔。 注釋用#引入,就像在pg_hba.conf里那樣, 允許嵌套@構(gòu)造。除非跟在@后面的文件名是一個(gè)絕對(duì)路徑, 否則被當(dāng)作與該文件所在目錄相對(duì)的路徑。
因?yàn)檎J(rèn)證時(shí)系統(tǒng)是為每個(gè)連接請(qǐng)求順序檢查 pg_hba.conf里的記錄的, 所以這些記錄的順序是非常關(guān)鍵的。 通常,靠前的記錄有比較嚴(yán)的連接匹配參數(shù)和比較弱的認(rèn)證方法, 而靠后的記錄有比較松的匹配參數(shù)和比較嚴(yán)的認(rèn)證方法。 比如,我們一般都希望對(duì)本地TCP/IP連接使用trust認(rèn)證, 而對(duì)遠(yuǎn)端的TCP/IP連接要求口令。 在這種情況下我們將trust認(rèn)證方法用于來(lái)自127.0.0.1的連接, 這條記錄將出現(xiàn)在允許更廣泛的客戶端IP地址的使用口令認(rèn)證的記錄前面。
在啟動(dòng)和主服務(wù)器進(jìn)程收到SIGHUP信號(hào)的時(shí)候, 系統(tǒng)都會(huì)重新裝載pg_hba.conf文件。 如果你在活躍的系統(tǒng)上編輯了該文件, 就必須通知服務(wù)器(使用pg_ctl reload或kill -HUP) 重新加載該文件。
Tip: 一個(gè)用戶要想成功連接到特定的數(shù)據(jù)庫(kù), 不僅需要通過pg_hba.conf的檢查, 還必須要有該數(shù)據(jù)庫(kù)上的CONNECT權(quán)限。 如果希望限制哪些用戶能夠連接到哪些數(shù)據(jù)庫(kù), 賦予/撤銷CONNECT權(quán)限通常比在pg_hba.conf 中設(shè)置規(guī)則簡(jiǎn)單。
Example 19-1里是 pg_hba.conf 記錄的一些例子。閱讀下文理解不同認(rèn)證方法的細(xì)節(jié)。
Example 19-1. Example pg_hba.conf entries例20-1 pg_hba.conf 記錄的例子
#允許在本機(jī)上的任何用戶使用 Unix 域套接字(缺省為本地連接)以任何數(shù)據(jù)庫(kù)用戶身份連接任何數(shù)據(jù)庫(kù) # # TYPE DATABASE USER CIDR-ADDRESS METHOD local all all trust #和上面相同,但是使用的是回環(huán)的(loopback)TCP/IP 連接 # # TYPE DATABASE USER CIDR-ADDRESS METHOD host all all 127.0.0.1/32 trust ##和上面一行相同,但是用的是獨(dú)立的掩碼字段 # TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD host all all 127.0.0.1 255.255.255.255 trust # 允許 IP 地址為 192.168.93.x 的任何主機(jī)與 "postgres" 數(shù)據(jù)庫(kù)相連, #用與他們?cè)谧约旱闹鳈C(jī)上相同 ident 的用戶名標(biāo)識(shí)他自己(通常是他的 Unix 用戶名) # # TYPE DATABASE USER CIDR-ADDRESS METHOD host postgres all 192.168.93.0/24 ident # 允許來(lái)自主機(jī) 192.168.12.10 的用戶提供了正確的口令之后與 "postgres" 數(shù)據(jù)庫(kù)連接。 # # TYPE DATABASE USER CIDR-ADDRESS METHOD host postgres all 192.168.12.10/32 md5 # 如果前面沒有其它 "host" 行,那么下面兩行將拒絕所有來(lái)自 192.168.54.1 的連接請(qǐng)求(因?yàn)榍懊娴挠涗浵绕ヅ?。 # 但是允許來(lái)自互聯(lián)網(wǎng)上其它任何地方的有效的 Kerberos 5 認(rèn)證的連接。 # 零掩碼表示不考慮主機(jī) IP 的任何位。因此它匹配任何主機(jī)。 # # TYPE DATABASE USER CIDR-ADDRESS METHOD host all all 192.168.54.1/32 reject host all all 0.0.0.0/0 krb5 #允許來(lái)自 192.168.x.x 的任何用戶與任意數(shù)據(jù)庫(kù)連接,只要他們通過 ident 檢查。 # 但如果 ident 說該用戶是 "bryanh" 且他要求以 PostgreSQL 用戶 "guest1" 連接, # 那么只有在 pg_ident.conf 里有 "omicron" 的映射說 "bryanh" 允許以 "guest1" 進(jìn)行連接時(shí)才真正可以進(jìn)行連接。 # # TYPE DATABASE USER CIDR-ADDRESS METHOD host all all 192.168.0.0/16 ident map=omicron #如果下面是用于本地連接的僅有的三行,那么它們將允許本地用戶只和同名數(shù)據(jù)庫(kù)連接。 # 只有管理員和 "support" 角色里的成員例外,他們可以連接到任何數(shù)據(jù)庫(kù)。 # # TYPE DATABASE USER CIDR-ADDRESS METHOD local sameuser all md5 local all @admins md5 local all +support md5 #上面最后兩行可以合起來(lái)寫成一行: local all @admins,+support md5 # 數(shù)據(jù)庫(kù)字段也可以使用列表和文件名 local db1,db2,@demodbs all md5