2013年1月21日

Postgresql pg_hba.conf

for Ubuntu 12.04, postgresql 9.1
檔案位置:/etc/postgresql/9.1/main/pg_hba.conf

pg_hba.conf修改後,需使用pg_ctl reload重新讀取pg_hba.conf檔,如果pg_ctl找不到資料庫,則用-D /.../pgsql/data/ 指定資料庫目錄,或export PGDATA=/.../pgsql/data/ 導入環境變數。

用來設定postgre資料庫的使用者存取權限, 檔案主要有5個欄位:
  1. Type: host表遠端存取,local表本機端存取 
  2. Database: 設定可存取的Database 
  3. User: 設定可存取的使用者 
  4. Address: 設定可存取之網域,此設定全部網域皆可存取 
  5. Method: trust表不需認證,password表示需要密碼
TYPE定義了多種連接PostgreSQL的方式,分別是:
  • local: 使用本地unix socket
  • host: 使用TCP/IP連接(包括SSL和非SSL)
  • host結合IPv4 address:使用IPv4方式
  • host結合IPv6 address:則使用IPv6方式
  • hostssl只能使用SSL TCP/IP連接
  • hostnossl不能使用SSL TCP/IP連接
DATABASE指定符合條件的某個資料庫是多個資料庫,庫名間以逗號分隔。
All: 只有在沒有其他的符合條目時才代表「所有資料庫」如果有其他的符合條目則代表「除了該條之外的資料庫」,因為“all”的優先順序最低。如下例:
local    db1    user1    reject
local    all      all      ident
這兩條都是指定local訪問方式,因為前一條指定了特定的資料庫db1,所以後一條的all代表的是除了db1之外的資料庫,同理使用者的all也是這個道理。

USER指定哪個資料庫使用者(PostgreSQL正規的名稱是角色,role)。多個用戶以逗號分隔。

CIDR-ADDRESS項local方式不必填寫,該項可以是IPv4位址或IPv6位址,可以定義某台主機或某個網段。

METHOD指定如何處理用戶端的認證。常用的有ident,md5,password,trust,reject。
  • dent是Linux下PostgreSQL預設的local認證方式,凡是能正確登錄伺服器的作業系統使用者(注:不是資料庫使用者)就能使用本使用者映射的資料庫使用者不需密碼登錄資料庫。用戶映射檔為pg_ident.conf,這個檔記錄著與作業系統使用者匹配的資料庫使用者,如果某作業系統使用者在本檔中沒有映射用戶,則預設的映射資料庫使用者與作業系統使用者同名。比如,伺服器上有名為user1的作業系統使用者,同時資料庫上也有同名的資料庫使用者,user1登錄作業系統後可以直接輸入psql,以user1資料庫使用者身份登錄資料庫且不需密碼。很多初學者都會遇到psql -U username登錄資料庫卻出現“username ident 認證失敗”的錯誤,明明資料庫使用者已經createuser。原因就在於此,使用了ident認證方式,卻沒有同名的作業系統使用者或沒有相應的映射用戶。解決方案:1、在pg_ident.conf中添加映射用戶;2、改變認證方式。
  • md5是常用的密碼認證方式,如果你不使用ident,最好使用md5。密碼是以md5形式傳送給資料庫,較安全,且不需建立同名的作業系統使用者。
  • password是以純文字密碼傳送給資料庫,建議不要在生產環境中使用。
  • trust是只要知道資料庫用戶名就不需要密碼或ident就能登錄,建議不要在生產環境中使用。
  • reject是拒絕認證。
  • 本地使用psql登錄資料庫,是以unix通訊端的方式,附合local方式。
  • 使用PGAdmin3或php登錄資料庫,不論是否本地均是以TCP/IP方式,符合host方式。