PostgreSQL pg_hba.conf設定

Posted by JSON on February 1, 2016

修改PostgreSQL的pg_hba.conf設定檔,能夠管理DB連線的認證方式,檔案位於 /etc/postgresql/版本號/main/pg_hba.conf,打開後內容如下:

# Database administrative login by Unix domain socket
local   all             postgres                                peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

以PostgreSQL9.1版本為例,可以有下面七種設定格式:

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]
  • local 表示該條規則match那些用unix-domain sockets的連線, host 表示該條規則match那些用TCP/IP方式的連線。
  • database 表示該條規則要match哪些資料庫,可以是資料庫名allsameusersameuser表示與DB User同名的DB Name。
  • user 表示該條規則要match哪些使用者,可以是特定一個DB User Nameall
  • auth-method 表示用什麼方式作驗證:
    • md5password 同樣都是用db user的密碼來做驗證,差別在於有沒有加密
    • peer 假設linux上存在一個名為abc的使用者,且DB也存在名為abc的使用者, 那麼此規則允許abc使用者以免密碼的方式通過驗證操作abc的DB User(此驗證方式只能套用在local規則上)
    • trust 不需要任何驗證
  • address 表示允許來自於哪些位置的連線

上面這些都是基本款, 其它更詳細的說明可以參考官方pg_hba.conf說明文件

以我的需求為例,我的Client端軟體想要透過SSH通道遠端連線Server上的DB:

host  sameuser  all 127.0.0.1/32  trust

這會允許Server內部透過TCP/IP進行DB的任何連線,免驗證的用任何DB帳號對同名DB進行存取, 簡單說,與linux user無關,名為abc的DB User,就能直接存取同名為abc的資料庫, 因為我的Server上只有我一個人,所以不必擔心跨存取的問題。

修改完後記得重新啟動PostgreSQL,設定才會生效:

service postgresql restart

如果想測試設定是否正確可使用psql指令:

psql -h 127.0.0.1 -U username dbname 
psql -h localhost -U username dbname

注意:127.0.0.1會匹配到host的設定,而localhost是匹配local的設定。

另外,下面這一條規則是pg_hba.conf的預設規則之一,它會驗證嘗試登入的DB使用者是否與目前linux使用者 名稱相同,如果相同就通過驗證,並且可以存取所有資料庫:

local all all peer