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