openGauss資料庫客戶端接入認證詳解

語言: CN / TW / HK

目錄

前言

認證方式

配置檔案解析

示例

引數解釋

如何配置

常見錯誤


前言

日常生活工作中,我們經常遇到需要接入認證的場景,如登入網站、伺服器或連線wifi、vpn等等。當一個客戶端應用連線一個數據庫伺服器時,比如使用各種JDBC/ODBC進行資料訪問或者資料庫遷移場景或從伺服器本機使用gsql連線等,會需要指定以哪個資料庫使用者名稱連線。認證是資料庫伺服器建立客戶端身份的過程,並且伺服器決定客戶端應用(或者執行客戶端應用的使用者)是否被允許以請求的資料庫使用者名稱來連線。比如下面一個簡單的jdbc變數例子:

DB_URL = "jdbc:postgresql://192.168.x.x:26000/demo";

USER = "dbuser";

PASS = "Gauss#xxxxx";

認證方式介紹

openGauss提供多種不同的客戶端認證方式。

  1. 基於主機的認證:伺服器端根據客戶端的IP地址、使用者名稱及要訪問的資料庫來檢視配置檔案從而判斷使用者是否通過認證。主機鑑權允許主機鑑權部分或全部系統使用者。適用於系統所有使用者或者使用Match指令的子集。
  2. 口令認證:包括遠端連線的加密口令認證和本地連線的非加密口令認證。使用帳號和口令登入到遠端主機。所有傳輸的資料都會被加密,但是不能保證正在連線的伺服器就是需要連線的伺服器。可能會有其他伺服器冒充真正的伺服器,也就是受到“中間人”方式的攻擊。
  3. SSL加密:使用OpenSSL(開源安全通訊庫)提供伺服器端和客戶端安全連線的環境。使用者必須為自己建立一對金鑰,並把公用金鑰放在需要訪問的伺服器上。這種級別的認證不僅加密所有傳送的資料,而且避免“中間人”攻擊方式。但是整個登入的過程可能需要10秒。

以上三種認證方式都需要配置“pg_hba.conf”檔案。資料庫安裝後會自動生成預設的這個配置檔案一般安裝在$GAUSSHOME/data目錄下,下面我們在介紹一下這個關鍵的配置檔案。

配置檔案解析

客戶端認證是由一個配置檔案pg_hba.conf控制,其中的hba即為host-based authentication縮寫,表示基於主機的認證)。可對IPV4、IPV6 和replication privilege(邏輯複製相關,比如從openGauss遷移資料到其他資料庫)的客戶端接入進行設定.

示例

TYPE  DATABASE        USER            ADDRESS                 METHOD



"local" is for Unix domain socket connections only

#表示只允許以安裝時-U引數指定的使用者從伺服器本機進行連線。

local   all             all                                     trust

IPv4 local connections:

#表示允許jack使用者從10.10.0.50主機上連線到任意資料庫,使用sha256演算法對密碼進行加密。

host    all           jack             10.10.0.50/32            sha256

#表示允許任何使用者從10.10.0.0/24網段的主機上連線到任意資料庫,使用sha256演算法對密碼進行加密,並且經過SSL加密傳輸。

hostssl    all         all             10.10.0.0/24            sha256

pg_hba.conf檔案的常用格式是一組記錄,每行一條。記錄不能跨行。每條記錄指定一種連線型別、一個客戶端 IP 地址範圍(如果和連線型別相關)、一個數據庫名、一個使用者名稱以及對匹配這些引數的連線使用的認證方法。

一條記錄由若干用空格 和/或製表符分隔的域組成。如果域值用雙引號包圍,那麼它可以包含空白。

在資料庫、使用者或地址域中 引用一個關鍵字(例如,all或replication)將使該詞失去其特殊 含義,並且只是匹配一個有該名字的資料庫、使用者或主機。

