Wie kann das TLSv1.1-Protokoll für die SSL-Verbindung in PostgreSQL konfiguriert werden?

7

Ich muss das TLS 1.1-Protokoll für die SSL-Verbindung in PostgreSQL konfigurieren.

Ich konnte die Protokolleinstellungen in der PostgreSQL-Konfiguration nicht sehen

Es ist erforderlich, SSL-Protokolle und TLSv1 zu deaktivieren und nur TLSv1.1 (oder TLSv1.2) zu aktivieren.

Hinzugefügt

Für PCI DSS v3.1 muss der Fallback auf SSL und TLSv1 deaktiviert sein.

Ist es möglich, PostgreSQL so zu konfigurieren, dass nur mit TLSv1.1 verhandelt wird?

Wenn Sie wissen, dass dies nicht möglich ist, teilen Sie diese Informationen bitte mit

Hinzugefügt 2

Leider reicht die Konfiguration von ssl_ciphersnicht aus, da Sie dieselben Chiffren für verschiedene Protokolle verwenden können. Die Konfiguration muss SSL_METHODwie hier beschrieben erfolgen: https://www.openssl.org/docs/manmaster/ssl/ssl.html .

Mein Fazit, dass die Konfiguration von SSL_METHOD(oder SSL_PROTOCOL) in der PostgreSQL-Konfiguration fehlt und es keine Beschwerde bei PCI DSS 3.1 geben kann.

Bitte korrigieren Sie mich, wenn ich falsch liege.

Michael
quelle
5
Tom sagt : "libpq-Versionen vor 9.4 akzeptieren nur TLSv1 genau. In 9.4 sollte die höchste TLS-Version ausgehandelt werden, die sowohl vom Server als auch vom Client unterstützt wird." Sie könnten also am 9.1 Pech haben.
Josh Kupershmidt
Ist ein Upgrade auf 9.3 (vorzugsweise 9.4) eine Option?
Dekso
@dezso Ich habe meine Frage auf Version 9.4 geändert. In der Konfigurationsoption zum Konfigurieren des TLS 1.1-Protokolls für die SSL-Verbindung habe ich jedenfalls nichts gefunden.
Michael

Antworten:

13

@BrianEfting war korrekt. Sie können die entsprechenden Cipher Suites angeben, um nur TLSv1.2 zuzulassen, das Ihren PCI-DSS 3.1-Spezifikationsanforderungen entsprechen sollte.

Verwenden einer solchen Verschlüsselungsliste in der ssl_ciphersOption in Ihrem postgresql.conf:

ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:DHE-DSS-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:DHE-RSA-AES128-SHA256:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK

sollte zusammen mit der Einstellung ssl_prefer_server_ciphers=trueausreichen, um nur TLSv1.2-Verbindungen zuzulassen.

Sie können dies mit SSLyze überprüfen, das das PostgreSQL-Protokoll kennt.

Zum Testen habe ich den folgenden Befehl verwendet:

./sslyze.py --sslv2 --sslv3 --tlsv1 --tlsv1_1 --tlsv1_2 localhost:5432 --starttls=postgres --hide_rejected_ciphers

Dies ergab die folgende Ausgabe unter PostgreSQL 9.4 unter Debian Wheezy, aus der hervorgeht, dass alle Cipher Suites mit Ausnahme der angegebenen TLSv1.2-Chiffren abgelehnt wurden, die die Anforderungen von PCI-DSS 3.1 durch Verwendung von TLSv1.1 oder höher erfüllen sollten.

postgres@pgsqlsec4:~/sslyze$ ./sslyze.py --sslv2 --sslv3 --tlsv1 --tlsv1_1 --tlsv1_2 localhost:5432 --starttls=postgres --hide_rejected_ciphers



 AVAILABLE PLUGINS
 -----------------

  PluginCompression
  PluginHeartbleed
  PluginChromeSha1Deprecation
  PluginSessionRenegotiation
  PluginOpenSSLCipherSuites
  PluginSessionResumption
  PluginHSTS
  PluginCertInfo



 CHECKING HOST(S) AVAILABILITY
 -----------------------------

   localhost:5432                      => ::1:5432



 SCAN RESULTS FOR LOCALHOST:5432 - ::1:5432
 ------------------------------------------

  * SSLV2 Cipher Suites:
      Server rejected all cipher suites.

  * TLSV1_2 Cipher Suites:
      Preferred:                       
                 ECDHE-RSA-AES128-GCM-SHA256   ECDH-256 bits  128 bits                                         
      Accepted:                        
                 ECDHE-RSA-AES256-SHA384       ECDH-256 bits  256 bits                                         
                 ECDHE-RSA-AES256-GCM-SHA384   ECDH-256 bits  256 bits                                         
                 DHE-RSA-AES256-SHA256         DH-1024 bits   256 bits                                         
                 DHE-RSA-AES256-GCM-SHA384     DH-1024 bits   256 bits                                         
                 ECDHE-RSA-AES128-SHA256       ECDH-256 bits  128 bits                                         
                 ECDHE-RSA-AES128-GCM-SHA256   ECDH-256 bits  128 bits                                         
                 DHE-RSA-AES128-SHA256         DH-1024 bits   128 bits                                         
                 DHE-RSA-AES128-GCM-SHA256     DH-1024 bits   128 bits                                         

  * TLSV1_1 Cipher Suites:
      Server rejected all cipher suites.

  * TLSV1 Cipher Suites:
      Server rejected all cipher suites.

  * SSLV3 Cipher Suites:
      Server rejected all cipher suites.



 SCAN COMPLETED IN 0.73 S
 ------------------------
postgres@pgsqlsec4:~/sslyze$
Kassandry
quelle
Es ist die Problemumgehung. Noch einmal: Es ist erforderlich, das Protokoll zu konfigurieren, und es wird in der PostgreSQL-Konfiguration nicht berücksichtigt. Ich kann die Antwort nicht akzeptieren. Auf jeden Fall habe ich kein Problem damit, ein Kopfgeld für die harte Arbeit zu geben.
Michael
@Michael Dies ist funktional identisch mit dem Deaktivieren von TLS v1.0. Es gibt eine neue Konfigurationsanweisung in Version 12 von Postgres, die jedoch noch nicht veröffentlicht wurde:ssl_min_protocol_version=TLSv1.1
deed02392
4

Über den folgenden Link:

18.3. Verbindungen und Authentifizierung (PostgreSQL 9.4 Handbuch)

Es scheint, dass Sie die ssl_ciphersOption verwenden können, um Ihre Liste der akzeptierten Chiffren anzugeben. Und es wird erwähnt, dass es folgt, was auch immer Ihre Version von OpenSSL unterstützt.

Und in diesem Link:

OpenSSL-Chiffren (OpenSSL.org)

Erwähnt, dass es für TLSv1.1 keine spezifische Chiffrensuite gibt, Sie jedoch TLSv1.2 angeben können.

Brian Efting
quelle
Leider reicht die Konfiguration von ssl_ciphersnicht aus, da Sie dieselben Chiffren für verschiedene Protokolle verwenden können. Die Konfiguration muss SSL_METHODwie hier beschrieben erfolgen: openssl.org/docs/manmaster/ssl/ssl.html . Mein Fazit, dass die Konfiguration von SSL_METHOD(oder SSL_PROTOCOL) in der PostgreSQL-Konfiguration fehlt und es keine Beschwerde bei PCI DSS 3.1 geben kann. Bitte korrigieren Sie mich, wenn ich falsch liege.
Michael
Na danke Michael. Ich denke, @Kassandry hat härter gearbeitet als ich und verdient hier einige ernsthafte Requisiten. Sogar so weit zu testen und zu sehen, dass die unsicheren Methoden tatsächlich abgelehnt werden.
Brian Efting
Ja, aber Sie waren der erste mit diesem Ansatz. Leider kann ich das Kopfgeld nicht ausspucken
Michael
2

Sie können die Protokolle (TLSv1.2) anstelle einer feinkörnigen Liste von Chiffren in der conf-Datei angeben.

Verweise:

Ändern Sie die Datei postgresql.conf

ssl_ciphers = 'TLSv1.2:!aNULL'
ssl_prefer_server_ciphers=true

Starten Sie den Dienst neu

/etc/init.d/postgresql94 restart

Führen Sie den Test erneut aus

sslyze  --sslv2 --sslv3 --tlsv1 --tlsv1_1 --tlsv1_2 localhost:5432 --starttls=postgres --hide_rejected_ciphers
friendyogi
quelle
1

Dies sollte es tun, wenn Sie die Standardeinstellungen zum Starten verwenden:

ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL:!SSLv3'

Es behandelt auch TLS1.1, TLS1.0 und SSLv2 in neueren Versionen von openssl. (Informationen zum + 3DES-Hack finden Sie in den Postgresql-Dokumenten. Es scheint in neueren Versionen von openssl behoben worden zu sein.)

Wenn nicht oder wenn Sie expliziter sein möchten, fügen Sie einfach Folgendes hinzu: ':!SSLv2:!SSLv3:!TLSv1'

TLSv1.1 ist ebenfalls veraltet, daher empfehle ich auch das Anhängen ':!TLSv1.1'

Dies ergibt eine endgültige "sichere" Verschlüsselungszeichenfolge basierend auf der Standardeinstellung wie folgt: HIGH:MEDIUM:+3DES:!aNULL:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1


Sie können mit Ihrer Version von openssl Folgendes testen:

openssl ciphers -v MY_CIPHER_STRING | column -t

Hier werden alle Chiffren aufgelistet, die in ihrem Protokoll enthalten sein werden.

Beispielausgabe mit der obigen Liste "sicherer" Chiffren (opensslv1.0.1):

