帶密碼認證的 Postgresql unix 域套接字

帶密碼認證的 Postgresql unix 域套接字

看起來 postgresql 支援以下任一選項

  1. 使用 tcp(即 localhost:5432)和密碼驗證
  2. 使用 Unix 網域 scoket (即 /var/run/postgresql/.s.PGSQL.5432 )進行對等/信任驗證

unix域套接字是否可以有密碼?

背景:

我使用 php-fpm 來運行多個應用程式。我希望不同的應用程式具有不同的資料庫和密碼,但它們將以同一用戶(www-data)運行。因此,對等/信任身份驗證並不好,因為如果一個應用程式受到損害,它也可以讀取另一個應用程式的資料。我也無法使用 tcp 身份驗證,因為我運行 php-fpm 服務以PrivateNetwork=yes確保應用程式無法發出外部請求。此外,unix 域套接字比 tcp 具有更好的效能。

答案1

  1. 使用 tcp(即 localhost:5432)和密碼驗證
  2. 使用 Unix 網域 scoket (即 /var/run/postgresql/.s.PGSQL.5432 )進行對等/信任驗證

這是典型的預設配置,但不是硬連線行為。

這是伺服器端pg_hba.conf設定文件,告訴您根據連接的類型和來源以及目標資料庫和使用者名稱使用哪種身份驗證方法。

通常在前幾條規則中有這一行,它會觸發peerUnix 本地域套接字的身份驗證:

# "local" is for Unix domain socket connections only
local   all             all                                     peer

若要請求密碼,請將其替換為

# "local" is for Unix domain socket connections only
local   all             all                                     md5

(或更現代的scram-sha-256方式,而不是md5伺服器具有使用 SCRAM 進行雜湊處理的密碼,自 Postgres 10 起可用)。

對於 postgres 用戶,配置中通常還有上面的更具體的規則:

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

您可以保留原樣,也可以根據您的情況進行更改。規則按照出現的順序進行解釋,因此更具體的規則位於頂部。

答案2

我不熟悉 php-fpm,但通常在 Postgres 中,如果您在連接字串中省略主機,但指定用戶名,那麼它將作為指定用戶進行連接。至少這是記錄的行為,例如在psql.

這樣就解決了

如果一個應用程式受到損害,它也可以讀取另一個應用程式的資料。

例如,您可以為每個應用程式設定一個架構,每個應用程式擁有一個用戶,並且只允許用戶存取相應的架構。

您必須確保在 php-fm 中使用者的選擇不會受到具有 www-data 權限的人的影響。

但是,它不會為您提供密碼。 (但是無論如何,儲存在腳本中的密碼並不安全...)

相關內容