web-dev-qa-db-ja.com

PostgreSQLでSSL接続用のTLSv1.1プロトコルを構成するにはどうすればよいですか?

PostgreSQLでSSL接続用にTLS 1.1プロトコルを構成する必要があります。

PostgreSQL構成 でプロトコル設定を確認できませんでした

SSLプロトコルとTLSv1を無効にし、TLSv1.1(またはTLSv1.2)のみを有効にする必要があります

追加

PCI DSS v3.1では、SSLおよびTLSv1へのフォールバックを無効にする必要があります。

TLSv1.1のみを使用してネゴシエートするようにPostgreSQLを構成することは可能ですか?

それが不可能であることがわかっている場合は、この情報を共有してください

追加2

残念ながら、ssl_ciphersの構成は、異なるプロトコルに同じ暗号を使用できるため、十分ではありません。ここで説明されているようにSSL_METHODを構成する必要があります: https://www.openssl.org/docs/manmaster/ssl/ssl.html

SSL_METHOD(またはSSL_PROTOCOL)の構成がPostgreSQL構成から欠落しており、PCI DSS 3.1。

私が間違っていたら訂正してください。

7
Michael

@BrianEftingは正しかった、適切な暗号スイートを指定して、PCI-DSS 3.1仕様のニーズに適合するTLSv1.2のみを許可することができます。

ssl_cipherspostgresql.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

ssl_prefer_server_ciphers=trueの設定とともに、TLSv1.2接続のみを許可するには十分です。

これは、PostgreSQLプロトコルを認識する SSLyze を使用して確認できます。

テストするには、次のコマンドを使用しました。

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

これにより、Debian Wheezy上のPostgreSQL 9.4で以下の出力が得られ、指定されたTLSv1.2暗号を除くすべての暗号スイートが拒​​否され、TLSv1.1以降を使用してPCI-DSS 3.1の要件を満たす必要があることが示されました。

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$
13
Kassandry

次のリンクから:

18.3。接続と認証 (PostgreSQL 9.4マニュアル)

ssl_ciphersオプションを使用して、受け入れられる暗号のリストを指定できるようです。そしてそれはあなたのOpenSSLのバージョンがサポートするものは何でも従うと述べています。

そしてこのリンクでは:

OpenSSL Ciphers (OpenSSL.org)

TLSv1.1には特定の暗号スイートがないことに言及しましたが、TLSv1.2を指定できます。

4
Brian Efting

Confファイルでciphersの細かいリストの代わりにprotocols(TLSv1.2)を指定できます。

参照:

Postgresql.confを変更する

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

サービスを再起動します

/etc/init.d/postgresql94 restart

テストを再実行します

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

これは、デフォルトを使用して開始する場合に実行する必要があります:

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

また、opensslの新しいバージョンのTLS1.1、TLS1.0、SSLv2についても説明します。 (+ 3DESハックの詳細については、postgresqlのドキュメントを参照してください。opensslの新しいバージョンでは修正されているようです)。

そうでない場合、またはより明確にしたい場合は、':!SSLv2:!SSLv3:!TLSv1'を追加します

TLSv1.1も非推奨であるため、':!TLSv1.1'も追加することをお勧めします

これにより、次のようにデフォルトに基づいて最終的な「安全な」暗号文字列が得られます。HIGH:MEDIUM:+3DES:!aNULL:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1


以下を使用して、opensslのバージョンでテストできます:

openssl ciphers -v MY_CIPHER_STRING | column -t

これは、プロトコルに含まれるすべての暗号をリストします。

上記の「安全な」暗号リストのサンプル出力(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

注意する

暗号スイートSSLv3(同様にTLSv1など)は、SSLv3でサポートされるall暗号に拡張されます。つまり、これらの同じ暗号が上位プロトコルでも除外されます(存在する場合)。

実証するには:

openssl ciphers 'TLSv1:!SSLv3'

出力:

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

つまり、SSLv3で利用可能なすべての暗号はTLSv1でも利用できるため、暗号は返されません。

OPによって注記されているように、これは、より高いプロトコルの同じ暗号を除外せずに、暗号リストを介してSSLv3を無効にする方法がないことを意味します

実際には、これによりセキュリティが向上するだけですが、下位互換性の要件がある場合は問題が発生する可能性があります(mustTLSv1.0とできませんたとえばSSLv3をサポートしています)

TLSv1.1には新しい暗号が含まれていないため、!SSLv3を使用するとTLSv1.1も無効になります。

ご注意ください!

1
DylanYoung