客戶端身份驗證

wongchaofan發表於2024-05-27

當客戶端應用程式連線到資料庫伺服器時,它會指定要以哪個PostgreSQL資料庫使用者名稱進行連線,這與以特定使用者身份登入 Unix 計算機的方式非常相似。在 SQL 環境中,活動資料庫使用者名稱決定了對資料庫物件的訪問許可權

身份驗證是資料庫伺服器建立客戶端身份的過程,並透過擴充套件確定客戶端應用程式(或執行客戶端應用程式的使用者)是否被允許使用請求的資料庫使用者名稱進行連線。

PostgreSQL提供多種不同的客戶端身份驗證方法。可以根據(客戶端)主機地址、資料庫和使用者選擇用於驗證特定客戶端連線的方法。

PostgreSQL資料庫使用者名稱在邏輯上與伺服器執行的作業系統的使用者名稱是分開的。如果特定伺服器的所有使用者也在該伺服器的計算機上擁有帳戶,則分配與其作業系統使用者名稱匹配的資料庫使用者名稱是有意義的。但是,接受遠端連線的伺服器可能有許多沒有本地作業系統帳戶的資料庫使用者,在這種情況下,資料庫使用者名稱和作業系統使用者名稱之間不需要有任何聯絡。

pg_hba.conf檔案

客戶端身份驗證由配置檔案控制,該檔案通常名為pg_hba.conf,儲存在資料庫叢集的資料目錄中。(HBA代表基於主機的身份驗證。)當initdb初始化資料目錄時,會安裝預設的pg_hba.conf檔案。但是,可以將身份驗證配置檔案放在其他地方;

pg_hba.conf檔案的一般格式是一組記錄,每行一個。空行會被忽略,#註釋字元後的任何文字也會被忽略。記錄不能跨行。一條記錄由多個欄位組成,這些欄位由空格和/或製表符分隔。如果欄位值用雙引號引起來,則欄位可以包含空格。引用資料庫、使用者或地址欄位中的一個關鍵字(例如allreplication)會使該詞失去其特殊含義,而只匹配具有該名稱的資料庫、使用者或主機。

每條記錄指定一種連線型別、一個客戶端 IP 地址範圍(如果與該連線型別相關)、一個資料庫名稱、一個使用者名稱以及用於與這些引數匹配的連線身份驗證方法。具有匹配的連線型別、客戶端地址、請求的資料庫和使用者名稱的第一條記錄用於執行身份驗證。沒有“失敗”“備份”:如果選擇了一條記錄並且身份驗證失敗,則不會考慮後續記錄。如果沒有匹配的記錄,則拒絕訪問。

記錄可以採用以下七種格式之一

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]

提示:要連線到特定資料庫,使用者不僅必須透過pg_hba.conf檢查,還必須擁有該資料庫的CONNECT許可權。如果您希望限制哪些使用者可以連線到哪些資料庫,通常透過 granting/revoking CONNECT許可權來控制這一點比將規則放入pg_hba.conf條目中更容易

auth-method

trust 無條件允許連線。

reject 無條件拒絕連線。

md5 要求客戶端提供雙重 MD5 雜湊密碼進行身份驗證。

password 要求客戶端提供未加密的密碼進行身份驗證。

ident 透過聯絡客戶端上的 ident 伺服器來獲取客戶端的作業系統使用者名稱,並檢查它是否與請求的資料庫使用者名稱匹配。Ident 認證只能在 TCP/IP 連線上使用。當為本地連線指定時,將改用對等認證。

Example pg_hba.conf Entries

# 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

相關文章