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。
私が間違っていたら訂正してください。
@BrianEftingは正しかった、適切な暗号スイートを指定して、PCI-DSS 3.1仕様のニーズに適合するTLSv1.2のみを許可することができます。
ssl_ciphers
の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
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$
次のリンクから:
18.3。接続と認証 (PostgreSQL 9.4マニュアル)
ssl_ciphers
オプションを使用して、受け入れられる暗号のリストを指定できるようです。そしてそれはあなたのOpenSSLのバージョンがサポートするものは何でも従うと述べています。
そしてこのリンクでは:
OpenSSL Ciphers (OpenSSL.org)
TLSv1.1には特定の暗号スイートがないことに言及しましたが、TLSv1.2を指定できます。
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
これは、デフォルトを使用して開始する場合に実行する必要があります:
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も無効になります。
ご注意ください!