pg_hba.conf 是 PostgreSQL 的設定檔,用來管理連線和認證。HBA 的意思是 Host-Based Authentication(主機為基礎的認證)。這個檔案就像網路上的「柵欄」,決定:
- 誰可以連到伺服器(IP 位址、角色、資料庫)。
- 連線時需要用哪種認證方式。
如果要拿現實生活來比喻,pg_hba.conf 就像大樓門口的警衛。他不只會檢查你的證件(密碼),還會看你有沒有這裡的戶籍(IP 位址),決定要不要讓你進來。
pg_hba.conf 檔案結構
pg_hba.conf 這個檔案是由一行一行的規則組成。每一行的格式長這樣:
<連線類型> <資料庫> <使用者> <來源> <認證方法>
來拆解一下各個部分:
連線類型(connection type):決定 client 怎麼連進來。
local:用 Unix socket 連線(Linux 伺服器上的本地使用者)。host:用 TCP/IP 連線。hostssl:用 TCP/IP 連線,但一定要用 SSL。hostnossl:用 TCP/IP 連線,但不能用 SSL。
資料庫:列出允許存取的資料庫。可以指定單一資料庫、用逗號分隔多個,或用關鍵字:
all:允許所有資料庫。
使用者:指定哪些使用者可以連線。
- 可以指定單一使用者名稱,或用
all讓大家都能連。
來源(address):指定 client 的 IP 位址或範圍。
- IPv4 用
x.x.x.x或x.x.x.x/y(/y是子網路遮罩,例如/24)。 - IPv6 用
::/y。 - 關鍵字
all代表所有 IP 都可以。
認證方法:指定要用哪種認證方式。
範例:
trust:不用密碼就能連(超不安全,只能測試用)。md5:用密碼(hash 過的)。scram-sha-256:更安全的 SHA-256 認證。reject:直接拒絕。
pg_hba.conf 行的範例
這個檔案的設定很彈性,來看幾個例子:
允許本地用 Unix socket 連線
local all all trust所有使用者都能在本機連所有資料庫,不用密碼。
只允許某個 IP 連線
host my_database my_user 192.168.1.100/32 md5只有
my_user從192.168.1.100這個 IP 才能連my_database,要用密碼。允許整個子網路連某個資料庫
host my_database all 192.168.1.0/24 scram-sha-256只要在
192.168.1.0/24這個子網路的使用者都能連my_database,但要用 SHA-256 認證。禁止某個子網路連線
host all all 192.168.2.0/24 reject來自
192.168.2.0/24這個子網路的連線全部被拒絕。
根據 IP 設定存取權限
現在我們知道檔案結構了,來看看怎麼控管連線。
假設你想只讓本機(127.0.0.1)和辦公室子網路(192.168.10.0/24)能連 PostgreSQL 伺服器。你可以在 pg_hba.conf 加上這幾行:
# 本機存取
host all all 127.0.0.1/32 trust
# 辦公室存取
host all all 192.168.10.0/24 md5
# 其他全部拒絕
host all all 0.0.0.0/0 reject
這裡 0.0.0.0/0 代表「所有 IP」。我們明確拒絕除了上面指定的以外的所有連線。
遠端使用者的存取設定
如果你的 PostgreSQL 跑在雲端或遠端伺服器,可能只想讓特定外部 IP 能連。例如:
# 管理員從家裡連線
host all admin_user 203.0.113.10/32 md5
這個例子只有 admin_user 從 203.0.113.10 這個 IP 才能連。
重新載入設定
改完 pg_hba.conf 後,PostgreSQL 要重新載入設定才會生效。用這個指令:
sudo systemctl reload postgresql
這樣 reload 很安全,不會讓伺服器掛掉。
如果你忘了 pg_hba.conf 放哪,可以用 SQL 查:
SHOW hba_file;
設定 pg_hba.conf 常見錯誤
其實 pg_hba.conf 沒什麼難的,但新手管理員還是會踩雷。像是:
- 忘記 reload 伺服器。 你改
pg_hba.conf後,一定要 reload 設定 才會生效。 - 規則互相衝突。 PostgreSQL 會從上往下看規則,第一個符合的就用,下面的就不理了。越廣泛的規則要寫在下面。
- 子網路遮罩寫錯。 比如你寫
/0,那就等於全世界都能連,超危險。
實際應用場景範例
在本機伺服器測試應用程式。
只允許本機連線:
local all all trust
跟遠端 client 合作。
只允許某個 IP 的 client 連線:
host all client_user 203.0.113.42/32 scram-sha-256
公開網路的存取限制。
禁止來自 Internet 的連線(但允許辦公室):
host all all 0.0.0.0/0 reject
host all all 192.168.10.0/24 md5
到這裡你應該已經有概念怎麼用 pg_hba.conf 來限制 PostgreSQL 的存取權限。這個檔案是保護資料庫安全的關鍵工具之一。記得讓設定合邏輯、測試過,也要符合你們公司的需求。誰不想活在一個資料都不會被駭客偷走的世界?當然啦,除非駭客就是你自己 :)
GO TO FULL VERSION