CodeGym /課程 /SQL SELF /根據 IP 限制存取權限與 pg_hba.conf 設定

根據 IP 限制存取權限與 pg_hba.conf 設定

SQL SELF
等級 47 , 課堂 4
開放

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.xx.x.x.x/y/y 是子網路遮罩,例如 /24)。
  • IPv6 用 ::/y
  • 關鍵字 all 代表所有 IP 都可以。

認證方法:指定要用哪種認證方式。

範例:

  • trust:不用密碼就能連(超不安全,只能測試用)。
  • md5:用密碼(hash 過的)。
  • scram-sha-256:更安全的 SHA-256 認證。
  • reject:直接拒絕。

pg_hba.conf 行的範例

這個檔案的設定很彈性,來看幾個例子:

  1. 允許本地用 Unix socket 連線

    local   all             all                                     trust
    

    所有使用者都能在本機連所有資料庫,不用密碼。

  2. 只允許某個 IP 連線

    host    my_database     my_user        192.168.1.100/32         md5
    

    只有 my_user192.168.1.100 這個 IP 才能連 my_database,要用密碼。

  3. 允許整個子網路連某個資料庫

    host    my_database     all            192.168.1.0/24           scram-sha-256
    

    只要在 192.168.1.0/24 這個子網路的使用者都能連 my_database,但要用 SHA-256 認證。

  4. 禁止某個子網路連線

    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_user203.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 沒什麼難的,但新手管理員還是會踩雷。像是:

  1. 忘記 reload 伺服器。 你改 pg_hba.conf 後,一定要 reload 設定 才會生效。
  2. 規則互相衝突。 PostgreSQL 會從上往下看規則,第一個符合的就用,下面的就不理了。越廣泛的規則要寫在下面。
  3. 子網路遮罩寫錯。 比如你寫 /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 的存取權限。這個檔案是保護資料庫安全的關鍵工具之一。記得讓設定合邏輯、測試過,也要符合你們公司的需求。誰不想活在一個資料都不會被駭客偷走的世界?當然啦,除非駭客就是你自己 :)

1
問卷/小測驗
存取管理與安全性,等級 47,課堂 4
未開放
存取管理與安全性
存取管理與安全性
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION