从pg_hba.conf文件谈谈postgresql的连接认证
最近一直在弄postgresql的東西,搭建postgresql數(shù)據(jù)庫(kù)集群環(huán)境什么的。操作數(shù)據(jù)庫(kù)少不得要從遠(yuǎn)程主機(jī)訪問(wèn)數(shù)據(jù)庫(kù)環(huán)境,例如數(shù)據(jù)庫(kù)管理員的遠(yuǎn)程管理數(shù)據(jù)庫(kù),遠(yuǎn)程的客戶存取數(shù)據(jù)庫(kù)文件。
而在postgresql中配置文件pg_hba.conf就是用來(lái)設(shè)置訪問(wèn)認(rèn)證的重要文件。這里重點(diǎn)談?wù)?strong>pg_hba.conf這個(gè)文件。
首先聲明,本文說(shuō)明的內(nèi)容基于postgresql的9.5.4版本,可能和某些低版本的說(shuō)明有出入,這是postgresql官方自己更新的,如果想看低版本的,可以自己查看下那個(gè)對(duì)應(yīng)版本的用戶手冊(cè)。
1.pg_hba.conf文件
在pg_hba.conf文件中,每條記錄占一行,指定一條訪問(wèn)認(rèn)證規(guī)則。
總的來(lái)說(shuō)訪問(wèn)控制記錄大致有以下7種形式:
local database user auth-method [auth-options] host database user address auth-method [auth-options] hostssl database user address auth-method [auth-options] hostnossl database user 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]下面對(duì)每個(gè)字段分別進(jìn)行說(shuō)明。
連接方式(type)
連接方式有四種:local 、host、hostssl、hostnossl
local
這條記錄匹配通過(guò) Unix 域套接字進(jìn)行的聯(lián)接企圖, 沒(méi)有這種類型的記錄,就不允許 Unix 域套接字的聯(lián)接。
host
這條記錄匹配通過(guò)TCP/IP網(wǎng)絡(luò)進(jìn)行的聯(lián)接嘗試.他既匹配通過(guò)ssl方式的連接,也匹配通過(guò)非ssl方式的連接。
注意:要使用該選項(xiàng)你要在postgresql.conf文件里設(shè)置listen_address選項(xiàng),不在listen_address里的IP地址是無(wú)法匹配到的。因?yàn)槟J(rèn)的行為是只在localhost上監(jiān)聽(tīng)本地連接。
hostssl
這條記錄匹配通過(guò)在TCP/IP上進(jìn)行的SSL聯(lián)接企圖。
要使用該選項(xiàng),服務(wù)器編譯時(shí)必須使用--with-openssl選項(xiàng),并且在服務(wù)器啟動(dòng)時(shí)ssl設(shè)置是打開(kāi)的,具體內(nèi)容可見(jiàn)這里。
hostnossl
這個(gè)和上面的hostssl相反,只匹配通過(guò)在TCP/IP上進(jìn)行的非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ù)同名的組中的成員;
值 replication 表示匹配一條replication連接,它不指定一個(gè)特定的數(shù)據(jù)庫(kù),一般在流復(fù)制中使用;
在其他情況里,這就是一個(gè)特定的 PostgreSQL 數(shù)據(jù)庫(kù)的名字。 我們可以通過(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)分隔的方法聲明,在名字前面加上+代表匹配該用戶組的所有用戶。一個(gè)包含用戶名的文件可以 通過(guò)在文件名前面前綴 @ 來(lái)聲明,該文件必需和 pg_hba.conf 在同一個(gè)目錄。
主機(jī)地址(address)
指定匹配的客戶端的地址,它可以是一個(gè)主機(jī)名,一個(gè)IP地址范圍,或者下面提到的這些選項(xiàng)。
一個(gè)IP地址范圍是一個(gè)標(biāo)準(zhǔn)的點(diǎn)分十進(jìn)制表示的 IP地址/掩碼值。注意, 在'IP地址','/'和'掩碼值'之間不要有任何的空白字符。
比如對(duì)于IPv4地址來(lái)說(shuō), 172.20.143.89/32指定單個(gè)主機(jī)的IP,172.20.143.0/24代表一個(gè)小的子網(wǎng)。對(duì)于IPv6地址來(lái)說(shuō),::1/128指定單個(gè)主機(jī)(這里是本機(jī)環(huán)回地址),fe80::7a31:c1ff:0000:0000/96 指定一個(gè)IPv6的子網(wǎng)。0.0.0.0/0代表所有IPv4地址,::0/0代表所有IPv6地址。
一個(gè)IPv4地址選項(xiàng)只能匹配IPv4地址,一個(gè)IPv6地址選項(xiàng)只能匹配IPv6地址,即使給出的地址選項(xiàng)在IPV4和IPv6中同時(shí)存在。
當(dāng)然你可以使用 all 選項(xiàng)來(lái)匹配所有的IP地址,使用 samehost 匹配服務(wù)器自己所有的IP地址,samenet來(lái)匹配服務(wù)器直接接入的子網(wǎng)。
如果指定的是主機(jī)名(既不是IP地址也不是上面提到的選項(xiàng)),這個(gè)主機(jī)名將會(huì)和發(fā)起連接請(qǐng)求的客戶端的IP地址的反向名稱解析結(jié)果(即通過(guò)客戶端的IP解析其主機(jī)名,比如使用反向DNS查找)進(jìn)行比對(duì),如果存在匹配,再使用正向名稱解析(例如DNS查找)將主機(jī)名解析為IP地址(可能有多個(gè)IP地址),再判斷客戶端的IP地址是否在這些IP地址中。如果正向和反向解析都成功匹配,那么就真正匹配這個(gè)地址(所以在pg_nba.conf文件里的主機(jī)地址必須是客戶端IP的 address-to-name 解析返回的那個(gè)主機(jī)名。一些主機(jī)名數(shù)據(jù)庫(kù)允許將一個(gè)IP地址和多個(gè)主機(jī)名綁定,但是在解析IP地址時(shí),操作系統(tǒng)只會(huì)返回一個(gè)主機(jī)名)。
有些主機(jī)名以點(diǎn)(.)開(kāi)頭,匹配那些具有相同后綴的主機(jī)名,比如.example.com匹配foo.example.com(當(dāng)然不僅僅只匹配foo.example.com)。
還有,在pg_hba.conf文件中使用主機(jī)名的時(shí)候,你最好能保證主機(jī)名的解析比較快,一個(gè)好的建議就是建立一個(gè)本地的域名解析緩存(比如nscd)。
本選項(xiàng)只能在連接方式是host,hostssl或者h(yuǎn)ostnossl的時(shí)候指定。
ip地址(ip-address)、子網(wǎng)掩碼(ip-mask)
這兩個(gè)字段包含可以看成是標(biāo)準(zhǔn)點(diǎn)分十進(jìn)制表示的 IP地址/掩碼值的一個(gè)替代。例如。使用255.255.255.0 代表一個(gè)24位的子網(wǎng)掩碼。它們倆放在一起,聲明了這條記錄匹配的客戶機(jī)的 IP 地址或者一個(gè)IP地址范圍。本選項(xiàng)只能在連接方式是host,hostssl或者h(yuǎn)ostnossl的時(shí)候指定。
認(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è)方法。
password
和"md5"一樣,但是口令是以明文形式在網(wǎng)絡(luò)上傳遞的,我們不應(yīng)該在不安全的網(wǎng)絡(luò)上使用這個(gè)方式。
gss
使用GSSAPI認(rèn)證用戶,這只適用于 TCP/IP 連接。
sspi
使用SSPI認(rèn)證用戶,這只適用于 Windows 連接。
peer
獲取客戶端的操作系統(tǒng)的用戶名并判斷他是否匹配請(qǐng)求的數(shù)據(jù)庫(kù)名,這只適用于本地連接。
ldap
使用LDAP服務(wù)進(jìn)行驗(yàn)證。
radius
使用RADIUS服務(wù)進(jìn)行驗(yàn)證。
cert
使用SSL服務(wù)進(jìn)行驗(yàn)證。
pam
使用操作系統(tǒng)提供的可插入的認(rèn)證模塊服務(wù) (Pluggable Authentication Modules)(PAM)來(lái)認(rèn)證。
認(rèn)證配置(authentication-option)
這個(gè)可選的字段的含義取決與選擇的認(rèn)證方法。手冊(cè)上也沒(méi)有具體的說(shuō)明,但是給出了如下的例子供參考。
# Allow any user on the local system to connect to any database with # any database user name using Unix-domain sockets (the default for local # connections). # # TYPE DATABASE USER ADDRESS METHOD local all all trust# The same using local loopback TCP/IP connections. # # TYPE DATABASE USER ADDRESS METHOD host all all 127.0.0.1/32 trust# The same as the previous line, but using a separate netmask column # # TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD host all all 127.0.0.1 255.255.255.255 trust# The same over IPv6. # # TYPE DATABASE USER ADDRESS METHOD host all all ::1/128 trust# The same using a host name (would typically cover both IPv4 and IPv6). # # TYPE DATABASE USER ADDRESS METHOD host all all localhost trust# Allow any user from any host with IP address 192.168.93.x to connect # to database "postgres" as the same user name that ident reports for # the connection (typically the operating system user name). # # TYPE DATABASE USER ADDRESS METHOD host postgres all 192.168.93.0/24 ident# Allow any user from host 192.168.12.10 to connect to database # "postgres" if the user's password is correctly supplied. # # TYPE DATABASE USER ADDRESS METHOD host postgres all 192.168.12.10/32 md5# Allow any user from hosts in the example.com domain to connect to # any database if the user's password is correctly supplied. # # TYPE DATABASE USER ADDRESS METHOD host all all .example.com md5# In the absence of preceding "host" lines, these two lines will # reject all connections from 192.168.54.1 (since that entry will be # matched first), but allow GSSAPI connections from anywhere else # on the Internet. The zero mask causes no bits of the host IP # address to be considered, so it matches any host. # # TYPE DATABASE USER ADDRESS METHOD host all all 192.168.54.1/32 reject host all all 0.0.0.0/0 gss# Allow users from 192.168.x.x hosts to connect to any database, if # they pass the ident check. If, for example, ident says the user is # "bryanh" and he requests to connect as PostgreSQL user "guest1", the # connection is allowed if there is an entry in pg_ident.conf for map # "omicron" that says "bryanh" is allowed to connect as "guest1". # # TYPE DATABASE USER ADDRESS METHOD host all all 192.168.0.0/16 ident map=omicron# If these are the only three lines for local connections, they will # allow local users to connect only to their own databases (databases # with the same name as their database user name) except for administrators # and members of role "support", who can connect to all databases. The file # $PGDATA/admins contains a list of names of administrators. Passwords # are required in all cases. # # TYPE DATABASE USER ADDRESS METHOD local sameuser all md5 local all @admins md5 local all +support md5# The last two lines above can be combined into a single line: local all @admins,+support md5# The database column can also use lists and file names: local db1,db2,@demodbs all md52.一些tips和建議
- pg_hba.conf文件是如此重要,我們最好在建立數(shù)據(jù)庫(kù)的時(shí)候就將它配置好,免得后來(lái)配置環(huán)境時(shí)出一些奇奇怪怪的錯(cuò)誤。在修改pg_hba.conf文件后一定要記得pg_ctl reload一下。當(dāng)然,還要做好備份。
- 可能是強(qiáng)迫癥,我每次配置都是盡量最小配置(實(shí)際上也應(yīng)該這么做),比如指定用戶名,數(shù)據(jù)庫(kù)和可訪問(wèn)IP地址的時(shí)候,就只給最小權(quán)限,最小范圍就好了,避免自己誤操作是一回事,同時(shí),把數(shù)據(jù)庫(kù)暴露在太多人面前總覺(jué)得不安全。
- 對(duì)于訪問(wèn)認(rèn)證的控制,除了在pg_hba.conf里面設(shè)置外,也應(yīng)該在數(shù)據(jù)庫(kù)里再進(jìn)一步設(shè)置,比如給某個(gè)用戶只授予所需的最低權(quán)限,比如對(duì)查詢用戶就只給所需的某幾個(gè)數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)的讀權(quán)限,其他的只給數(shù)據(jù)庫(kù)表的增刪改查權(quán)限等,這里不贅述。
- 慎用trust認(rèn)證方式,不要怕偷懶輸密碼,對(duì)于珍貴的數(shù)據(jù)來(lái)說(shuō)多小心一點(diǎn)總沒(méi)錯(cuò),不然的話請(qǐng)閱讀《postgresql刪庫(kù)與跑路》(haha,just for fun~),當(dāng)然實(shí)在怕懶可以設(shè)置下.pgpass這個(gè)文件,懂得自然懂。
- 最后,對(duì)于系統(tǒng)數(shù)據(jù)庫(kù)最好還是設(shè)置下reject的吧。都不要亂動(dòng)哈哈。
好啦,這次就這么多了,中午多吃點(diǎn)鼓勵(lì)下自己。也歡迎各位朋友對(duì)我的文章提出自己的寶貴意見(jiàn),感謝~
轉(zhuǎn)載于:https://www.cnblogs.com/flying-tiger/p/5983588.html
總結(jié)
以上是生活随笔為你收集整理的从pg_hba.conf文件谈谈postgresql的连接认证的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Latex 之 双栏 末页对齐 -- 导
- 下一篇: 【大地信】新时代GIS发展趋势与未来展望