溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么在PostgreSQL中利用pg_hba.conf實(shí)現(xiàn)一個(gè)客戶端認(rèn)證功能

發(fā)布時(shí)間:2021-01-06 15:12:40 來源:億速云 閱讀:282 作者:Leah 欄目:開發(fā)技術(shù)

怎么在PostgreSQL中利用pg_hba.conf實(shí)現(xiàn)一個(gè)客戶端認(rèn)證功能?針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。

在initdb初始化數(shù)據(jù)文件時(shí),默認(rèn)提供pg_hba.conf. 通過配置該文件,能夠指定哪些ip可以訪問,哪些ip不可以訪問,以及訪問的資源和認(rèn)證方式,該文件類似于oracle中的監(jiān)聽中的白名單黑名單功能,且同樣可以reload在線生效。

記錄可以是下面七種格式之一:

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]

各個(gè)域的含義如下:

各個(gè)類型簡(jiǎn)單描述如下:

local

一般為本地socket連接。如果沒有這種類型的記錄,就不允許 Unix 域套接字連接。

host

這條記錄匹配企圖使用 TCP/IP 建立的連接。host記錄匹配SSL和非SSL的連接嘗試。

database

登錄時(shí)指定的數(shù)據(jù)庫,all匹配所有數(shù)據(jù)庫;注意pg是單實(shí)例多database類型.

user

登錄時(shí)指定的數(shù)據(jù)庫用戶名,all匹配所有用戶

address

指定這個(gè)記錄匹配的客戶端機(jī)器地址。這個(gè)域可以包含一個(gè)主機(jī)名、一個(gè) IP 地址范圍或下文提到的特殊關(guān)鍵字之一。 比如 網(wǎng)絡(luò)地址(172.20.143.0/24)以及分別指定ip以及掩碼.

authentication method

客戶端采用的認(rèn)證方式,比如trust為無條件地允許聯(lián)接;reject為無條件拒絕連接;password為明文密碼驗(yàn)證; md5密文密碼驗(yàn)證等

如下為幾種策略(entry)配置的簡(jiǎn)單描述:

TYPE DATABASE USER ADDRESS METHOD
local all all trust

該認(rèn)證方式為本地local socket方式驗(yàn)證,且無條件接受連接.

TYPE DATABASE USER ADDRESS METHOD
host all all 127.0.0.1/32 trust

該認(rèn)證方式為允許host(本地 127.0.0.1)進(jìn)行訪問且無條件接受連接.

TYPE DATABASE USER ADDRESS METHOD
host postgres all 192.168.93.0/24 md5

該認(rèn)證方式為允許192.168.93網(wǎng)段的客戶端所有用戶訪問postgres數(shù)據(jù)庫

TYPE DATABASE USER IPADDRES IPMASK METHOD
host dbinst1 user1 192.168.93.21 255.255.255.0 md5

該認(rèn)證方式為允許192.168.93.21的客戶端以u(píng)ser1用戶訪問dbinst1數(shù)據(jù)庫

通過一番文字描述,最后在來個(gè)實(shí)際操作,如下案例中可以發(fā)現(xiàn)未配置pg_hba.conf策略(entry) 則在嘗試訪問pg時(shí)會(huì)自動(dòng)提示無匹配的pg_hba.conf entry.通過配置entry并reload后,客戶端便可正常訪問pg.這個(gè)entry類似于防火墻中配置的逐條策略。

怎么在PostgreSQL中利用pg_hba.conf實(shí)現(xiàn)一個(gè)客戶端認(rèn)證功能

注意雖然pg_bha.conf起到了一部分的客戶端訪問控制的作用,但是數(shù)據(jù)庫實(shí)例層仍然需要做好對(duì)應(yīng)權(quán)限控制,比如上文案例中已提前授予user1對(duì)dbinst1數(shù)據(jù)庫的connect權(quán)限,客戶端才可以正常登陸數(shù)據(jù)庫.

總結(jié)一下pg_hba.conf就是類似于oracle的黑白名單功能的過濾器.

補(bǔ)充:從pg_hba.conf文件談?wù)刾ostgresql的連接認(rèn)證

最近一直在弄postgresql的東西,搭建postgresql數(shù)據(jù)庫集群環(huán)境什么的。操作數(shù)據(jù)庫少不得要從遠(yuǎn)程主機(jī)訪問數(shù)據(jù)庫環(huán)境,例如數(shù)據(jù)庫管理員的遠(yuǎn)程管理數(shù)據(jù)庫,遠(yuǎn)程的客戶存取數(shù)據(jù)庫文件。

而在postgresql中配置文件pg_hba.conf就是用來設(shè)置訪問認(rèn)證的重要文件。這里重點(diǎn)談?wù)刾g_hba.conf這個(gè)文件。

