MathJax

MathJax-2

MathJax-3

Google Code Prettify

置頂入手筆記

EnterproseDB Quickstart — 快速入門筆記

由於考慮採用 EnterpriseDB 或是直接用 PostgreSQL 的人,通常需要一些入手的資料。這邊紀錄便提供相關快速上手的簡單筆記 ~ 這篇筆記以 資料庫安裝完畢後的快速使用 為目標,基本紀錄登入使用的範例:

2016年8月11日 星期四

pg_ident.conf 設定檔的功能練習筆記

PostgreSQL 的登入控管,是透過 $PGDATA/pg_hba.conf 內的設定控制訪問 IP 與資料庫帳號的登入認證模式。然而, PostgreSQL 還有一個 pg_ident.conf 的管理檔,也和登入控管有關。這個檔案是針對 pg_hba.conf 內認證方法為 ident 以及本機 peer 認證所使用的:設定該檔案,便能夠控制在 ident 認證(ident Authentication)以及本機 peer 認證(peer Authentication)下,作業系統帳號與資料庫帳號的登入對應。
  • 要使用 ident 認證,需要一個 Ident Server 進行控管。可以在本機安裝相關的服務。
  • 本機 peer 認證則單純透過 local socket 連線,不用額外的認證服務。但該選項只限於本機控管(pg_hba.conf 內 METHOD 的設定為 local 的條目)。此外,將 METHOD 為 local 的條目設定成 ident 認證連接的話,找不到 Ident Server 時,就會以 peer 的認證模式進行。

以下在 PostgreSQL 9.5 上進行演練:依照使用手冊所提的,Ident Server 已經比較少地方在用了,所以在此沒建立 Ident Server,僅示範 pg_ident.conf 在 peer 認證模式的狀況。

現在,有一個 OS 帳號 aaa,要賦予他在本機上,能夠以 postgres 資料庫帳號,以 peer 授權認證設定,「直接」登入 PostgreSQL 資料庫。(註:該步驟對於設置 ident 認證也是一樣的)。

首先,在 pg_ident 內
# MAPNAME       SYSTEM-USERNAME      PG-USERNAME
test            aaa                  postgres
test            enterprisedb         postgres
test2           bbb                  postgres

上面設置了兩種對照表,test 以及 test2,這名字將帳號對照分成不同組進行管理。

接著,pg_hba 相應設定
# TYPE  DATABASE     USER       ADDRESS         METHOD
local   all          all                        peer map=test
#host   all          all        127.0.0.1/32     ident map=test2
host   all          all        127.0.0.1/32     md5
#host   all          all        ::1/128          ident map=test2
host   all          all        ::1/128          md5

以上便設置本機為 peer 連線認證,並且依照 pg_ident.conf 裡面 MAPNAME 為 test 的條目進行對照。紅色部份則是設置 ident 連線認證,依照 pg_ident.conf 裡面 MAPNAME 為 test2 的條目進行對照,再這次練習中由於不會作用,於是將它們註解掉。

重新載入資料庫
[postgres@pgvm ~]$ pg_ctl reload

開 log 來看
[aaa@pgvm ~]$ psql  -U postgres -d testdb -p 5432
psql.bin (9.5.3.8)
輸入 "help" 顯示說明。

testdb=#
[postgres@pgvm ~]$ tail -f ~/9.5/data/pg_log/postgresql-2016-08-11_095327.log
...
2016-08-11 16:11:01 CST LOG:  connection received: host=[local]
2016-08-11 16:11:01 CST LOG:  connection authorized: user=postgres database=testdb

上面顯示了成功登入的狀況。
用另外的帳號 bbb 在本機嘗試登入 postgres 這個資料庫帳號
[bbb@pgvm ~]$ psql -U postgres -d testdb -p 5432
psql.bin: FATAL:  Peer authentication failed for user "postgres"

...(承上的 log)
2016-08-11 16:12:06 CST LOG:  connection received: host=[local]
2016-08-11 16:12:06 CST LOG:  no match in usermap "test" for user "postgres" authenticated as "bbb"
2016-08-11 16:12:06 CST FATAL:  Peer authentication failed for user "postgres"
2016-08-11 16:12:06 CST DETAIL:  Connection matched pg_hba.conf line 83: "local    all             all                         ident map=test"

可以看到 bbb 就算在 pg_ident.conf 有紀錄到,但由於是不同的 MAPNAME,於是就被禁止以 postgres 帳號在本機登入。
以上的練習,基本上,使用 Ident Server  也是一樣的效果。

最後一提,若是沒有設置 Ident Server 的話,把上面紅色部份啟用,aaa 帳號就會怎麼樣也連不了(除了對 pg_hba.conf 的 local 條目設定成 ident 認證仍然會有效:沒有 Ident Server 就會被當成 peer 認證)
# TYPE  DATABASE     USER       ADDRESS         METHOD
local   all          all                        peer map=test
host    all          all        127.0.0.1/32    ident map=test2
host    all          all        ::1/128         ident map=test2
[aaa@pgvm ~]$ psql -U postgres -d testdb -p 5432 -h 127.0.0.1
psql: FATAL:  Ident authentication failed for user "postgres"
2016-08-11 15:39:22 CST LOG:  connection received: host=127.0.0.1 port=42333
2016-08-11 15:39:22 CST LOG:  could not connect to Ident server at address "127.0.0.1", port 113: 連線被拒絕
2016-08-11 15:39:22 CST FATAL:  Ident authentication failed for user "postgres"
2016-08-11 15:39:22 CST DETAIL:  Connection matched pg_hba.conf line 87: "host    all             all        127.0.0.1/32           ident map=test"

上面的 log 提到沒有安裝 Ident Service,監聽不到相關的服務,造成連線失敗。



最後,對於 Ident Service,使用手冊提到,該服務只適用在封閉的子網路環境中:因為佈署在外網能存取的地方,有心人士就可能入侵 Client 機器,對 Ident 服務(port 113)進行攻擊。這大概也是為什麼 PostgreSQL 使用手冊提到這功能比較少人用的原因。


參考

沒有留言:

張貼留言