Postgresql Unix Domain Socket mit Passwortauthentifizierung

Postgresql Unix Domain Socket mit Passwortauthentifizierung

Es sieht so aus, als ob PostgreSQL eines der folgenden unterstützt

  1. Verwenden Sie TCP (dh localhost:5432) mit Kennwortauthentifizierung
  2. Verwenden Sie den Unix-Domänen-Scoket (z. B. /var/run/postgresql/.s.PGSQL.5432) mit Peer-/Trust-Authentifizierung.

Ist es möglich, mit einem Unix-Domain-Socket ein Passwort zu haben?

Hintergrund:

Ich verwende php-fpm, um mehrere Apps auszuführen. Ich möchte, dass verschiedene Apps unterschiedliche Datenbanken und Passwörter haben, aber sie werden als derselbe Benutzer (www-data) ausgeführt. Peer/Trust-Authentifizierung ist also nicht gut, da eine kompromittierte App auch die Daten der anderen App lesen kann. Ich kann auch keine TCP-Authentifizierung verwenden, da ich den php-fpm-Dienst ausführe, um PrivateNetwork=yessicherzustellen, dass die Apps keine externen Anfragen stellen können. Außerdem haben Unix-Domain-Sockets eine bessere Leistung als TCP.

Antwort1

  1. Verwenden Sie TCP (dh localhost:5432) mit Kennwortauthentifizierung
  2. Verwenden Sie den Unix-Domänen-Scoket (z. B. /var/run/postgresql/.s.PGSQL.5432) mit Peer-/Trust-Authentifizierung.

Das ist eine typische Standardkonfiguration, aber kein fest verdrahtetes Verhalten.

Es ist die Serverseitepg_hba.confKonfigurationsdatei, die angibt, welche Authentifizierungsmethode je nach Typ und Ursprung der Verbindung sowie der Zieldatenbank und dem Benutzernamen verwendet wird.

Oftmals findet sich in den ersten Regeln, die die peerAuthentifizierung für Unix Local Domain Sockets auslösen, folgende Zeile:

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

Um ein Passwort anzufordern, ersetzen Sie es durch

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

(oder die modernere Version scram-sha-256anstelle von md5wenn der Server über mit SCRAM gehashte Passwörter verfügt, verfügbar seit Postgres 10).

Oft gibt es in der Konfiguration auch diese spezifischere Regel oben für den Postgres-Benutzer:

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

Sie können es so lassen, wie es ist, oder es je nach Fall auch ändern. Regeln werden in der Reihenfolge ihres Auftretens interpretiert, sodass die spezifischeren Regeln oben stehen.

Antwort2

Ich bin nicht mit php-fpm vertraut, aber normalerweise wird in Postgres die Verbindung als der angegebene Benutzer hergestellt, wenn Sie den Host in der Verbindungszeichenfolge weglassen, aber den Benutzernamen angeben. Zumindest ist das das dokumentierte Verhalten, z. B. in psql.

Das löst also

Wenn eine App kompromittiert ist, kann sie auch die Daten der anderen App lesen.

Sie können beispielsweise für jede App ein Schema einrichten, für jede App einen Benutzer festlegen und dem Benutzer nur den Zugriff auf das entsprechende Schema erlauben.

Sie müssen in php-fm sicherstellen, dass die Benutzerauswahl nicht von jemandem mit WWW-Datenberechtigungen beeinflusst werden kann.

Sie erhalten jedoch keine Passwörter. (Aber in Skripten gespeicherte Passwörter sind sowieso nicht sicherer ...)

verwandte Informationen