首先聲明,本文說明的內(nèi)容基于postgresql的9.5.4版本,可能和某些低版本的說明有出入,這是postgresql官方自己更新的,如果想看低版本的,可以自己查看下那個(gè)對(duì)應(yīng)版本的用戶手冊(cè)。

1.pg_hba.conf文件

在pg_hba.conf文件中,每條記錄占一行,指定一條訪問認(rèn)證規(guī)則。

總的來說訪問控制記錄大致有以下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)行說明。

連接方式(type)

連接方式有四種:local 、host、hostssl、hostnossl

local

這條記錄匹配通過 Unix 域套接字進(jìn)行的聯(lián)接企圖, 沒有這種類型的記錄,就不允許 Unix 域套接字的聯(lián)接。

host

這條記錄匹配通過TCP/IP網(wǎng)絡(luò)進(jìn)行的聯(lián)接嘗試.他既匹配通過ssl方式的連接,也匹配通過非ssl方式的連接。

注意:要使用該選項(xiàng)你要在postgresql.conf文件里設(shè)置listen_address選項(xiàng),不在listen_address里的IP地址是無法匹配到的。因?yàn)槟J(rèn)的行為是只在localhost上監(jiān)聽本地連接。

hostssl

這條記錄匹配通過在TCP/IP上進(jìn)行的SSL聯(lián)接企圖。

要使用該選項(xiàng),服務(wù)器編譯時(shí)必須使用--with-openssl選項(xiàng),并且在服務(wù)器啟動(dòng)時(shí)ssl設(shè)置是打開的,具體內(nèi)容可見這里。

hostnossl

這個(gè)和上面的hostssl相反,只匹配通過在TCP/IP上進(jìn)行的非SSL聯(lián)接企圖。

數(shù)據(jù)庫(database)

聲明記錄所匹配的數(shù)據(jù)庫。

值 all 表明該記錄匹配所有數(shù)據(jù)庫;

值 sameuser表示如果被請(qǐng)求的數(shù)據(jù)庫和請(qǐng)求的用戶同名,則匹配;

值samegroup 表示請(qǐng)求的用戶必須是一個(gè)與數(shù)據(jù)庫同名的組中的成員;

值 replication 表示匹配一條replication連接,它不指定一個(gè)特定的數(shù)據(jù)庫,一般在流復(fù)制中使用;

在其他情況里,這就是一個(gè)特定的 PostgreSQL 數(shù)據(jù)庫的名字。 我們可以通過用逗號(hào)分隔的方法聲明多個(gè)數(shù)據(jù)庫。 一個(gè)包含數(shù)據(jù)庫名的文件可以通過對(duì)該文件前綴 @ 來聲明.該文件必需和 pg_hba.conf 在同一個(gè)目錄。

用戶名(user)

為這條記錄聲明所匹配的 PostgreSQL 用戶,值 all 表明它匹配 于所有用戶。否則,它就是特定 PostgreSQL 用戶的名字,多個(gè)用戶名可以通過用逗號(hào)分隔的方法聲明,在名字前面加上+代表匹配該用戶組的所有用戶。一個(gè)包含用戶名的文件可以 通過在文件名前面前綴 @ 來聲明,該文件必需和 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地址來說, 172.20.143.89/32指定單個(gè)主機(jī)的IP,172.20.143.0/24代表一個(gè)小的子網(wǎng)。對(duì)于IPv6地址來說,::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)來匹配所有的IP地址,使用 samehost 匹配服務(wù)器自己所有的IP地址,samenet來匹配服務(wù)器直接接入的子網(wǎng)。

如果指定的是主機(jī)名(既不是IP地址也不是上面提到的選項(xiàng)),這個(gè)主機(jī)名將會(huì)和發(fā)起連接請(qǐng)求的客戶端的IP地址的反向名稱解析結(jié)果(即通過客戶端的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ù)庫允許將一個(gè)IP地址和多個(gè)主機(jī)名綁定,但是在解析IP地址時(shí),操作系統(tǒng)只會(huì)返回一個(gè)主機(jī)名)。

有些主機(jī)名以點(diǎn)(.)開頭,匹配那些具有相同后綴的主機(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

無條件地允許聯(lián)接,這個(gè)方法允許任何可以與PostgreSQL 數(shù)據(jù)庫聯(lián)接的用戶以他們期望的任意 PostgreSQL 數(shù)據(jù)庫用戶身份進(jìn)行聯(lián)接,而不需要口令。

reject

聯(lián)接無條件拒絕,常用于從一個(gè)組中"過濾"某些主機(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ù)庫名,這只適用于本地連接。

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)來認(rèn)證。

認(rèn)證配置(authentication-option)

這個(gè)可選的字段的含義取決與選擇的認(rèn)證方法。手冊(cè)上也沒有具體的說明,但是給出了如下的例子供參考。

# 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         md5

關(guān)于怎么在PostgreSQL中利用pg_hba.conf實(shí)現(xiàn)一個(gè)客戶端認(rèn)證功能問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI