Projekt

Allgemein

Profil

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)