前幾天配pgcluster,改錯(cuò)了pg_hba.conf文件,查了好一陣子。這個(gè)文件網(wǎng)上也有寫的,現(xiàn)在把下面兩篇博文合起來(lái)放在這兒備查。
http://swingfly.iteye.com/blog/508465
http://francs3.blog.163.com/blog/static/4057672720113243113534/
還有篇文章寫的不錯(cuò),也加在最后,原文地址在下面
http://blog.sina.com.cn/s/blog_6c11273c0100lfap.html
-----------------------
pg_hba.conf是設(shè)置訪問(wèn)認(rèn)證的主要文件,格式為每條記錄一行,每行指定一條訪問(wèn)認(rèn)證。設(shè)定一條訪問(wèn)認(rèn)證包含了7個(gè)部分:連接方式(type)、數(shù)據(jù)庫(kù)(database)、用戶名(user)、ip地址(ip-address)、子網(wǎng)掩碼(ip-mask)、認(rèn)證方法(authentication method)、認(rèn)證配置(authentication-option),以下是這7個(gè)部分的詳細(xì)說(shuō)明:
連接方式(type)
連接方式共有三種:local、host、hostssl
local
這條記錄匹配通過(guò) Unix 域套接字進(jìn)行的聯(lián)接企圖, 沒有這種類型的記錄,就不允許 Unix 域套接字的聯(lián)接。
host
這條記錄匹配通過(guò) TCP/IP 網(wǎng)絡(luò)進(jìn)行的聯(lián)接嘗試,請(qǐng)注意,除非服務(wù)器是 帶著 -i 選項(xiàng)或者打開了 postgresql.conf 里面的 tcpip_socket 配置參數(shù)集啟動(dòng)的,否則 TCP/IP 聯(lián)接是被禁止掉的。
hostssl
這條記錄匹配通過(guò)在 TCP/IP 上進(jìn)行的 SSL 聯(lián)接企圖, host 記錄可以匹配 SSL 和非 SSL 的聯(lián)接企圖, 但 hostssl 記錄需要 SSL 聯(lián)接。
數(shù)據(jù)庫(kù)(database)
聲明記錄所匹配的數(shù)據(jù)庫(kù)。值 all 表明該記錄匹配所有數(shù)據(jù)庫(kù), 值 sameuser表示如果被請(qǐng)求的數(shù)據(jù)庫(kù)和請(qǐng)求的用戶同名,則匹配。 samegroup 表示請(qǐng)求的用戶必須是一個(gè)與數(shù)據(jù)庫(kù)同名的組中的成員。 在其他情況里,這就是一個(gè)特定的 PostgreSQL 的名字。 我們可以通過(guò)用逗號(hào)分隔的方法聲明多個(gè)數(shù)據(jù)庫(kù)。 一個(gè)包含數(shù)據(jù)庫(kù)名的文件可以 通過(guò)對(duì)該文件前綴 @ 來(lái)聲明.該文件必需和 pg_hba.conf 在同一個(gè)目錄。
用戶名(user)
為這條記錄聲明所匹配的 PostgreSQL 用戶,值 all 表明它匹配 于所有用戶。否則,它就是特定 PostgreSQL 用戶的名字,多個(gè)用戶名可以通過(guò)用逗號(hào)分隔的方法聲明,組名字 可以通過(guò)用 + 做組名字前綴來(lái)聲明。一個(gè)包含用戶名的文件可以 通過(guò)在文件名前面前綴 @ 來(lái)聲明,該文件必需和 pg_hba.conf 在同一個(gè)目錄。
ip地址(ip-address)、子網(wǎng)掩碼(ip-mask)
這兩個(gè)字段包含標(biāo)準(zhǔn)的點(diǎn)分十進(jìn)制表示的 IP地址/掩碼值。 (IP地址只能用數(shù)字的方式聲明,而不能用域名或者主機(jī)名)它們倆放在一起,聲明了這條記錄匹配的客戶機(jī)的 IP 地址。 準(zhǔn)確的邏輯是:(actual-IP-address xor IP-address-field) and IP-mask-field 對(duì)于要匹配的記錄必需為零。如果連接方式是host或者h(yuǎn)ostssl的話,這兩項(xiàng)必須指定,否則可以不填。
認(rèn)證方法(authentication method)
trust
無(wú)條件地允許聯(lián)接,這個(gè)方法允許任何可以與PostgreSQL 數(shù)據(jù)庫(kù)聯(lián)接的用戶以他們期望的任意 PostgreSQL 數(shù)據(jù)庫(kù)用戶身份進(jìn)行聯(lián)接,而不需要口令。
reject
聯(lián)接無(wú)條件拒絕,常用于從一個(gè)組中"過(guò)濾"某些主機(jī)。
md5
要求客戶端提供一個(gè) MD5 加密的口令進(jìn)行認(rèn)證,這個(gè)方法是允許加密口令存儲(chǔ)在pg_shadow里的唯一的一個(gè)方法。
crypt
類似 md5 方法,只是用的是老式的 crypt 加密認(rèn)證, 用于 7.2 以前的客戶端,對(duì)于 7.2 以及以后的客戶端,我們建議使用 md5。
password
和"md5"一樣,但是口令是以明文形式在網(wǎng)絡(luò)上傳遞的,我們不應(yīng)該在不安全的網(wǎng)絡(luò)上使用這個(gè)方式。
krb4
用 Kerberos V4 認(rèn)證用戶,只有在進(jìn)行 TCP/IP 聯(lián)接的時(shí)候才能用。(譯注:Kerberos,"克爾波洛斯",故希臘神話冥王哈得斯的多頭看門狗。Kerberos 是 MIT 開發(fā)出來(lái)的基與對(duì)稱加密算法的認(rèn)證協(xié)議和/或密鑰 交換方法,其特點(diǎn)是需要兩個(gè)不同用途的服務(wù)器,一個(gè)用于認(rèn)證身份, 一個(gè)用于通道兩端用戶的密鑰交換。同時(shí) Kerberos 對(duì)網(wǎng)絡(luò)時(shí)間同步 要求比較高,以防止回放攻擊,因此通常伴隨 NTP 服務(wù)。)
krb5
用 Kerberos V5 認(rèn)證用戶.只有在進(jìn)行 TCP/IP 聯(lián)接的時(shí)候才能用。(譯注:Kerberos V5 是上面 V4 的改良,主要是不再依賴 DES 算法, 同時(shí)增加了一些新特性。)
ident
獲取客戶的操作系統(tǒng)名(對(duì)于 TCP/IP 聯(lián)接,用戶的身份是通過(guò)與運(yùn)行在客戶端上的 ident 服務(wù)器聯(lián)接進(jìn)行判斷的,對(duì)于本地聯(lián)接,它是從操作系統(tǒng)獲取的。) 然后檢查一下,看看用戶是否允許以要求的數(shù)據(jù)庫(kù)用戶進(jìn)行聯(lián)接, 方法是參照在 ident 關(guān)鍵字后面聲明的映射。
如果你使用了 sameuser 映射,那么假設(shè)用戶名 是相等的。如果沒有聲明這個(gè)關(guān)鍵字,則在 $PGDATA/pg_ident.conf 文件中找出映射名。如果這個(gè)文件里包含一條記錄標(biāo)識(shí)著ident提供的用戶名 和請(qǐng)求的 PostgreSQL 用戶名的映射, 那么聯(lián)接被接受。
對(duì)于本地聯(lián)接,只有在系統(tǒng)支持Unix域套接字信任證的情況下 才能使用(目前是 Linux, FreeBSD, NetBSD, 和 BSD/OS)。
pam
使用操作系統(tǒng)提供的可插入的認(rèn)證模塊服務(wù) (Pluggable Authentication Modules)(PAM)來(lái)認(rèn)證。
認(rèn)證配置(authentication-option)
這個(gè)可選的字段的含義取決與選擇的認(rèn)證方法。
======================================
大家知道PostgreSQL在連接認(rèn)證體系方面功能非常全面,因?yàn)樗玫搅艘粋€(gè) pg_hba.conf
( HBA stands for host-based authentication )文件。
--先來(lái)看 pg_hba.conf 文件的一個(gè)例子
# TYPE DATABASE USER CIDR-ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host mydb query_man 192.168.1.55/32 md5
備注:為了顯示方便,上面僅列出 pg_hba.conf文件的最后一部分。從上面看出 pg_hba.conf
文件是由一行行記錄組成,每行記錄包括認(rèn)證類型,數(shù)據(jù)庫(kù)名,用戶名,認(rèn)證IP,認(rèn)證方式字段。就
是這些記錄控制著客戶端的連接。
本文不準(zhǔn)備詳細(xì)介紹 pg_hba.conf 文件的配置方法,關(guān)于 pg_hba.conf 的詳細(xì)概述可以
參考手冊(cè)
http://www.postgresql.org/docs/9.0/static/client-authentication.html
, 本
文僅講述以下場(chǎng)景 pg_hba.conf 的配置方法。
假設(shè)場(chǎng)景: 有一套生產(chǎn)庫(kù)已經(jīng)上線了,假設(shè)這個(gè)生產(chǎn)庫(kù)的庫(kù)名為 mydb, 生產(chǎn)用戶為 skytf,
現(xiàn)在開發(fā)人員需要定期的去查看這個(gè)庫(kù)里的某些表,這時(shí)考慮到生產(chǎn)庫(kù)的安全,可以創(chuàng)建一個(gè)查詢
用戶 query_man, 并授予一定的查詢權(quán)限。這時(shí)開發(fā)人員可以在自己的電腦上通過(guò) pgadmin等客戶端
工具連接數(shù)據(jù)庫(kù)了,但此時(shí)有個(gè)問(wèn)題,開發(fā)人員手里同時(shí)也有生產(chǎn)用戶 skytf 的密碼 ,因?yàn)轫?xiàng)目上
線時(shí),DBA會(huì)所生產(chǎn)用戶密碼給開發(fā)人員,對(duì)應(yīng)用進(jìn)行配置,一般情況下都沒收回這個(gè)權(quán)限,那么,
理論上說(shuō),開發(fā)人員可以在本機(jī)使用生產(chǎn)帳號(hào) skytf 連接生產(chǎn)庫(kù)了( 不考慮網(wǎng)絡(luò)情況下 ), 很明顯,
這是一種安全隱患,但是,PG里的 pg_hba.conf非常強(qiáng)大,可以利用它來(lái)配置一種比較嚴(yán)謹(jǐn)?shù)恼J(rèn)證方法。
--修改后的 pg_hba.conf 文件
# TYPE DATABASE USER CIDR-ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host mydb query_man 192.168.1.55/32 md5
host allall 192.168.1.55/32 reject
host all all 0.0.0.0/0 md5
這里假設(shè) "192.168.1.55" 是指開發(fā)人員的IP, 這只是舉個(gè)例子,如果有多數(shù)開發(fā)人員,您也可以將它
設(shè)置成一個(gè)網(wǎng)段。這里主要看以下兩段, 第一段的意思是,主機(jī) 192.168.1.55 僅允許用 query_man 用戶連接
數(shù)據(jù)庫(kù) mydb, 第二段的意思是拒絕主機(jī) 192.168.1.55 以任何用戶連接任何數(shù)據(jù)庫(kù)。
# IPv6 local connections:
host mydb query_man 192.168.1.55/32 md5
host all all 192.168.1.55/32 reject
講到這里,需要講解下 pg_hba.conf 認(rèn)證流程,客戶端在連接 PostgreSQL時(shí),PostgreSQL 會(huì)從上到下
讀取 pg_hba.conf 文件,如果有匹配的記錄且認(rèn)證通過(guò),則可以連接數(shù)據(jù)庫(kù),如果有匹配的記錄且認(rèn)證失敗
則訪問(wèn)被拒絕,而不再考慮 pg_hba.conf 接下來(lái)的記錄。上面的配置有效地控制了開發(fā)人員通過(guò)本機(jī)以生產(chǎn)
用戶連接生產(chǎn)庫(kù)的情況, 同時(shí)只允許他們以查詢用戶連接生產(chǎn)庫(kù)。
--附:pg_hba.conf 認(rèn)證流程圖
=====================
客戶端認(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 文件。不過(guò)我們也可以把認(rèn)證配置文件放在其它地方;參閱 hba_file 配置參數(shù)。
pg_hba.conf 文件的常用格式是一組記錄,每行一條??瞻仔袑⒈缓雎裕?hào) # 開頭的注釋也被忽略。一條記錄是由若干用空格和/或制表符分隔的字段組成。如果字段用引號(hào)包圍,那么它可以包含空白。記錄不能跨行存在。
每條記錄聲明一種連接類型、一個(gè)客戶端 IP地址范圍(如果和連接類型相關(guān)的話)、一個(gè)數(shù)據(jù)庫(kù)名、一個(gè)用戶名字、對(duì)匹配這些參數(shù)的連接使用的認(rèn)證方法。第一條匹配連接類型、客戶端地址、連接請(qǐng)求的數(shù)據(jù)庫(kù)名和用戶名的記錄將用于執(zhí)行認(rèn)證。這個(gè)處理過(guò)程沒有"跨越"或者"回頭"的說(shuō)法:如果選擇了一條記錄而且認(rèn)證失敗,那么將不再考慮后面的記錄。如果沒有匹配的記錄,那么訪問(wèn)將被拒絕。
每條記錄可以是下面七種格式之一:
local database user auth-method [ auth-option ] host database user CIDR-address auth-method [ auth-option hostssl database user CIDR-address auth-method [ auth-option ] hostnossl database user CIDR-address auth-method [ auth-option ] host database user IP-address IP-mask auth-method [ auth-option ] hostssl database user IP-address IP-mask auth-method [ auth-option ] hostnossl database user IP-address IP-mask auth-method [ auth-option ]
各個(gè)字段的含義如下:
這條記錄匹配企圖通過(guò) Unix 域套接字進(jìn)行的連接。沒有這種類型的記錄,就不允許 Unix 域套接字的連接。
這條記錄匹配企圖通過(guò) TCP/IP 進(jìn)行的連接。 host 記錄匹配 SSL 和非 SSL 的連接請(qǐng)求。
【注意】 除非服務(wù)器帶著合適的 listen_addresses 配置參數(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)(參閱 節(jié)16.7 )。
這條記錄與 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 同義詞)。在其它情況里,這就是一個(gè)特定的 PostgreSQL數(shù)據(jù)庫(kù)名字。可以通過(guò)用逗號(hào)分隔的方法聲明多個(gè)數(shù)據(jù)庫(kù),也可以通過(guò)前綴 @ 來(lái)聲明一個(gè)包含數(shù)據(jù)庫(kù)名的文件。
為這條記錄聲明所匹配的數(shù)據(jù)庫(kù)用戶。值 all 表明它匹配于所有用戶。否則,它就是特定數(shù)據(jù)庫(kù)用戶的名字或者是一個(gè)前綴 的組名稱。請(qǐng)注意,在 PostgreSQL里,用戶和組沒有真正的區(qū)別, 實(shí)際上只是意味著"匹配任何直接或者間接屬于這個(gè)角色的成員",而沒有記號(hào)的名字只匹配指定的角色。多個(gè)用戶名可以通過(guò)用逗號(hào)分隔的方法聲明。一個(gè)包含用戶名的文件可以通過(guò)在文件名前面前綴 @ 來(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)度之間不能有空白。
典型的 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)。要聲明單個(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 記錄。
IP-mask
這些方法可以用于作為 CIDR-address 表示法的替補(bǔ)。它不是聲明掩碼的長(zhǎng)度,而是在另外一個(gè)字段里聲明實(shí)際的掩碼。比如, 255.0.0.0 表示 IPv4CIDR 掩碼長(zhǎng)度 8 ,而 255.255.255.255 表示 CIDR 掩碼長(zhǎng)度 32 。
這些字段只適用于 host , hostssl , hostnossl 記錄。
聲明通過(guò)這條記錄連接的時(shí)候使用的認(rèn)證方法。可能的選擇在下面簡(jiǎn)介,詳細(xì)情況在 節(jié)20.2 中介紹。
無(wú)條件地允許連接。這個(gè)方法允許任何可以與 PostgreSQL 數(shù)據(jù)庫(kù)服務(wù)器連接的用戶以他們期望的任意 PostgreSQL數(shù)據(jù)庫(kù)用戶身份進(jìn)行連接,而不需要口令。參閱 節(jié)20.2.1 獲取細(xì)節(jié)。
無(wú)條件地拒絕連接。常用于從一個(gè)組中"過(guò)濾"某些主機(jī)。
要求客戶端提供一個(gè) MD5 加密的口令進(jìn)行認(rèn)證。參閱 節(jié)20.2.2 獲取細(xì)節(jié)。
【注意】 這個(gè)選項(xiàng)只有在與 7.2 以前的客戶端進(jìn)行通訊的時(shí)候才建議使用。
crypt
要求客戶端提供一個(gè)
crypt()
加密的口令用于認(rèn)證。現(xiàn)在我們建議使用
md5
。參閱
節(jié)20.2.2
。
要求客戶端提供一個(gè)未加密的口令進(jìn)行認(rèn)證。因?yàn)榭诹钍且悦魑男问皆诰W(wǎng)絡(luò)上傳遞的,所以我們不應(yīng)該在不安全的網(wǎng)絡(luò)上使用這個(gè)方式。并且它通常還不能和線程化的客戶端應(yīng)用一起使用。參閱 節(jié)20.2.2 獲取細(xì)節(jié)。
用 Kerberos V5 認(rèn)證用戶。只有在進(jìn)行 TCP/IP 連接的時(shí)候才能用。參閱 節(jié)20.2.3 獲取細(xì)節(jié)。
獲取客戶的操作系統(tǒng)名然后檢查該用戶是否允許以要求的數(shù)據(jù)庫(kù)用戶進(jìn)行連接,方法是參照在 ident 關(guān)鍵字后面聲明的映射。對(duì)于 TCP/IP 連接,用戶的身份是通過(guò)與運(yùn)行在客戶端上的 ident 服務(wù)器連接進(jìn)行判斷的,對(duì)于本地連接,它是從操作系統(tǒng)獲取的。參閱 節(jié)20.2.4 獲取細(xì)節(jié)。
使用 LDAP 進(jìn)行認(rèn)證。參閱 節(jié)20.2.5 獲取細(xì)節(jié)。
使用操作系統(tǒng)提供的可插入認(rèn)證模塊服務(wù)(PAM)來(lái)認(rèn)證。參閱 節(jié)20.2.6 獲取細(xì)節(jié)。
這個(gè)可選字段的含義取決于選擇的認(rèn)證方法。細(xì)節(jié)在下面。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
