目錄
文件格式
?連接類型(TYPE)
數(shù)據(jù)庫(database)
用戶(user)
連接地址(address)
格式
IPv4
IPv6
字符
主機名
主機名后綴
IP-address/IP-mask
auth-method
trust
reject
scram-sha-256
md5
password
gss
sspi
ident
peer
ldap
radius
cert
pam
bsd
auth-options
示例
用戶在連接到PG數(shù)據(jù)庫之前首先要經(jīng)過文件的驗證,可以理解為建立連接之前的白名單或者客戶端認證
客戶端認證是由一個配置文件(通常名為pg_hba.conf
并被存放在數(shù)據(jù)庫集簇目錄中)控制(HBA表示基于主機的認證)。在initdb
初始化數(shù)據(jù)目錄時,它會安裝一個默認的pg_hba.conf
文件。不過我們也可以把認證配置文件放在其它地方; 參閱hba_file配置參數(shù)。
文件格式
pg_hba.conf
文件的常用格式是一組記錄,每行一條。空白行將被忽略,?#
注釋字符后面的任何文本也被忽略。記錄不能跨行。一條記錄由若干用空格 和/或制表符分隔的域組成。如果域值用雙引號包圍,那么它可以包含空白。在數(shù)據(jù)庫、用戶或地址域中 引用一個關鍵字(例如,all
或replication
)將使該詞失去其特殊 含義,并且只是匹配一個有該名字的數(shù)據(jù)庫、用戶或主機。
每條記錄指定一種連接類型、一個客戶端 IP 地址范圍(如果和連接類型相關)、一個數(shù)據(jù)庫名、一個用戶名以及對匹配這些參數(shù)的連接使用的認證方法。第一條匹配連接類型、客戶端地址、連接請求的數(shù)據(jù)庫和用戶名的記錄將被用于執(zhí)行認證。這個過程沒有“落空”或者“后備”的說法:如果選擇了一條記錄而且認證失敗,那么將不再考慮后面的記錄。如果沒有匹配的記錄,那么訪問將被拒絕。
?連接類型(TYPE)
第一個字段是客戶端連接server的類型,分為:
值 | 含義 |
local | 這條記錄匹配企圖使用 Unix 域套接字的連接。 如果沒有這種類型的記錄,就不允許 Unix 域套接字連接。 |
host | 這條記錄匹配企圖使用 TCP/IP 建立的連接。? |
hostssl | 這條記錄匹配企圖使用 TCP/IP 建立的連接,但必須是使用SSL加密的連接。 要使用這個選項,編譯服務器的時候必須打開SSL支持。此外,在服務器啟動的時候必須通過設置ssl配置參數(shù)(詳見第?18.9?節(jié))打開SSL。否則, |
hostnossl | 這條記錄的行為與 |
hostnogssenc |
這條記錄匹配企圖使用TCP/IP建立的連接,但僅當使用GSSAPI加密建立連接時。 要使用這個選項,服務器必須具備GSSAPI支持。 否則,除了記錄無法匹配任何連接的警告以外, 注意使用GSSAPI加密時能夠支持的authentication methods?包括? |
|
這個記錄類型具有與 |
數(shù)據(jù)庫(database)
指定記錄所匹配的數(shù)據(jù)庫名稱。
-
值
all
指定該記錄匹配所有數(shù)據(jù)庫。 - 值
sameuser
指定如果被請求的數(shù)據(jù)庫和請求的用戶同名,則匹配。 - 值
samerole
指定請求的用戶必須是一個與數(shù)據(jù)庫同名的角色中的成員(samegroup
是一個已經(jīng)廢棄了,但目前仍然被接受的samerole
同義詞)。 對于一個用于samerole
目的的角色,超級用戶不會被考慮為其中的成員,除非它們是該角色的顯式成員(直接或間接),而不是由于超級用戶的原因。 - 值
replication
指定如果一個物理復制連接被請求則該記錄匹配(注意復制連接不指定任何特定的數(shù)據(jù)庫)。 - 在其它情況里,這就是一個特定的PostgreSQL數(shù)據(jù)庫名字。 可以通過用逗號分隔的方法指定多個數(shù)據(jù)庫,也可以通過在文件名前面放
@
來指定一個包含數(shù)據(jù)庫名的文件。
用戶(user)
指定這條記錄匹配哪些數(shù)據(jù)庫用戶名。
值all
指定它匹配所有用戶。 否則,它要么是一個特定數(shù)據(jù)庫用戶的名字或者是一個有前導+
的組名稱(回想一下,在PostgreSQL里,用戶和組沒有真正的區(qū)別,+
實際表示“匹配這個角色的任何直接或間接成員角色”,而沒有+
記號的名字只匹配指定的角色)。 出于這個目的,如果超級用戶顯式的是一個角色的成員(直接或間接),那么超級用戶將只被認為是該角色的一個成員而不是作為一個超級用戶。 多個用戶名可以通過用逗號分隔的方法提供。一個包含用戶名的文件可以通過在文件名前面加上@
來指定。
連接地址(address)
指定這個記錄匹配的客戶端機器地址。這個域可以包含一個主機名、一個 IP 地址范圍或下文提到的特殊關鍵字之一。
格式
一個 IP 地址范圍以該范圍的開始地址的標準數(shù)字記號指定,然后是一個斜線(/
) 和一個CIDR掩碼長度。掩碼長度表示客戶端 IP 地址必須匹配的高序二進制位位數(shù)。 在給出的 IP 地址中,這個長度的右邊的二進制位必須為零。 在 IP 地址、/
和 CIDR 掩碼長度之間不能有空白。
IPv4
這種方法指定一個 IPv4 地址范圍的典型例子是:?172.20.143.89/32
用于一個主機,?172.20.143.0/24
用于一個小型網(wǎng)絡,?10.6.0.0/16
用于一個大型網(wǎng)絡。
IPv6
一個單主機的 IPv6 地址范圍看起來像這樣:::1/128
(IPv6 回環(huán)地址), 一個小型網(wǎng)絡的 IPv6 地址范圍則類似于:fe80::7a31:c1ff:0000:0000/96
。?
0.0.0.0/0
表示所有 IPv4 地址,并且::0/0
表示所有 IPv6 地址。 要指定一個單一主機,IPv4 用一個長度為 32 的 CIDR 掩碼或者 IPv6 用長度為 128 的 CIDR 掩碼。在一個網(wǎng)絡地址中,不要省略結(jié)尾的零。
一個以 IPv4 格式給出的項將只匹配 IPv4 連接并且一個以 IPv6 格式給出的項將只匹配 IPv6 連接,即使對應的地址在 IPv4-in-IPv6 范圍內(nèi)。 請注意如果系統(tǒng)的 C 庫不支持 IPv6 地址,那么 IPv6 格式中的項將被拒絕。
字符
- 你也可以寫
all
來匹配任何 IP 地址、 - 寫
samehost
來匹配任何本服務器自身的 IP 地址或者 - 寫
samenet
來匹配本服務器直接連接到的任意子網(wǎng)的任意地址。
主機名
若果指定了一個主機名(任何除 IP 地址單位或特殊關鍵字之外的都被作為主機名處理), 該名稱會與客戶端的 IP 地址的反向名字解析(例如使用 DNS 時的反向 DNS 查找)結(jié)果進行比較。 主機名比較是大小寫敏感的。如果匹配上,那么將在主機名上執(zhí)行一次正向名字解析(例如正向 DNS 查找)來檢查它解析到的任何地址是否等于客戶端的 IP 地址。如果兩個方向都匹配,則該項被認為匹配(pg_hba.conf
中使用的主機名應該是客戶端 IP 地址的地址到名字解析返回的結(jié)果,否則該行將不會匹配。某些主機名數(shù)據(jù)庫允許將一個 IP 地址關聯(lián)多個主機名,但是當被要求解析一個 IP 地址時,操作系統(tǒng)將只返回一個主機名)。
主機名后綴
一個以點號(.
)開始的主機名聲明匹配實際主機名的后綴。 因此.example.com
將匹配foo.example.com
(但不匹配example.com
)。
當主機名在pg_hba.conf
中被指定時,你應該保證名字解析很快。 建立一個類似nscd
的本地名字解析緩存是一種不錯的選擇。 另外,你可能希望啟用配置參數(shù)log_hostname
來在日志中查看客戶端的主機名而不是 IP 地址。
這個域不適用于local
記錄。
IP-address/IP-mask
這兩個域可以被用作IP-address
/
?mask-length
記號法的替代方案。和指定掩碼長度不同,實際的掩碼被指 定在一個單獨的列中。例如,255.0.0.0
表示 IPv4 CIDR 掩碼長度 8,而255.255.255.255
表示 CIDR 掩碼長度 32。
這些域不適用于local
記錄。
auth-method
指定當一個連接匹配這個記錄時,要使用的認證方法。下面對可能的選擇做了概述,詳見第?20.3?節(jié)。
trust
無條件地允許連接。這種方法允許任何可以與PostgreSQL數(shù)據(jù)庫服務器連接的用戶以他們期望的任意PostgreSQL數(shù)據(jù)庫用戶身份登入,而不需要口令或者其他任何認證。詳見第?20.4?節(jié)。
reject
無條件地拒絕連接。這有助于從一個組中“過濾出”特定主機,例如一個reject
行可以阻塞一個特定的主機連接,而后面一行允許一個特定網(wǎng)絡中的其余主機進行連接。
scram-sha-256
執(zhí)行SCRAM-SHA-256認證來驗證用戶的口令。詳見第?20.5?節(jié)。
md5
執(zhí)行SCRAM-SHA-256或MD5認證來驗證用戶的口令。詳見第?20.5?節(jié)。
password
要求客戶端提供一個未加密的口令進行認證。因為口令是以明文形式在網(wǎng)絡上發(fā)送的,所以我們不應該在不可信的網(wǎng)絡上使用這種方式。詳見第?20.5?節(jié)。
gss
用 GSSAPI 認證用戶。只對 TCP/IP 連接可用。詳見第?20.6?節(jié),它可以與 GSSAPI 加密一起結(jié)合使用。
sspi
用 SSPI 來認證用戶。只在 Windows 上可用。詳見第?20.7?節(jié)。
ident
通過聯(lián)系客戶端的 ident 服務器獲取客戶端的操作系統(tǒng)名,并且檢查它是否匹配被請求的數(shù)據(jù)庫用戶名。Ident 認證只能在 TCIP/IP 連接上使用。當為本地連接指定這種認證方式時,將用 peer 認證來替代。詳見第?20.8?節(jié)。
peer
從操作系統(tǒng)獲得客戶端的操作系統(tǒng)用戶,并且檢查它是否匹配被請求的數(shù)據(jù)庫用戶名。這只對本地連接可用。詳見第?20.9?節(jié)。
ldap
使用LDAP服務器認證。詳見第?20.10?節(jié)。
radius
用 RADIUS 服務器認證。詳見第?20.11?節(jié)。
cert
使用 SSL 客戶端證書認證。詳見第?20.12?節(jié)。
pam
使用操作系統(tǒng)提供的可插入認證模塊服務(PAM)認證。詳見第?20.13?節(jié)。
bsd
使用由操作系統(tǒng)提供的 BSD 認證服務進行認證。詳見第?20.14?節(jié)。
auth-options
在auth-method
域的后面, 可以是形如name
=
value
的域,它們指定認證方法的選項。 關于哪些認證方法可以用哪些選項的細節(jié)請見下文。文章來源:http://www.zghlxwxcb.cn/news/detail-717766.html
除了下文列出的與方法相關的選項之外,還有一個與方法無關的認證選項clientcert
,它可以在任何hostssl
記錄中指定。 這個選項可以被設置到verify-ca
或verify-full
. 這兩個選項都需要客戶端提供有效的(受信任的)SSL證書,并且verify-full
額外強制證書中的cn
(通用名稱)匹配用戶名或適用的映射。 這種行為類似于cert
認證方法 (參見?第?20.12?節(jié)), 但是允許客戶端證書的驗證與任何支持hostssl
登記的認證方法相搭配。文章來源地址http://www.zghlxwxcb.cn/news/detail-717766.html
示例
# 允許本地系統(tǒng)上的任何用戶
# 通過 Unix 域套接字以任意
# 數(shù)據(jù)庫用戶名連接到任意數(shù)據(jù)庫(本地連接的默認值)。
#
# TYPE DATABASE USER ADDRESS METHOD
local all all trust
# 相同的規(guī)則,但是使用本地環(huán)回 TCP/IP 連接。
#
# TYPE DATABASE USER 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
# IPv6 上相同的規(guī)則
#
# TYPE DATABASE USER ADDRESS METHOD
host all all ::1/128 trust
# 使用主機名的相同規(guī)則(通常同時覆蓋 IPv4 和 IPv6)。
#
# TYPE DATABASE USER ADDRESS METHOD
host all all localhost trust
# 允許來自任意具有 IP 地址192.168.93.x 的主機上任意
# 用戶以 ident 為該連接所報告的相同用戶名連接到
# 數(shù)據(jù)庫 "postgres"(通常是操作系統(tǒng)用戶名)。
#
# TYPE DATABASE USER ADDRESS METHOD
host postgres all 192.168.93.0/24 ident
# 如果用戶的口令被正確提供,允許來自主機 192.168.12.10
# 的任意用戶連接到數(shù)據(jù)庫 "postgres"。
#
# TYPE DATABASE USER ADDRESS METHOD
host postgres all 192.168.12.10/32 scram-sha-256
# 如果用戶的口令被正確提供,允許 example.com 中主機上
# 的任意用戶連接到任意數(shù)據(jù)庫。
#
# 為大部分用戶要求SCRAM認證,但是用戶'mike'是個例外,
# 他使用的是不支持SCRAM認證的舊客戶端。
#
# TYPE DATABASE USER ADDRESS METHOD
host all mike .example.com md5
host all all .example.com scram-sha-256
# 如果沒有前面的 "host" 行,這三行
# 將拒絕所有來自 192.168.54.1的連接(因為那些項將首先被匹配),
# 但是允許來自互聯(lián)網(wǎng)其他任何地方的
# GSSAPI-encrypted連接。零掩碼導致主機IP 地址中的所有位都不會被考慮,
# 因此它匹配任意主機。未加密GSSAPI連接
# (which "跳轉(zhuǎn)"到第三行是因為"hostgssenc" 僅匹配加密的 GSSAPI 連接) 是被允許的,但只能來自192.168.12.10.
#
# TYPE DATABASE USER ADDRESS METHOD
host all all 192.168.54.1/32 reject
hostgssenc all all 0.0.0.0/0 gss
host all all 192.168.12.10/32 gss
# 允許來自 192.168.x.x 主機的用戶連接到任意數(shù)據(jù)庫,如果它們能夠
# 通過 ident 檢查。例如,假設 ident說用戶是 "bryanh" 并且他要求以
# PostgreSQL 用戶 "guest1" 連接,如果在 pg_ident.conf 有一個映射
# "omicron" 的選項說 "bryanh" 被允許以 "guest1" 連接,則該連接將被允許。
#
# TYPE DATABASE USER ADDRESS METHOD
host all all 192.168.0.0/16 ident map=omicron
# 如果這些是本地連接的唯一三行,它們將允許本地用戶只連接到它們
# 自己的數(shù)據(jù)庫(與其數(shù)據(jù)庫用戶名同名的數(shù)據(jù)庫),不過管理員和角
# 色 "support" 的成員除外(它們可以連接到所有數(shù)據(jù)庫)。文件
# $PGDATA/admins 包含一個管理員名字的列表。在所有情況下都要求口令。
#
# TYPE DATABASE USER 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
到了這里,關于【PG】PostgreSQL客戶端認證pg_hba.conf文件的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!