SSL » Historie » Version 6
[E] Rocco Kreutz, 16.12.2025 14:26
| 1 | 1 | [E] Rocco Kreutz | {{TOC}} |
|---|---|---|---|
| 2 | |||
| 3 | h1. SSL |
||
| 4 | |||
| 5 | * Um SSL für PG-Server zu aktivieren müssen sowohl die postgresql.conf als auch die pg_hba.conf angepasst werden |
||
| 6 | * Ausserdem wird ein SSL Zertifikat benötigt |
||
| 7 | |||
| 8 | h2. SSL Zertifikat |
||
| 9 | |||
| 10 | * Im Allereinfachsten Fall reicht ein selbstsigniertes Zertifikat |
||
| 11 | ** In diesem Falle wird ist das effektive Ergebniss, dass der Traffic verschlüsselt wird zwischen Server und Client (sofern der Client SSL aushandelt) |
||
| 12 | ** MITM-Attacken werden damit nicht verhindert, da keine Verifizierung des Zertifikates selber gegen Trusted Root-CA stattfinden kann |
||
| 13 | ** In diesem Fall ist es NICHT notwendig den DN des Zertifikates korrekt zu setzen, da dieser ebenfalls nicht verifiziert wird |
||
| 14 | ** "Prodat-Mobile, selbstsigniertes Zertifkat erstellen":https://redmine.prodat-sql.de/projects/prodat-v12-public/wiki/Mobile_+_App_Zertifikate_Cert_f%C3%BCr_das_eigene_Intranet liefert ausführliche Anleitung, welche auch hier zutrifft |
||
| 15 | * Derzeit ist das Prodat nicht in der Lage zusätzlich zum verschlüsseln des Traffics auch das Zertifikat zu verifizieren |
||
| 16 | * Prodat benutzt jedoch wenn möglich SSL (TLS1.2) um zu verhindern, dass Passworte (Login) im Klartext über die Leitung gehen |
||
| 17 | * Im jeweiligen DATA directory des PG-Servers soll dann ein UNterverzeichniss 'ssl' angelegt werden, in welchem die Zertifikats-Dateien abgelegt werden |
||
| 18 | ** Unter Windows DARF das private key file NICHT passphrase protected sein !!! |
||
| 19 | ** Dies bedeutet, diese Datei liegt im Plain-PEM Format vor und der Key ist damit nicht gschützt, daher extra Verzeichniss, damit ACL's sauber darauf gesetzt werden können |
||
| 20 | ** SELECT pg_read_file(current_setting('ssl/ssl_key_file')); |
||
| 21 | *** Dies erlaubt JEDEM superuiser und JEDEM welcher Mitglied der System-Internen Rolle "pg_read_server_files" ist, den privaten key auszulesen !!! |
||
| 22 | *** problematische Rechte: |
||
| 23 | **** SUPERUSER |
||
| 24 | **** pg_read_server_files |
||
| 25 | **** pg_write_server_files |
||
| 26 | **** pg_execute_server_program |
||
| 27 | 6 | [E] Rocco Kreutz | * Abgelaufene Zertifikate sind nur dann ein Problem, wenn der Client ein Verify ausführt |
| 28 | ** Prodat verifiziiert bislang nicht (kann es nicht) |
||
| 29 | ** PGAdmin verifiziiert bislang nicht |
||
| 30 | ** HeidiSQL verifiziiert bislang nicht, selbst wenn es eingestellt ist |
||
| 31 | ** One important gotcha in PostgreSQL/libpq: |
||
| 32 | *** If a root CA file exists on the client (~/.postgresql/root.crt), then for backward compatibility sslmode=require can behave like verify-ca (i.e., it does validate the server cert chain). In that case, an expired server certificate can suddenly start causing failures even though you thought you weren’t validating. |
||
| 33 | 1 | [E] Rocco Kreutz | |
| 34 | |||
| 35 | |||
| 36 | h2. postgresql.conf |
||
| 37 | |||
| 38 | * <pre><code class="conf"> |
||
| 39 | ssl = on |
||
| 40 | ssl_cert_file = 'ssl/pgserver.chain' |
||
| 41 | ssl_key_file = 'ssl/pgserver.key' |
||
| 42 | |||
| 43 | ssl_min_protocol_version = 'TLSv1.2' |
||
| 44 | ssl_max_protocol_version = 'TLSv1.2' |
||
| 45 | |||
| 46 | ssl_ciphers = 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:AES128-SHA:AES256-SHA:!aNULL:!eNULL:!MD5:!RC4:!3DES' |
||
| 47 | ssl_prefer_server_ciphers = on |
||
| 48 | </code></pre> |
||
| 49 | ** "Prodat-Mobile Anweisung":https://redmine.prodat-sql.de/projects/prodat-v12-public/wiki/Mobile_+_App_Zertifikate_Cert_f%C3%BCr_das_eigene_Intranet#Ben%C3%B6tigte-Zertifikats-Dateien-f%C3%BCr-Service-exportieren folgend, wäre pgserver.key der "Private Key" und pgserver.chain "Zertifikats-Kette (Chain)" |
||
| 50 | ** Der Rest der Configuratioin muss exakt so eingetragen werden |
||
| 51 | *** Prodat kann derzeit nur OpenSSL 1.0.2 Bibliotheken verwenden, welche maximal TLS1.2 anbieten |
||
| 52 | *** Die aufgelisteten Ciphers stellen sicher, das mit diesem älteren Standard keine unsicheren Verschlüsselungen ausgehandelt werden können |
||
| 53 | ** Unterordner für Zertifikate benutzen, damit ACL's gesetzt werden können, ohne anderes zu beeinflussen |
||
| 54 | 4 | [E] Rocco Kreutz | * "defaults":https://redmine.prodat-sql.de/projects/prodat-v12-public/wiki/710_Datenbankeinstellungen_und_Tuning_(postgresql_conf) |
| 55 | 1 | [E] Rocco Kreutz | |
| 56 | h2. pg_hba.conf |
||
| 57 | |||
| 58 | 2 | [E] Rocco Kreutz | * Abhängig davon, ob SSL nur erlaubt sein soll oder erforderlich sein soll, muss pg_hba.conf angepasst werden |
| 59 | 5 | [E] Rocco Kreutz | * Anstatt: <pre><code class="yaml">host all root,postgres,SYS.dblink,APPS 0.0.0.0/0 reject</code></pre> müssen jetzt 2 Zeilen eingetragen werden |
| 60 | <pre><code class="yaml">hostssl all root,postgres,SYS.dblink,APPS 0.0.0.0/0 reject # Standard-Super-User restrict by default from outside |
||
| 61 | 1 | [E] Rocco Kreutz | hostnossl all root,postgres,SYS.dblink,APPS 0.0.0.0/0 reject # Standard-Super-User restrict by default from outside</code></pre> |
| 62 | 3 | [E] Rocco Kreutz | ** Jeweils 1 für SSL und eine für ohne SSL |
| 63 | 4 | [E] Rocco Kreutz | * "defaults, SSL erlaubt, nicht erforderlich":https://redmine.prodat-sql.de/projects/prodat-v12-public/wiki/PostgreSQL_Netzwerkkonfiguration_(pg_hbaconf) |