Verwenden von psql, um im SSL-Modus eine Verbindung zu PostgreSQL herzustellen

76

Ich versuche, das SSL-Zertifikat für den PostgreSQL-Server zu konfigurieren. Ich habe eine Zertifikatdatei (server.crt) und einen Schlüssel (server.key) im Datenverzeichnis erstellt und den Parameter SSL auf "on" aktualisiert, um eine sichere Verbindung zu ermöglichen.

Ich möchte nur, dass nur der Server auf der Clientseite mit Serverzertifikaten authentifiziert wird, und ich benötige nicht die Authentizität des Clients auf der Serverseite. Ich benutze psql als Client, um die Befehle zu verbinden und auszuführen.

Ich benutze PostgreSQL 8.4 und Linux. Ich habe mit dem folgenden Befehl versucht, eine Verbindung zum Server mit aktiviertem SSL herzustellen

       psql "postgresql://localhost:2345/postgres?sslmode=require"

aber ich bekomme

       psql: invalid connection option "postgresql://localhost:2345/postgres?sslmode"

Was mache ich hier falsch? Ist die Art und Weise, wie ich versuche, mit aktiviertem SSL-Modus eine Verbindung zum Server herzustellen, korrekt? Ist es in Ordnung, nur den Server und nicht den Client zu authentifizieren?

Lolly
quelle
Der Port 2345 anstelle des Standard-5432 ist vorgesehen?
Erwin Brandstetter
Ja. Dies ist der konfigurierte Port.
Lolly
2
Wenn Sie möchten, dass die Verbindung gegen MITM-Angriffe sicher ist, verwenden Sie sslmode=verify-fullnicht nur require.
Bruno

Antworten:

110

psql Unter 9.2 wird diese URL-ähnliche Syntax für Optionen nicht akzeptiert.

Die Verwendung von SSL kann über die sslmode=valueOption in der Befehlszeile oder die Umgebungsvariable PGSSLMODE gesteuert werden. Standardmäßig werden preferSSL-Verbindungen jedoch zuerst automatisch versucht, ohne dass etwas angegeben wird.

Beispiel mit einer Conninfo-Zeichenfolge ( aktualisiert für psql 8.4 )

psql "sslmode=require host=localhost dbname=test"

Weitere Optionen finden Sie auf der Handbuchseite .

Daniel Vérité
quelle
Ich habe diese Verbindungszeichenfolgensyntax von diesem Link erhalten. postgresql.org/docs/9.2/static/app-psql.html
Lolly
2
Ich habe es auch mit Ihrer Option versucht, psql -h localhost -p 2345 -U thirunas -d postgres "sslmode=require" -f test_schema.ddl aber es heißt sql: warning: extra command-line argument "sslmode=require" ignored
Lolly
@annonymous Sie sagen, Sie haben die Syntax für die 9.2-Dokumentation, aber Sie sagen auch, dass Sie Version 8.4 verwenden. Auf was Sie verwenden, wird im 8.4-Dokument nicht verwiesen. Versuchen Sie auch, "sslmode = require" als erstes Argument zu verwenden.
Bruno
1
@ Bruno: Ich habe den Fehler bekommen. Habe gerade den Versionsunterschied in der Dokumentation bemerkt. Aber wenn ich es immer noch im ersten Argument habe, bekomme ich die gleiche Warnung. psql -h localhost "sslmode=require" -p 2345 -U thirunas -d postgres -f test_schema.ddl. Warnungpsql: warning: extra command-line argument "sslmode=require" ignored
Lolly
4
@Wave & andere, die darauf stoßen, wird die conninfo-Zeichenfolge anstelle eines Datenbanknamens (-d) verwendet. Sie können den Datenbanknamen nach der Option -d oder als erstes Argument ohne Option in der Befehlszeile angeben. Also sollte -d postgres "sslmode = require" entweder psql [Optionen] -d "dbname = postgres sslmode = require" [andere Optionen] oder psql [Optionen] "dbname = postgres sslmode = require" sein. Sie können viele andere Optionen in die conninfo-Zeichenfolge verschieben.
Jla
25
psql --set=sslmode=require -h localhost -p 2345 -U thirunas \
-d postgres -f test_schema.ddl

Ein weiteres Beispiel für die sichere Verbindung mit der von Azure verwalteten Postgres-Datenbank:

psql --file=product_data.sql --host=hostname.postgres.database.azure.com --port=5432 \
--username=postgres@postgres-esprit --dbname=product_data \
--set=sslmode=verify-full --set=sslrootcert=/opt/ssl/BaltimoreCyberTrustRoot.crt.pem
Andrii Batiuk
quelle
2
Das ist falsch. --set=sslmode=requiredefiniert eine psql-Variable, die überhaupt nicht am Authentifizierungsprozess beteiligt ist. Es wird nichts unternommen , um SSL zu erzwingen.
Daniel Vérité
5

Die folgenden Optionen waren nützlich, um alle Dateien für eine selbstsignierte Postgres-Instanz bereitzustellen

psql "host={hostname} sslmode=prefer sslrootcert={ca-cert.pem} sslcert={client-cert.pem} sslkey={client-key.pem} port={port} user={user} dbname={db}"
Julian Chick
quelle
2

psql "sslmode=require host=localhost port=2345 dbname=postgres" --username=some_user

Laut der postgres psql-Dokumentation sollten nur die Verbindungsparameter in der conninfo-Zeichenfolge enthalten sein (aus diesem Grund befindet sich in unserem Beispiel --username nicht in dieser Zeichenfolge).

Komu
quelle
Anfangs dachte ich das auch, aber nachdem ich den Abschnitt Herstellen einer Verbindung mit einer Datenbank erneut gelesen habe, gehe ich zu einer alternativen Methode, um Verbindungsparameter anzugeben, eine Conninfo-Zeichenfolge, die anstelle eines Datenbanknamens verwendet wird. Dieser Mechanismus gibt Ihnen eine sehr breite Kontrolle über die Verbindung. Als Bedeutung können Sie alle Argumente in der conninfoZeichenfolge verschieben. Aber ich denke auch, dass die Dokumente auch hier klarer gemacht werden könnten.
Austin A
2

Auf dem psql-Client v12 konnte ich im psql-Client keine Option zum Aktivieren finden sslmode=verify-full.

Am Ende habe ich Umgebungsvariablen verwendet:

PGSSLMODE=verify-full PGSSLROOTCERT=server-ca.pem psql -h your_host -U your_user -W -d your_db
Fred
quelle
1

Nun, Ihre Cloud stellt alle Informationen mit dem folgenden Befehl in der CLI bereit, wenn die Verbindung im SSL-Modus erforderlich ist:

psql "sslmode=verify-ca sslrootcert=server-ca.pem sslcert=client-cert.pem sslkey=client-key.pem hostaddr=your_host port=5432 user=your_user dbname=your_db" 
Sebuhi
quelle