
Es sieht so aus, als ob PostgreSQL eines der folgenden unterstützt
- Verwenden Sie TCP (dh localhost:5432) mit Kennwortauthentifizierung
- 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=yes
sicherzustellen, dass die Apps keine externen Anfragen stellen können. Außerdem haben Unix-Domain-Sockets eine bessere Leistung als TCP.
Antwort1
- Verwenden Sie TCP (dh localhost:5432) mit Kennwortauthentifizierung
- 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 peer
Authentifizierung 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-256
anstelle von md5
wenn 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 ...)