第一條匹配連線型別、客戶端地址、連線請求的資料庫和使用者名稱的記錄將被用於執行認證。這個過程沒有“落空”或者“後備”的說法:如果選擇了一條記錄而且認證失敗,那麼將不再考慮後面的記錄。如果沒有匹配的記錄,那麼訪問將被拒絕。

引數解釋

下面兩個表對配置引數進行說明。

表 1 引數說明

引數名稱

描述

取值範圍

local

表示這條記錄只接受通過Unix域套接字進行的連線。沒有這種型別的記錄,就不允許Unix域套接字的連線。

只有在從伺服器本機使用gsql連線且在不指定-h引數的情況下,才是通過Unix域套接字連線。

-

host

表示這條記錄既接受一個普通的TCP/IP套接字連線,也接受一個經過SSL加密的TCP/IP套接字連線。

-

hostssl

表示這條記錄只接受一個經過SSL加密的TCP/IP套接字連線。

用SSL進行安全的連線,需要配置申請數字證書並配置相關引數,詳細資訊請參見產品文件用SSL進行安全的TCP/IP連線

hostnossl

表示這條記錄只接受一個普通的TCP/IP套接字連線。

-

DATABASE

宣告記錄所匹配且允許訪問的資料庫。

  • all:表示該記錄匹配所有資料庫。
  • sameuser:表示如果請求訪問的資料庫和請求的使用者同名,則匹配。
  • samerole:表示請求的使用者必須是與資料庫同名角色中的成員。
  • samegroup:與samerole作用完全一致,表示請求的使用者必須是與資料庫同名角色中的成員。
  • 一個包含資料庫名的檔案或者檔案中的資料庫列表:檔案可以通過在檔名前面加字首@來宣告。檔案中的資料庫列表以逗號或者換行符分隔。
  • 特定的資料庫名稱或者用逗號分隔的資料庫列表。

值replication表示如果請求一個複製連結,則匹配,但複製連結不表示任何特定的資料庫。如需使用名為replication的資料庫,需在database列使用記錄“replication”作為資料庫名。

USER

宣告記錄所匹配且允許訪問的資料庫使用者。

  • all:表明該記錄匹配所有使用者。
  • +使用者角色:表示匹配任何直接或者間接屬於這個角色的成員。

+表示字首符號。

  • 一個包含使用者名稱的檔案或者檔案中的使用者列表:檔案可以通過在檔名前面加字首@來宣告。檔案中的使用者列表以逗號或者換行符分隔。
  • 特定的資料庫使用者名稱或者用逗號分隔的使用者列表。

ADDRESS

指定與記錄匹配且允許訪問的IP地址範圍。

支援IPv4和IPv6,可以使用如下兩種形式來表示:

  • IP地址/掩碼長度。例如,10.10.0.0/24
  • IP地址子網掩碼。例如,10.10.0.0 255.255.255.0

以IPv4格式給出的IP地址會匹配那些擁有對應地址的IPv6連線,比如127.0.0.1將匹配IPv6地址 ::ffff:127.0.0.1。

典型例子: ​​172.20.143.89/32​​​用於一個主機,​​172.20.143.0/24​​​用於一個小型網路, 10.6.0.0/16用於一個大型網路。 0.0.0.0/0表示所有 IPv4 地址,並且::0/0表示所有 IPv6 地址。要指定一個單一主機,IPv4 用一個長度為 32 的 CIDR掩碼或者 IPv6 用 長度為 128 的 CIDR 掩碼。在一個網路地址中,不要省略結尾的零。

METHOD

宣告連線時使用的認證方法。

本產品支援如下幾種認證方式,詳細解釋請參見表2。

trustrejectmd5sha256、sm3、cert、gss

表 2 認證方式

認證方式

說明

trust

採用這種認證模式時,本產品只完全信任從伺服器本機使用gsql且不指定-U引數的連線,此時不需要口令。

trust認證對於單使用者工作站的本地連線是非常合適和方便的,通常不適用於多使用者環境。如果想使用這種認證方法,可利用檔案系統許可權限制對伺服器的Unix域套接字檔案的訪問。要使用這種限制有兩個方法:

設定引數unix_socket_permissionsunix_socket_group

設定引數unix_socket_directory,將Unix域套接字檔案放在一個經過恰當限制的目錄裡。

設定檔案系統許可權只能Unix域套接字連線,它不會限制本地TCP/IP連線。為保證本地TCP/IP安全,openGauss不允許遠端連線使用trust認證方法。

reject

無條件地拒絕連線。常用於過濾某些主機。

md5

要求客戶端提供一個md5加密的口令進行認證。openGauss保留md5認證和密碼儲存,是為了便於第三方工具的使用。

MD5加密演算法安全性低,存在安全風險,建議使用更安全的加密演算法。

sha256

要求客戶端提供一個sha256演算法加密的口令進行認證,該口令在傳送過程中結合salt(伺服器傳送給客戶端的隨機數)的單向sha256加密,增強了安全性。

sm3

要求客戶端提供一個sm3演算法加密口令進行認證,該口令在傳送過程中結合salt(伺服器傳送給客戶端的隨機數)的單項sm3的加密,增加了安全性。

cert

客戶端證書認證模式,此模式需進行SSL連線配置且需要客戶端提供有效的SSL證書,不需要提供使用者密碼。

該認證方式只支援hostssl型別的規則。

gss

使用基於gssapi的kerberos認證。

該認證方式依賴kerberos server等元件,僅支援openGauss內部通訊認證。當前版本暫不支援外部客戶端通過kerberos認證連線。

開啟openGauss內部kerberos認證會使增加內部節點建連時間,即影響首次涉及內部建連的SQL操作效能,內部連線建立好後, 後續操作不受影響。

peer

獲取客戶端所在作業系統使用者名稱,並檢查與資料庫初始使用者名稱是否一致。此方式只支援local模式本地連線,並支援通過配置pg_ident.conf建立作業系統使用者與資料庫使用者對映關係。

假設作業系統使用者名稱為omm,資料庫初始使用者為dbAdmin,在pg_hba.conf中配置local模式為peer認證:

""local   all    all        peer    map=mymap

其中map=mymap指定使用的使用者名稱對映,並在pg_ident.conf中新增對映名稱為mymap的使用者名稱對映如下:

""# MAPNAME       SYSTEM-USERNAME         PG-USERNAME

mymap                omm                                  dbAdmin

說明:

通過gs_guc reload方式修改pg_hba.conf配置可以立即生效無需重啟資料庫。直接編輯修改pg_ident.conf配置後下次連線時自動生效無需重啟資料庫。

如何配置

1.以作業系統使用者omm登入資料庫主節點。

2.配置客戶端認證方式,允許客戶端以“jack”使用者(需提前建立)連線到本機,此處遠端連線禁止使用“omm”使用者(即資料庫初始化使用者)。使用gs_guc  或者直接修改配置檔案均可。

例如,下面示例中配置允許IP地址為10.10.0.30的客戶端訪問本機。

gs_guc set -N all -I all -h "host all jack 10.10.0.30/32 sha256"

-N all表示openGauss的所有主機。-I all表示主機的所有例項。-h表示指定需要在“pg_hba.conf”增加的語句。10.10.0.30/32表示只允許IP地址為10.10.0.30的主機連線。此處的IP地址不能為openGauss內的IP,在使用過程中,請根據使用者的網路進行配置修改。32表示子網掩碼為1的位數,即255.255.255.255。

這條命令在資料庫主節點例項對應的“pg_hba.conf”檔案中添加了一條規則,用於對連線資料庫主節點的客戶端進行鑑定。

“pg_hba.conf”檔案中的每條記錄可以是下面四種格式之一。

local     DATABASE USER METHOD [OPTIONS]

host      DATABASE USER ADDRESS METHOD [OPTIONS]

hostssl   DATABASE USER ADDRESS METHOD [OPTIONS]

