跳到內容

PostgreSQL/客戶端伺服器通訊

來自華夏公益教科書,開放的書籍,為了開放的世界


所有對資料的訪問都是由伺服器(或後端)程序完成的,客戶端(或前端)程序必須連線到這些程序。 在大多數情況下,這兩個程序類別的例項駐留在不同的硬體上,但它們也可以在同一臺計算機上執行。 它們之間的通訊使用特定於 PostgreSQL 的協議,該協議執行在 TCP/IP 或 UNIX 套接字上。 它在 C 庫 libpq 中實現。 對於每個傳入的新連線,後端程序(有時稱為 postmaster 程序)都會建立一個新的 postgres 後端程序。 此後端程序獲得 PostgeSQL 例項 的一部分,該例項負責資料訪問和資料庫一致性。

該協議處理身份驗證過程、客戶端請求、伺服器響應、異常、特殊情況(如 NOTIFY)以及連線的最終正常或不正常終止。

大多數客戶端程式 - 如 psql - 直接使用此協議。 ODBC、JDBC(型別 4)、Perl DBI 以及用於 Python、C、C++ 等的驅動程式也基於 libpq

您可以在 postgres wiki [1] 上找到驅動程式的詳盡列表,以及在“產品”網站 [2] 上找到更多商業和開源實現。

身份驗證

[編輯 | 編輯原始碼]

客戶端必須在獲得任何資料訪問許可權之前進行身份驗證。 此過程分為一兩個階段。 在第一個(可選)步驟中,客戶端透過滿足作業系統障礙來獲得對伺服器的訪問許可權。 這通常透過提供一個公共 ssh 金鑰來實現。 與 PostgeSQL 的身份驗證是一個單獨的獨立步驟,使用資料庫使用者名稱,該使用者名稱可能與作業系統使用者名稱相關聯,也可能不相關聯。 PostgreSQL 將此第二步的所有規則儲存在檔案 pg_hba.conf 中。

pg_hba.conf 在一行中儲存每條規則,每行一條規則。 從 ph_hba.conf 的頂部到底部對這些行進行評估,第一個匹配的行將應用。 這些行的主要佈局如下

local  DATABASE  USER           METHOD  [OPTIONS]
host   DATABASE  USER  ADDRESS  METHOD  [OPTIONS]

必須用特定值替換大寫詞。 像 localhost 這樣的詞是小寫詞。 它們決定了規則將適用於哪種連線:local 用於與後端位於同一臺計算機上的客戶端(它們使用 UNIX 套接字進行通訊)和 host 用於不同計算機上的客戶端(它們使用 TCP/IP)。 這裡有一個值得注意的例外情況。 在前一種情況下,客戶端可以使用通常的 TCP/IP 語法 --host=localhost --port=5432 切換到使用 TCP/IP。 因此,host 語法對它們適用。

DATABASE 和 USER 必須替換為資料庫的名稱和資料庫使用者的名稱,規則將適用於這些名稱。 在這兩種情況下,關鍵字 ALL 都可以使用,表示規則將適用於所有資料庫和所有資料庫使用者。

ADDRESS 必須替換為客戶端的主機名或 IP 地址加上 CIDR 掩碼,規則將適用於這些地址。 支援 IPv6 表示法。

METHOD 是以下之一。 如果資料庫/使用者/地址組合是 pg_hba.conf 中的第一個匹配組合,則由此定義的規則(= 行)將應用。

  • trust: 允許連線而無需密碼。
  • reject: 拒絕連線。
  • password: 客戶端必須傳送有效的使用者/密碼組合。
  • md5: 與“password”相同,但密碼已加密。
  • ldap: 它使用 LDAP 作為密碼驗證方法。
  • peer: 如果客戶端使用與給定資料庫使用者名稱相同的使用者名稱對作業系統進行授權,則允許連線。 此方法僅在本地連線上受支援。

關於 METHOD,還有一些其他技術。

一些示例

# joe cannot connect to mydb - eg. with psql -, when he is logged in to the backend.
local  mydb  joe  reject

# bill (and all other persons) can connect to mydb when they are logged in to the
# backend  without specifying any further password.  joe will never reach this rule, he
# is rejected by the rule in the line before. The rule sequence is important!
local  mydb  all  trust

# joe can connect to mydb from his workstation '192.168.178.10', if he sends
# the valid md5 encrypted password
host  mydb  joe  192.168.178.10/32 md5

# every connection to mydb coming from the IP range 192.168.178.0 - 192.168.178.255
# is accepted, if they send the valid md5 encrypted password
host  mydb  all  192.168.178.0/24 md5

對於 DATABASE 規範,存在特殊關鍵字 REPLICATION。 它表示流式複製過程。 REPLICATION 不是 ALL 的一部分,必須單獨指定。

參考文獻

[編輯 | 編輯原始碼]
  1. 驅動程式 Wiki [1]
  2. 商業和開源驅動程式 [2]


華夏公益教科書