轉自
http://www.linuxsir.org/bbs/showthread.php?t=32116
pg_hba.conf 文件
客戶端認證是由 $PGDATA 目錄里的文件pg_hba.conf 控制的,也就是說, /usr/local/pgsql/data/pg_hba.conf. (HBA 的意思是 host-based authentication:基于主機的認證.) 在initdb初始化數據區的時候,它會 安裝一個缺省的文件.
文件 pg_hba.conf 的常用格式是一套記錄, 每行一條。空白行或者井號(“#”)開頭的行被忽略。一條記錄 是由若干用空格和/或 tab 分隔的字段組成。
每條記錄可以下面三種格式之一
local database authentication-method [ authentication-option ]
host database IP-address IP-mask authentication-method [ authentication-option ]
hostssl database IP-address IP-mask authentication-method [ authentication-option ]
各個字段的含義如下:
local
這條記錄適用于通過 Unix 域套接字的聯接.
host
這條記錄適用于通過 TCP/IP 網絡的聯接.請注意,除非服務器是 帶著 -i 選項或者等效的配置參數集啟動的,否則 TCP/IP 聯接將完全被禁止掉.
hostssl
這條記錄適用于試圖建立在 TCP/IP 上的 SSL 之上的聯接. 要使用這個選項,服務器必須帶著 SSL 支持編譯.而且在服務器啟動的時候, 必須用 -l 選項 或等效的配置設置打開 SSL.
database
聲明記錄所適用的數據庫。值 all 表明該記錄應用于所有數據庫, 值 sameuser 表示于正在聯接的用戶同名的數據庫。 否則它就是某個具體的 Postgres 數據庫名字.
IP address, IP mask
這兩個字段以各主機的 IP 地址為基礎, 控制一條 host 記錄應用于哪個主機. (當然,IP 地址可能會被欺騙(spoofed),但是這個考慮 超過了 Postgres 的考慮范圍.) 準確的邏輯是,對于匹配的記錄
(actual-IP-address xor IP-address-field) and IP-mask-field
必需為零.
authentication method(認證方法)
聲明一個用戶在與該數據庫聯接的時候必須使用的認證方法. 可能的選擇如下,詳細情況在 Section 4.2.
trust
無條件地允許聯接.這個方法允許任何有登錄客戶機權限的用戶以任意 Postgres 數據庫用戶身份進行聯接.
reject
聯接無條件拒絕.常用于從組中“過濾”某些主機.
password
要求客戶端在嘗試聯接的時候提供一個口令, 這個口令與為該用戶設置的口令必須匹配.
在 password 關鍵字后面可以聲明一個可選的文件名. 這個文件包含一個用戶列表,列表記錄的是那些適用口令認證記錄的用戶, 以及可選的候選口令.
口令是以明文的方式在線路上傳輸的.如果要更好的保護,請使用 crypt 方法.
crypt
類似 password 方法,但是口令是用一種簡單的 口令對應協議加密后在線路上傳送的.這么做在密碼學理論上是不安全的, 但可以防止偶然的線路偵聽.在 crypt 關鍵字后面 可以有一個文件,文件里包含適用口令認證記錄的用戶列表.
krb4
用 Kerberos V4 認證用戶.只有在進行 TCP/IP 聯接的時候才能用. (譯注:Kerberos,"克爾波洛斯",故希臘神話冥王哈得斯的多頭看門狗. Kerberos 是 MIT 開發出來的基與對稱加密算法的認證協議和/或密鑰 交換方法.其特點是需要兩個不同用途的服務器,一個用于認證身份, 一個用于通道兩端用戶的密鑰交換.同時 Kerberos 對網絡時間同步 要求比較高,以防止回放攻擊,因此通常伴隨 NTP 服務.)
krb5
用 Kerberos V5 認證用戶.只有在進行 TCP/IP 聯接的時候才能用. (譯注:Kerberos V5 是上面 V4 的改良,主要是不再依賴 DES 算法, 同時增加了一些新特性.)
ident
服務器將詢問客戶機上的 ident 服務器以核實正在聯接的用戶身份. 然后 Postgres 核實該操作系統用戶是否被允許以其請求的數據庫用戶身份與數據庫聯接. 只有在使用 TCP/IP 聯接的時候才能用這個選項. 跟在 ident 關鍵字后面的 authentication option 聲明一個 ident map(身份映射), 該文件聲明那些操作系統用戶等效于數據庫用戶.見下文獲取詳細信息.
authentication option(認證選項)
這個字段根據不同的認證方法(authentication method)有不同的 解釋.
認證時使用與聯接請求的客戶端 IP 地址和所要求的 數據庫名字匹配的第一條記錄. 請注意這里沒有 “fall-through(越過)” 或者 “backup(備份)”:如果選定了一條記錄但認證失敗, 那么將不會繼續考慮下面的記錄.如果沒有匹配的記錄,則拒絕訪問.
在每次聯接的請求時,文件 pg_hba.conf 都會被重新讀取.因此很容易就能在服務器運行的時候修改訪問權限.
在 Example 4-1 里是 pg_hba.conf 的一個例子. 閱讀下文理解不同認證方法的細節.
Example 4-1. 一個 pg_hba.conf 文件的例子
# TYPE DATABASE IP_ADDRESS MASK AUTHTYPE MAP
# 允許在本機上的任何用戶以任何身份聯接任何數據庫
# 但必須是通過 IP 進行聯接
host all 127.0.0.1 255.255.255.255 trust
# 同樣,但用的是 Unix-套接字聯接
local all trust
# 允許 IP 地址為 192.168.93.x 的任何主機與數據庫
# "template1" 相連,用與他們在自己的主機上相同 ident 的用戶名標識他自己
# (通常是他的 Unix 用戶名)
host template1 192.168.93.0 255.255.255.0 ident sameuser
# 允許來自主機 192.168.12.10 的用戶與 "template1" 數據庫聯接,
# 只要該用戶提供了在 pg_shadow 里正確的口令.
host template1 192.168.12.10 255.255.255.255 crypt
# 如果前面沒有其它 "host" 行,那么下面兩行將拒絕所有來自
# 192.168.54.1 的聯接請求 (因為前面的記錄先匹配
# 但是允許來自互聯網上其它任何地方有效的 Kerberos V5 認證的聯接
# 零掩碼表示不考慮主機 IP 的任何位.因此它匹配任何主機:
host all 192.168.54.1 255.255.255.255 reject
host all 0.0.0.0 0.0.0.0 krb5
# 允許來自 192.168.x.x 的任何用戶與任意數據庫聯接,只要他們通過 ident 檢查
# 但如果 ident 說該用戶是 "bryanh" 而他要求以 PostgreSQL 用戶 "guest1" 聯接,
# 那么只有在 `pg_ident.conf' 里有 "omicron" 的映射,說 "bryanh" 允許以
# "guest1" 進行聯接時才真正可以進行聯接.
host all 192.168.0.0 255.255.0.0 ident omicron