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 使用手冊提到這功能比較少人用的原因。
參考
沒有留言:
張貼留言