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

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