hostnossl DATABASE USER ADDRESS METHOD [OPTIONS]

因為認證時系統是為每個連線請求順序檢查“pg_hba.conf”裡的記錄的,所以這些記錄的順序是非常關鍵的。在配置“pg_hba.conf”檔案時,請依據通訊需求按照格式內容從上至下配置記錄,優先順序高的需求需要配置在前面。openGauss和擴容配置的IP優先順序最高,使用者手動配置的IP請放在這二者之後,如果已經進行的客戶配置和擴容節點的IP在同一網段,請在擴容前刪除,擴容成功後再進行配置。

pg_hba.conf中的認證策略越靠前優先順序越高,使用gs_guc工具配置時會按一定規則排序將新策略插入到原有認證策略中。配置欄位比較順序為:IPADDR/HOSTNAME > HOSTTYPE > DATABASE > USERNAME,即優先比較IPADDR或HOSTNAME,如果無法區分優先順序則繼續比較HOSTTYPE,以此類推。對於每個配置欄位,通常越嚴格的配置引數優先順序越高、排序越靠前,越寬鬆的配置引數優先順序越低、排序越靠後,具體如下:

IPADDR:當配置為全0時表示不限制IP,會放在指定具體某個IP地址的策略後面。

DATABASE:當配置為all時表示不限制資料庫,會放在指定具體某個資料庫的策略後面;當資料庫配置為replication時會放在其他策略後面。

USERNAME:當配置為all時表示不限制使用者,會放在指定具體某個使用者的策略後面。

HOSTTYPE:local > hostssl > hostnossl > host。

因此對於認證規則的配置建議如下: 靠前的記錄有比較嚴格的連線引數和比較弱的認證方法。靠後的記錄有比較寬鬆的連線引數和比較強的認證方法。

一個使用者要想成功連線到特定的資料庫,不僅需要通過pg_hba.conf中的規則檢查,還必須要有該資料庫上的CONNECT許可權。如果希望控制某些使用者只能連線到指定資料庫,賦予/撤銷CONNECT許可權通常比在pg_hba.conf中設定規則更為簡單。

常見錯誤

常見的使用者認證失敗錯誤提示請參見下表

問題現象

解決方法

使用者名稱或密碼錯誤:

""FATAL: invalid username/password,login denied

這條資訊說明使用者名稱或者密碼錯誤,請檢查輸入是否有誤。

連線的資料庫不存在:

""FATAL: database "TESTDB" does not exist

這條資訊說明嘗試連線的資料庫不存在,請檢查連線的資料庫名輸入是否有誤。

未找到客戶端匹配記錄:

""FATAL: no pg_hba.conf entry for host "10.10.0.60", user "ANDYM", database "TESTDB"

這條資訊說明已經連線了伺服器,但伺服器拒絕了連線請求,因為沒有在它的pg_hba.conf配置檔案裡找到匹配的記錄。請聯絡資料庫管理員在pg_hba.conf配置檔案加入使用者的資訊。

在可信方法下禁止遠端連線。

“FATAL: Forbid remote connection with trust method!”

使用推薦的sha256認證。

使用的連線工具不支援sha256

none of the server’s SASL authentication mechanisms are supported

修改為使用md5方式連線。

出於安全考慮,openGauss預設加密方式為sha256,因此需要同步修改資料庫的加密方式:gs_guc set -N all -I all -c "password_encryption_type=1" ,即支援md5和sha256,重啟openGauss生效後需要建立用md5方式加密口令的使用者。同時修改pg_hba.conf,將客戶端連線方式修改為md5。

沒有複製連線的pg_hba.conf的配置

FATAL: no pg_hba.conf entry for replication connection from host "127.0.0.1", user "tuser", SSL off

修改pg_hba.conf的 replication privilege部分新增應記錄. 然後重新reload

🍒如果您覺得博主的文章還不錯或者有幫助的話,請關注一下博主,如果點贊評論收藏就更好啦!謝謝各位大佬給予的支援!