1. 客戶端認證檔案介紹
客戶端認證是由一個配置檔案(通常名為 pg_hba.conf 並被存放在資料庫集簇目錄中,HBA 表示基於主機的認證)控制。在 initdb 初始化資料目錄時,會在 $PGDATA 下生成 pg_hba.conf 檔案。我們也可以把認證配置檔案放在其它地方。
pg_hba.conf 檔案的常用格式是一組記錄,每行一條。空白行將被忽略, “#” 註釋字元後面的任何文字也被忽略。記錄不能跨行。一條記錄由若干用空格 或製表符分隔的域組成。如果域值用雙引號包圍,那麼它可以包含空。在資料庫、使用者或地址域中引用一個關鍵字(例如 all 或 replication)將使該詞失去其特殊含義,將會只匹配一個有該名字的資料庫、使用者或主機。每條記錄指定一種連線型別、一個客戶端 IP 地址範圍(如果和連線型別相關)、一個資料庫名、一個使用者名稱以及對匹配這些引數的連線所使用的認證方法。第一條匹配連線型別、客戶端地址、連線請求的資料庫和使用者名稱的記錄將被用於執行認證。這個過程沒有“落空”或者“後備”的說法:如果選擇了一條記錄而且認證失敗,那麼將不再考慮後面的記錄。如果沒有匹配的記錄,那麼訪問將被拒絕。
無論客戶端以何種方式來登入資料庫,都要有一個客戶端可以訪問的資料庫使用者或叫角色存在。如果是本地認證,則伺服器會驗證發起請求的客戶端的系統使用者名稱,系統使用者名稱可能與資料庫角色相同,也可能不同。
注意事項:
1) “#” 號註釋會忽略後面的文字。
2) pg_hba.conf中的連線配置記錄不能跨行。
3) 一個客戶端請求只會匹配pg_hba.conf中與連線型別,資料庫,資料庫使用者和地址等資訊匹配的第一行,無論登入成功或者失敗都不會再去匹配其他行。
4) pg_hba.conf讀取順序是從上往下,來讀取第一個符合條件的記錄。
2. pg_hba.conf配置說明
2.1 pg_hba.conf 配置格式
1)允許本地系統上的任何使用者通過 Unix 域套接字以任意資料庫使用者名稱連線到任意資料庫(本地連線的預設值)。
[root@hgv4 data]# ls -l $PGDATA/pg_hba.conf
-rw------- 1 root root 4298 10月 21 11:39 /opt/HighGo4.5.2-see/data/pg_hba.conf
|
2)任意資料庫使用者名稱連線到任意資料庫,使用本地環回 TCP/IP 連線。
#request_mode db_name db_role address mask method options
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] |
2.2 pg_hba.conf各列釋義:
local:匹配使用 Unix 域套接字(unix domain socket)的連線。 如果沒有這種型別的記錄,則不允許 Unix 域套接字連線。
host:匹配使用 TCP/IP 建立的連線。 host記錄匹配SSL和非SSL的連線嘗試, 此外還有GSSAPI 加密的或non-GSSAPI 加密的連線嘗試。
hostssl:匹配使用 TCP/IP 建立的連線,但必須是使用SSL加密的連線。要使用這個選項,編譯伺服器的時候必須開啟SSL支援。此外,在伺服器啟動的時候通過將postgresql.conf中的ssl 設定為on,開啟的SSL支援。否則,hostssl記錄會被忽略,並且會記錄一個警告說它無法匹配任何連線。
hostnossl:這條記錄的行為與hostssl相反;它只匹配那些在 TCP/IP上不使用SSL的連線。
host/hostssl/hostnossl總結: 認證方法通過TCP/IP連線,帶有ssl字尾的認證方式使用SSL連線,帶有nossl字尾的認證方式不使用SSL連線。
database:指定要訪問的資料庫sameuser表示如果請求的資料庫名與角色名相同則匹配。replication表示允許replication連線請求,此時不指定任何特定的資料庫。可以用逗號分隔來指定多個資料庫,值 all 匹配所有的資料庫。
user:指定訪問資料庫使用的資料庫角色名,值 all 匹配所有存在的資料庫角色。
IP-address:宣告這條記錄匹配的客戶端機器的地址。可以是主機名或者ip地址。ip地址可以以常用的兩種方式指定。0.0.0.0/0代表全部IPv4地址,::/0代表全部IPv6地址。
IP-mask:這兩個域可以被用作IP-address / mask-length記號法的替代方案。和指定掩碼長度不同,實際的掩碼被指定在一個單獨的列中。例如,255.0.0.0表示 IPv4 CIDR 掩碼長度 8,而255.255.255.255表示 CIDR 掩碼長度 32。這些域只適用於host、hostssl和hostnossl記錄。
trust:無條件的允許連線。這個方法允許任何人用任意一個使用者登入到資料庫。
md5:要求客戶端提供一個MD5加密的口令進行認證。
password:要求客戶提供一個未加密的密碼進行身份驗證,不安全。
ident:使用ident伺服器認證使用者。
ldap:用LDAP伺服器進行認證
sm3:執行 sm3 認證來驗證使用者的口令。sm3 演算法是國家密碼演算法的一種雜湊演算法,在使用者認證過程中,和 md5 的過程一致,但是演算法的安全度比 md5 安全的多,並且 sm3 演算法自主可控,當然,sm3 也是以雜湊值的形式存在於資料庫的使用者表
pam:使用PAM認證。
reject:無條件地拒絕連線。這有助於從一個組中“過濾出”特定主機,例如一個reject行可以阻塞一個特定的主機連線,而後面一行允許一個特定網路中的其餘主機進行連線。
auth-options :以name=value的形式為這些認證方法指定一些選項。比較常用的是指定使用者名稱對映,格式為map=map-name,map-name指定pg_ident.conf檔案中的一條命名使用者名稱對映記錄。此列一般極少配置。
2.3 pg_hba.conf 配置示例
說明:pg_hba.conf配置格式,我們可以簡化為以下兩種方式:
host database role address auth-method |
local database role auth-method |
1)允許本地系統上的任何使用者通過 Unix 域套接字以任意資料庫使用者名稱連線到任意資料庫(本地連線的預設值)。
# TYPE DATABASE USER ADDRESS METHOD
local all all trust |
2)任意資料庫使用者名稱連線到任意資料庫,使用本地環回 TCP/IP 連線。
# TYPE DATABASE USER ADDRESS METHOD
host all all 127.0.0.1/32 trust |
3)任意資料庫使用者名稱連線到任意資料庫,使用獨立的掩碼列
# TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD
host all all 127.0.0.1 255.255.255.255 trust |
4. 任意資料庫使用者名稱連線到任意資料庫,IPv6 上相同的規則
# TYPE DATABASE USER ADDRESS METHOD
host all all ::1/128 trust |
5. 任意資料庫使用者名稱連線到任意資料庫,使用主機名的相同規則(通常同時覆蓋 IPv4 和 IPv6)。
# TYPE DATABASE USER ADDRESS METHOD
host all all localhost trust |
6. 允許來自任意具有 IP 地址192.168.93.x 的主機上任意使用者以 ident 為該連線所報告的相同使用者名稱連線到資料庫 "highgo"。
# TYPE DATABASE USER ADDRESS METHOD
host highgo all 192.168.93.0/24 ident |
7. 如果使用者的口令被正確提供,允許來自主機 192.168.12.10 的任意使用者連線到資料庫 "highgo"
# TYPE DATABASE USER ADDRESS METHOD
host highgo all 192.168.12.10/32 md5 |
8. 如果沒有前面的 "host" 行,這兩行表示將拒絕所有來自 192.168.54.1的連線(因為那些項將首先被匹配),允許來自網路中其他任何地方的 md5 口令方式的認證連線,零掩碼匹配任意主機。
# TYPE DATABASE USER ADDRESS METHOD
host all all 192.168.54.1/32 reject
host all all 0.0.0.0/0 md5 |
9. 無條件的允許來自網路中其他任何地方的 md5 口令方式的認證連線。
# TYPE DATABASE USER ADDRESS METHOD
host all all 0.0.0.0/0 md5 |
2.4 配置注意事項:
1)資料庫名與使用者名稱注意大小寫。
2)address(使用者的IP範圍)的值的格式是:IP/數值
數值取值範圍為:0,8,16,24,32 即表示掩碼bit的個數。例:
32 -> 192.168.1.1/32 表示必須是來自這個IP地址的訪問才合法。
24 -> 192.168.1.0/24 表示只要來自192.168.1.0 ~ 192.168.1.255的都合法。
16 -> 192.168.0.0/16 表示只要來自192.168.0.0 ~ 192.168.255.255的都合法。
8 -> 192.0.0.0/16 表示只要來自192.0.0.0 ~ 192.255.255.255的都合法。
0 -> 0.0.0.0/0 表示全部IP地址都合法,/左邊的IP地址隨便了只要是合法的IP地址即可。 |
3)完成上面兩個配置檔案的修改以後,為了讓配置生效,需要重新啟動或 reload 資料庫服務。
4)要考慮下是否要支援ssl 協議,在需要的時候新增新增ssl 選項。
3. 常見問題處理方法
3.1 無法連線到伺服器:不支援 13 認證方式
psql -U syssso -d highgo -p 5866 -h 192.168.0.131
psql: 錯誤: 無法連線到伺服器:不支援 13 認證方式.
處理方法:
1)如果資料庫預設使用 sm3 (highgodb安全版中的認證方式) 身份驗證演算法,需要改為 md5,步驟如下:
2)修改 postgresql.conf 檔案 password_encryption 引數由 sm3 修改為 md5
3)重啟資料庫 pg_ctl restart
4)sysdba 登陸,修改密碼為 1qaz!QAZ;syssao、syssso 及其他使用者同理。
5)修改 pg_hba 檔案加密方式改為 md5
6)重啟資料庫 pg_ctl restart
7)登入資料庫,輸入密碼 1qaz!QAZ 進行驗證。
說明:密碼可根據自己的環境進行修改。 |
3.2 FATAL: no pg_hba.conf entry for host "123.123.123.123", user "andym", database "testdb"
處理方法:
表示已和伺服器進行通訊,但伺服器拒絕了連線請求,沒有在其 pg_hba.conf 配置檔案裡找到匹配項,需要在pg——hba.conf中新增匹配選項。 |
3.3 FATAL: password authentication failed for user "andym"
處理方法:
這樣的訊息表示已和伺服器進行通訊,但是必須通過pg_hba.conf檔案中指定的認證方法。檢查你提供的口令,認證型別。 |
3.4 FATAL: user "andym" does not exist
處理方法:
指示的資料庫使用者沒有被找到,需檢查資料庫名稱是否正確。 |
3.5 FATAL: database "testdb" does not exist
處理方法:
你試圖連線的資料庫不存在。請注意如果你沒有宣告資料庫名。 |