ECDHE-RSA-AES256-GCM-SHA384    TLSv1.2  Kx=ECDH        Au=RSA    Enc=AESGCM(256)  Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384  TLSv1.2  Kx=ECDH        Au=ECDSA  Enc=AESGCM(256)  Mac=AEAD
ECDHE-RSA-AES256-SHA384        TLSv1.2  Kx=ECDH        Au=RSA    Enc=AES(256)     Mac=SHA384
ECDHE-ECDSA-AES256-SHA384      TLSv1.2  Kx=ECDH        Au=ECDSA  Enc=AES(256)     Mac=SHA384
DHE-DSS-AES256-GCM-SHA384      TLSv1.2  Kx=DH          Au=DSS    Enc=AESGCM(256)  Mac=AEAD
DHE-RSA-AES256-GCM-SHA384      TLSv1.2  Kx=DH          Au=RSA    Enc=AESGCM(256)  Mac=AEAD
DHE-RSA-AES256-SHA256          TLSv1.2  Kx=DH          Au=RSA    Enc=AES(256)     Mac=SHA256
DHE-DSS-AES256-SHA256          TLSv1.2  Kx=DH          Au=DSS    Enc=AES(256)     Mac=SHA256
ECDH-RSA-AES256-GCM-SHA384     TLSv1.2  Kx=ECDH/RSA    Au=ECDH   Enc=AESGCM(256)  Mac=AEAD
ECDH-ECDSA-AES256-GCM-SHA384   TLSv1.2  Kx=ECDH/ECDSA  Au=ECDH   Enc=AESGCM(256)  Mac=AEAD
ECDH-RSA-AES256-SHA384         TLSv1.2  Kx=ECDH/RSA    Au=ECDH   Enc=AES(256)     Mac=SHA384
ECDH-ECDSA-AES256-SHA384       TLSv1.2  Kx=ECDH/ECDSA  Au=ECDH   Enc=AES(256)     Mac=SHA384
AES256-GCM-SHA384              TLSv1.2  Kx=RSA         Au=RSA    Enc=AESGCM(256)  Mac=AEAD
AES256-SHA256                  TLSv1.2  Kx=RSA         Au=RSA    Enc=AES(256)     Mac=SHA256
ECDHE-RSA-AES128-GCM-SHA256    TLSv1.2  Kx=ECDH        Au=RSA    Enc=AESGCM(128)  Mac=AEAD
ECDHE-ECDSA-AES128-GCM-SHA256  TLSv1.2  Kx=ECDH        Au=ECDSA  Enc=AESGCM(128)  Mac=AEAD
ECDHE-RSA-AES128-SHA256        TLSv1.2  Kx=ECDH        Au=RSA    Enc=AES(128)     Mac=SHA256
ECDHE-ECDSA-AES128-SHA256      TLSv1.2  Kx=ECDH        Au=ECDSA  Enc=AES(128)     Mac=SHA256
DHE-DSS-AES128-GCM-SHA256      TLSv1.2  Kx=DH          Au=DSS    Enc=AESGCM(128)  Mac=AEAD
DHE-RSA-AES128-GCM-SHA256      TLSv1.2  Kx=DH          Au=RSA    Enc=AESGCM(128)  Mac=AEAD
DHE-RSA-AES128-SHA256          TLSv1.2  Kx=DH          Au=RSA    Enc=AES(128)     Mac=SHA256
DHE-DSS-AES128-SHA256          TLSv1.2  Kx=DH          Au=DSS    Enc=AES(128)     Mac=SHA256
ECDH-RSA-AES128-GCM-SHA256     TLSv1.2  Kx=ECDH/RSA    Au=ECDH   Enc=AESGCM(128)  Mac=AEAD
ECDH-ECDSA-AES128-GCM-SHA256   TLSv1.2  Kx=ECDH/ECDSA  Au=ECDH   Enc=AESGCM(128)  Mac=AEAD
ECDH-RSA-AES128-SHA256         TLSv1.2  Kx=ECDH/RSA    Au=ECDH   Enc=AES(128)     Mac=SHA256
ECDH-ECDSA-AES128-SHA256       TLSv1.2  Kx=ECDH/ECDSA  Au=ECDH   Enc=AES(128)     Mac=SHA256
AES128-GCM-SHA256              TLSv1.2  Kx=RSA         Au=RSA    Enc=AESGCM(128)  Mac=AEAD
AES128-SHA256                  TLSv1.2  Kx=RSA         Au=RSA    Enc=AES(128)     Mac=SHA256

IN ACHT NEHMEN

Die Chiffresuite SSLv3 (ebenfalls TLSv1 usw.) wird auf alle von SSLv3 unterstützten Chiffren erweitert . Dies bedeutet, dass dieselben Chiffren auch in höheren Protokollen ausgeschlossen werden (sofern sie dort vorhanden sind).

Demonstrieren:

openssl ciphers 'TLSv1:!SSLv3'

Ausgabe:

Error in cipher list
139740792764064:error:1410D0B9:SSL routines:SSL_CTX_set_cipher_list:no cipher match:ssl_lib.c:1312:

Das heißt, da jede in SSLv3 verfügbare Verschlüsselung auch in TLSv1 verfügbar ist, werden keine Chiffren zurückgegeben.

Wie vom OP festgestellt, bedeutet dies, dass es keine Möglichkeit gibt, SSLv3 über die Verschlüsselungsliste zu deaktivieren, ohne dieselbe Verschlüsselung auch für höhere Protokolle auszuschließen

In der Praxis sollte dies nur zu einer besseren Sicherheit führen, kann jedoch Probleme für Personen mit Abwärtskompatibilitätsanforderungen verursachen ( muss TLSv1.0 unterstützen und kann beispielsweise SSLv3 nicht unterstützen).

Da TLSv1.1 keine neuen Chiffren enthält, wird es auch deaktiviert, wenn Sie es verwenden !SSLv3.

Achtung!

DylanYoung
quelle