連線資料庫失敗提示hba.conf不符合的處理方法

瀚高PG實驗室發表於2022-05-10
環境
系統平臺: N/A
版本: 6.0,5.6.5,5.6.4,5.6.3,5.6.1,4.5.2,4.5,4.3.4.9,4.3.4.8,4.3.4.7,4.3.4.6,4.3.4.5,4.3.4.4,4.3.4.3,4.3.4.2,4.3.4,4.7.8,4.7.7,4.7.6,4.7.5,4.3.2,4.1.1
詳細資訊

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 配置格式

  • 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 連線。


  • pg_hba.conf檔案 7 種配置

#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各列釋義:

  • 第一列(request_mode)

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連線。

  • 第二列(db_name)

database:指定要訪問的資料庫sameuser表示如果請求的資料庫名與角色名相同則匹配。replication表示允許replication連線請求,此時不指定任何特定的資料庫。可以用逗號分隔來指定多個資料庫,值 all 匹配所有的資料庫。

  • 第三列(db_role)

user:指定訪問資料庫使用的資料庫角色名,值 all 匹配所有存在的資料庫角色。

  • 第四列(address)

IP-address:宣告這條記錄匹配的客戶端機器的地址。可以是主機名或者ip地址。ip地址可以以常用的兩種方式指定。0.0.0.0/0代表全部IPv4地址,::/0代表全部IPv6地址。

  • 第五列(mask)

IP-mask:這兩個域可以被用作IP-address / mask-length記號法的替代方案。和指定掩碼長度不同,實際的掩碼被指定在一個單獨的列中。例如,255.0.0.0表示 IPv4 CIDR 掩碼長度 8,而255.255.255.255表示 CIDR 掩碼長度 32。這些域只適用於host、hostssl和hostnossl記錄。

  • 第六列(method:auth-method)

trust:無條件的允許連線。這個方法允許任何人用任意一個使用者登入到資料庫。

md5:要求客戶端提供一個MD5加密的口令進行認證。

password:要求客戶提供一個未加密的密碼進行身份驗證,不安全。

ident:使用ident伺服器認證使用者。

ldap:用LDAP伺服器進行認證

sm3:執行 sm3 認證來驗證使用者的口令。sm3 演算法是國家密碼演算法的一種雜湊演算法,在使用者認證過程中,和 md5 的過程一致,但是演算法的安全度比 md5 安全的多,並且 sm3 演算法自主可控,當然,sm3 也是以雜湊值的形式存在於資料庫的使用者表

pam:使用PAM認證。

reject:無條件地拒絕連線。這有助於從一個組中“過濾出”特定主機,例如一個reject行可以阻塞一個特定的主機連線,而後面一行允許一個特定網路中的其餘主機進行連線。

  • 第七列(options)

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
  • 本地UNIX-域套接字記錄的格式:

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

處理方法

你試圖連線的資料庫不存在。請注意如果你沒有宣告資料庫名。




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69994931/viewspace-2893308/,如需轉載,請註明出處,否則將追究法律責任。

相關文章