Datenbank · 7 min read · Dec 21, 2025
So aktivieren Sie SSL für PostgreSQL-Verbindungen

Standardmäßig sind alle PostgreSQL-Verbindungen unsicher, was in stark frequentierten Produktionsumgebungen zu Sicherheitsproblemen führen kann. SSL-Verschlüsselung stellt sicher, dass keine Daten, die übertragen werden, von jemandem in der Mitte einer Verbindung abgefangen werden.
Dieses Tutorial zeigt Ihnen, wie Sie SSL/TLS für PostgreSQL-Verbindungen aktivieren.
Voraussetzungen
- Ein Linux-Server. Für unser Tutorial verwenden wir einen Ubuntu 22.04-Server.
- Ein nicht-root sudo-Benutzer.
- Ein vollständig qualifizierter Domainname (FQDN) wie
postgresql.example.com. - Stellen Sie sicher, dass alles aktualisiert ist.
$ sudo apt update $ sudo apt upgrade - Einige Pakete, die Ihr System benötigt.
$ sudo apt install curl nano software-properties-common apt-transport-https ca-certificates lsb-release ubuntu-keyring -yEinige dieser Pakete sind möglicherweise bereits auf Ihrem System installiert.
Schritt 1 - Firewall konfigurieren
Bevor Sie Pakete installieren, besteht der erste Schritt darin, die Firewall zu konfigurieren, um die Ports für HTTP, HTTPS und PostgreSQL zu öffnen.
Überprüfen Sie den Status der Firewall.
$ sudo ufw status
Sie sollten etwas sehen, das wie folgt aussieht.
Status: aktiv
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Öffnen Sie die HTTP-, HTTPS- und PostgreSQL-Ports in der Firewall.
$ sudo ufw allow 5432
$ sudo ufw allow http
$ sudo ufw allow https
Überprüfen Sie den Status erneut zur Bestätigung.
$ sudo ufw status
Status: aktiv
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443 ALLOW Anywhere
5432 ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
5432 (v6) ALLOW Anywhere (v6)
Schritt 2 - PostgreSQL 14 installieren
Ubuntu 22.04 wird standardmäßig mit PostgreSQL 14 ausgeliefert. Um es zu installieren, geben Sie den folgenden Befehl ein.
$ sudo apt install postgresql postgresql-contrib
Das Paket postgresql-contrib enthält einige zusätzliche Dienstprogramme.
Sie können auch das offizielle APT-Repository von PostgreSQL verwenden, um es zu installieren. Führen Sie den folgenden Befehl aus, um den PostgreSQL GPG-Schlüssel hinzuzufügen.
$ curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/postgresql-key.gpg >/dev/null
Fügen Sie das APT-Repository zu Ihrer Quellenliste hinzu.
$ sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/postgresql-key.gpg arch=amd64] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
Aktualisieren Sie das System-Repository.
$ sudo apt update
Jetzt können Sie PostgreSQL mit dem oben genannten Befehl installieren.
Überprüfen Sie den Status des PostgreSQL-Dienstes.
$ sudo systemctl status postgresql
? postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: active (exited) since Mon 2022-12-12 00:01:06 UTC; 19s ago
Main PID: 3497 (code=exited, status=0/SUCCESS)
CPU: 1ms
Dec 12 00:01:06 postgresql systemd[1]: Starting PostgreSQL RDBMS...
Dec 12 00:01:06 postgresql systemd[1]: Finished PostgreSQL RDBMS.
Sie können sehen, dass der Dienst standardmäßig aktiviert und ausgeführt wird.
Setzen Sie das Passwort für das postgres-Konto.
$ sudo -i -u postgres psql -c "ALTER USER postgres PASSWORD '';"
Schritt 3 - SSL installieren
Um ein SSL-Zertifikat mit Let’s Encrypt zu installieren, müssen wir das Certbot-Tool herunterladen. Wir werden dafür den Snapd-Paketinstaller verwenden. Ubuntu 22.04 wird standardmäßig mit Snap ausgeliefert.
Stellen Sie sicher, dass Ihre Version von Snapd auf dem neuesten Stand ist.
$ sudo snap install core
$ sudo snap refresh core
Installieren Sie Certbot.
$ sudo snap install --classic certbot
Verwenden Sie den folgenden Befehl, um sicherzustellen, dass der Certbot-Befehl ausgeführt wird, indem Sie einen symbolischen Link zum Verzeichnis /usr/bin erstellen.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Generieren Sie ein SSL-Zertifikat.
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d postgresql.example.com
Der obige Befehl lädt ein Zertifikat in das Verzeichnis /etc/letsencrypt/live/postgresql.example.com auf Ihrem Server herunter.
Generieren Sie ein Diffie-Hellman-Gruppe-Zertifikat.
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Schritt 4 - Certbot-Erneuerung für PostgreSQL konfigurieren
PostgreSQL hat keine Berechtigung, auf die Zertifikate aus dem Let’s Encrypt-Ordner zuzugreifen, daher können wir ihm nicht direkt sagen, dass es die Zertifikate aus dem Ordner verwenden soll. Die Alternative besteht darin, die Zertifikate in das PostgreSQL-Verzeichnis zu kopieren, aber das funktioniert nur vorübergehend, da sie ablaufen und Sie sie manuell erneut kopieren müssen.
Die beste Methode besteht darin, einen Erneuerungshook zu verwenden, der bei jeder Erneuerung automatisch ausgeführt wird und die Kopieroperationen durchführt.
Suchen Sie das PostgreSQL-Datenverzeichnis.
$ sudo -i -u postgres psql -U postgres -c 'SHOW data_directory'
Erstellen Sie die Erneuerungshook-Datei und öffnen Sie sie zur Bearbeitung.
$ sudo nano /etc/letsencrypt/renewal-hooks/deploy/postgresql.sh
Fügen Sie den folgenden Code ein.
#!/bin/bash
umask 0177
DOMAIN=postgresql.example.com
DATA_DIR=/var/lib/postgresql/15/main
cp /etc/letsencrypt/live/$DOMAIN/fullchain.pem $DATA_DIR/server.crt
cp /etc/letsencrypt/live/$DOMAIN/privkey.pem $DATA_DIR/server.key
chown postgres:postgres $DATA_DIR/server.crt $DATA_DIR/server.key
# nur für SELinux - CentOS, Red Hat
# chcon -t postgresql_db_t $DATA_DIR/server.crt $DATA_DIR/server.key
Speichern Sie die Datei, indem Sie Ctrl + X drücken und Y eingeben, wenn Sie dazu aufgefordert werden.
Machen Sie die Datei ausführbar.
$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/postgresql.sh
Schritt 5 - PostgreSQL konfigurieren
Finden Sie den Pfad zur PostgreSQL-Konfigurationsdatei.
$ sudo -i -u postgres psql -U postgres -c 'SHOW config_file'
Öffnen Sie die Datei zur Bearbeitung.
$ sudo nano /etc/postgresql/15/main/postgresql.conf
Suchen Sie den Abschnitt Verbindungseinstellungen und entfernen Sie das Kommentarzeichen von der Variablen listen_address und ändern Sie ihren Wert in *. Stellen Sie sicher, dass es wie folgt aussieht.
listen_address = '*' # welche IP-Adresse(n) soll(en) gehört werden;
Suchen Sie den Abschnitt SSL und bearbeiten Sie die Datei, um die folgenden Werte anzupassen.
ssl = on
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
ssl_prefer_server_ciphers = on
ssl_dh_params_file = '/etc/ssl/certs/dhparam.pem'
Speichern Sie die Datei, indem Sie Ctrl + X drücken und Y eingeben, wenn Sie dazu aufgefordert werden.
Schritt 6 - PostgreSQL-Verbindung konfigurieren
Öffnen Sie die Datei /etc/postgresql/15/main/pg_hba.conf zur Bearbeitung.
$ sudo nano /etc/postgresql/15/main/pg_hba.conf
Fügen Sie die folgende Zeile hinzu, um SSL für PostgreSQL zu aktivieren.
hostssl all all 0.0.0.0/0 scram-sha-256
Speichern Sie die Datei, indem Sie Ctrl + X drücken und Y eingeben, wenn Sie dazu aufgefordert werden.
Schritt 7 - Zertifikat erneuern
Führen Sie den folgenden Befehl aus, um eine erzwungene Erneuerung durchzuführen. Dies löst das Bereitstellungsskript aus, das die Zertifikate an den richtigen Ort kopiert, damit PostgreSQL sie verwenden kann.
$ sudo certbot renew --force-renewal
Überprüfen Sie, ob die Zertifikate in das PostgreSQL-Datenverzeichnis kopiert wurden.
$ sudo ls /var/lib/postgresql/15/main/
Sie sollten die folgende Ausgabe sehen, die Ihnen die Zertifikate zeigt.
base pg_dynshmem pg_notify pg_snapshots pg_subtrans PG_VERSION postgresql.auto.conf server.crt
global pg_logical pg_replslot pg_stat pg_tblspc pg_wal postmaster.opts server.key
pg_commit_ts pg_multixact pg_serial pg_stat_tmp pg_twophase pg_xact postmaster.pid
Starten Sie PostgreSQL neu, um die Änderungen anzuwenden.
$ sudo systemctl restart postgresql
Schritt 8 - Verbindung testen
Stellen Sie von einem anderen Computer mit dem installierten PostgreSQL-Client eine Verbindung zur Datenbank her.
$ psql -d "dbname=postgres sslmode=require" -h postgresql.example.com -U postgres
Sie sollten die folgende PostgreSQL-Eingabeaufforderung sehen. Wir verwenden einen Client mit PostgreSQL 14-Client, daher sehen Sie eine Warnung über inkompatible Versionen.
Passwort für Benutzer postgres:
psql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1), Server 15.1 (Ubuntu 15.1-1.pgdg22.04+1))
WARNUNG: psql Hauptversion 14, Server Hauptversion 15.
Einige psql-Funktionen funktionieren möglicherweise nicht.
SSL-Verbindung (Protokoll: TLSv1.3, Chiffre: TLS_AES_256_GCM_SHA384, Bits: 256, Kompression: aus)
Geben Sie "help" für Hilfe ein.
postgres=#
Dies bestätigt eine erfolgreiche SSL-Verbindung.
Verlassen Sie die Shell.
postgres=# \q
Wenn Ihre App eine Verbindungszeichenfolge verwendet, verwenden Sie sie im folgenden Format für eine SSL-Verbindung.
postgres://user:[email protected]:5432/database_name?sslmode=require
Sie können den SSL-Modus auf verify-full oder verify-ca ändern, wenn Sie das Wurzelzertifikat für Let’s Encrypt im Verzeichnis /var/lib/postgresql/.postgresql auf der Client-Seite verfügbar haben.
Erstellen Sie das Verzeichnis /var/lib/postgresql/.postgresql.
$ sudo mkdir -p /var/lib/postgresql/.postgresql
Das Let’s Encrypt-Wurzelzertifikat ist ISRG Root X1, das sich auf dem Server im Verzeichnis /usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt befindet.
Kopieren Sie das Wurzelzertifikat in das Verzeichnis /var/lib/postgresql/.postgresql.
$ sudo cp /usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt /var/lib/postgresql/.postgresql/root.crt
Testen Sie die Verbindung im verify-full- oder verify-ca-Modus, und Sie sollten eine erfolgreiche Verbindung sehen.
Schritt 9 - Überprüfen Sie die Clients
Melden Sie sich an der PostgreSQL-Shell auf dem Server an.
$ sudo -i -u postgres psql
Führen Sie den folgenden SQL-Befehl aus, um die verbundenen Clients zu überprüfen.
SELECT ssl.pid, usename, datname, ssl, ssl.version, ssl.cipher, ssl.bits, client_addr
FROM pg_catalog.pg_stat_ssl ssl, pg_catalog.pg_stat_activity activity
WHERE ssl.pid = activity.pid;
Sie sollten eine ähnliche Ausgabe sehen.
pid | usename | datname | ssl | version | cipher | bits | client_addr
------+----------+----------+-----+---------+------------------------+------+----------------
5126 | postgres | postgres | t | TLSv1.3 | TLS_AES_256_GCM_SHA384 | 256 | 122.161.84.220
5154 | postgres | postgres | f | | | |
(2 Zeilen)
Dies bestätigt die Clientverbindung von der Serverseite.
Fazit
Damit endet das Tutorial zur Aktivierung von SSL für PostgreSQL-Verbindungen. Wenn Sie Fragen haben, posten Sie diese in den Kommentaren unten.
Erhalte neue Beiträge in deinem Posteingang.
Kein Spam. Jederzeit abmelden.