4.11. TLS 設定の強化

TLS (トランスポート層セキュリティー) は、ネットワーク通信をセキュアにするために使用する暗号化プロトコルです。優先する鍵交換プロトコル認証方法、および暗号化アルゴリズムを設定することでシステムのセキュリティー設定を強化する際には、サポートするクライアントの範囲が広ければ広いほど、セキュリティーのレベルが低くなることを認識しておく必要があります。反対に、セキュリティー設定を厳密にすると、クライアントとの互換性が制限され、システムからロックアウトされるユーザーが出てくる可能性もあります。可能な限り厳密な設定を目指し、互換性のために必要な場合にのみ、これを緩めるようにしてください。
Red Hat Enterprise Linux 7 に含まれるライブラリーが提供するデフォルト設定は、ほとんどの導入において十分に安全なものです。TLS 実装は、可能な場合はセキュアなアルゴリズムを使用する一方で、レガシークライアントまたはサーバーとの接続を妨げません。セキュアなアルゴリズムやプロトコルをサポートしていないレガシーのクライアントやサーバーの接続が期待できない場合やそれらの接続が許可されない場合に、厳密なセキュリティー要件の環境で本セクションで説明されている強化設定を適用してください。

4.11.1. 有効にするアルゴリズムの選択

選択して設定する必要があるコンポーネントがいくつかあります。以下で説明するものはすべて、その設定結果 (つまり、クライアントにおけるサポートレベル) やシステム上でソリューションが持つコンピューターのデマンドに直接影響します。

プロトコルのバージョン

最新バージョンの TLS は、すぐれたセキュリティーメカニズムを提供します。古いバージョンの TLS (さらに SSL) のサポートを含める切実な理由がなければ、最新バージョンの TLS のみを使ってシステムが接続するようにしてください。
SSL のバージョン 2 または 3 を使った処理を許可しないでください。これらのバージョンには、セキュリティーに関する重大な脆弱性があります。TLS のバージョン 1.0 以上を使った処理のみを許可してください。現行の TLS バージョン 1.2 を常に優先するようにしてください。

注記

TLS の全バージョンのセキュリティーは現在、TLS 拡張機能、特定の暗号 (下記参照)、および他の回避策に依存していることに注意してください。TLS の接続ピアはすべてセキュアな再交渉記号 (RFC 5746) を実装する必要があり、圧縮をサポートしていない必要があります。また、CBC モードの暗号 (Lucky Thirteen 攻撃) に対するタイミング攻撃を緩和する方法を実装する必要があります。TLS v1.0 クライアントはさらに、レコード分割 (BEAST 攻撃に対する回避策) を実装する必要があります。TLS v1.2 は、AES-GCMAES-CCM、または Camellia-GCM といった既知の問題のない 認証付き暗号 (Authenticated Encryption with Associated Data : AEAD) モードの暗号をサポートしています。ここに記載された緩和策はすべて、Red Hat Enterprise Linux に含まれる暗号ライブラリーに実装されています。
プロトコルのバージョンおよび推奨される使用方法についての概要は、表4.6「プロトコルのバージョン」 を参照してください。

表4.6 プロトコルのバージョン

プロトコルのバージョン推奨される使用方法
SSL v2
使用しないでください。重大なセキュリティー上の脆弱性があります。
SSL v3
使用しないでください。重大なセキュリティー上の脆弱性があります。
TLS v1.0
必要な場合は、相互運用性目的で使用します。相互運用性を保証する方法では緩和できない既知の問題があります。このため、緩和策はデフォルトでは有効になっていません。最新の暗号化スイートには対応していません。
TLS v1.1
必要な場合は、相互運用性目的で使用します。既知の問題はありませんが、Red Hat Enterprise Linux の TLS 実装すべてに含まれるプロトコル修正に依存します。最新の暗号化スイートには対応していません。
TLS v1.2
推奨されるバージョンです。最新の AEAD 暗号化スイートに対応しています。
Red Hat Enterprise Linux のコンポーネントのなかには、TLS v1.1v1.2 に対応しているのに TLS v1.0 を使用する設定になっているものもあります。これは、最新バージョンの TLS に対応していない可能性のある外部サービスとの最高レベルの相互運用性を達成する目的でこのようになっています。相互運用性の要件に対応して、利用可能な最高レベルの TLS バージョンを有効にしてください。

重要

SSL v3 の使用は推奨されません。これは安全ではなく一般の使用には適していませんが、SSL v3 をどうしても有効にする必要がある場合は、「stunnel の使用」 を参照してください。暗号化に対応していない、または旧式で安全でない暗号化モードの使用しかできないサービスを使用する場合でも、stunnel を使用して安全に通信を暗号化する方法が説明されています。

暗号化スイート

旧式の安全でない 暗号化スイート ではなく、最近のより安全なものを使ってください。eNULL および aNULL 暗号化スイートは暗号化や認証をまったく提供しないので、常に無効にしてください。RC4HMAC-MD5 をベースとした暗号化スイートには重大な欠陥があるので、可能な場合はこれらも無効にしてください。いわゆる エクスポート暗号化スイートも同様にしてください。これらは意図的に弱くなっているので、侵入が容易になっています。
128 ビット未満のセキュリティーしか提供しない暗号化スイートは直ちに不安というわけではありませんが、これらは短期間の使用に考慮すべきではありません。128 ビット以上のセキュリティーを使用するアルゴリズムは少なくとも数年間は解読不可能であることが期待されているので、強く推奨されます。3DES 暗号は 168 ビットの使用といわれていますが、実際に提供されているのは 112 ビットのセキュリティーであることに注意してください。
(perfect) forward secrecy (PFS) をサポートしている暗号化スイートを常に優先させてください。PFS は、サーバー鍵が漏れたとしても、暗号化されたデータの秘密性は確保されます。これにより、すばやい RSA 鍵の交換がなくなる一方、ECDHE および DHE の使用が可能になります。これら 2 つのうちでは、ECDHE の方がより速いため、優先される選択肢となります。
AES-GCM などの AEAD 暗号はパディングオラクル攻撃 (padding oracle attacks) に対して脆弱ではないため、CBC モードの暗号よりも優先してください。さらに多くの場合、AES-GCM は特にハードウェアに AES 用の暗号化アクセラレーターがある場合、CBC モードの AES よりも高速です。
また、ECDSA 証明書を使って ECDHE 鍵交換を使用する際は、純粋な RSA 鍵交換よりも速くなります。レガシークライアント用のサポートを提供するには、サーバー上に証明書と鍵のペアを 2 つインストールします。ひとつは ECDSA 鍵 (新規クライアント用) で、もうひとつは RSA 鍵 (レガシークライアント用) です。

公開鍵の長さ

RSA 鍵を使用する際は常に、少なくとも SHA-256 で署名された 最低 3072 ビットの鍵の長さを優先させます。これは、真の 128 ビットのセキュリティーでは十分な大きさです。

警告

システムのセキュリティー強度は、チェーンの中の最も弱いリンクが示すものと同じであるということを念頭に置いてください。たとえば、強力な暗号化だけではすぐれたセキュリティーは保証されません。鍵と証明書も同様に重要で、認証機関 (CA) が鍵の署名に使用するハッシュ機能と鍵もまた重要になります。

4.11.2. TLS 実装の使用

Red Hat Enterprise Linux 7 には、完全機能の TLS 実装が同梱されています。本セクションでは、OpenSSL および GnuTLS の設定を説明します。個別アプリケーションでの TLS サポートの設定方法については、「特定アプリケーションの設定」 を参照してください。
利用可能な TLS 実装は、各種の 暗号化スイートをサポートします。これらのスイートは、TLS でセキュア化された通信の確立および使用時に一緒に送られる全要素を定義します。
「有効にするアルゴリズムの選択」 で示された推奨事項を検討するとともに、各種の実装で含まれているツールを使って、ご自分のユースケースにとって最善のセキュリティーを提供する暗号化スイートを一覧表示、指定してください。そこでできた暗号化スイートを使って、各アプリケーションが接続を処理してセキュア化することができます。

重要

使用する TLS 実装またはその実装を利用するアプリケーションが更新またはアップグレードされた後は、必ず設定をチェックしてください。新しいバージョンは、ユーザーが有効化を希望せずかつ使用中の設定では無効にされない、新たな暗号化スイートを導入する場合があります。

4.11.2.1. OpenSSL での暗号化スイートの使用

OpenSSL は、SSL および TLS プロトコルをサポートするツールキットおよび暗号化ライブラリーです。Red Hat Enterprise Linux 7 では、設定ファイルは /etc/pki/tls/openssl.cnf にあります。その形式は、config(1) で確認できます。「OpenSSL の設定」 も参照してください。
インストール済みの OpenSSL でサポートされている暗号化スイートすべてを一覧表示するには、以下のように openssl コマンドで ciphers サブコマンドを実行します。
~]$ openssl ciphers -v 'ALL:COMPLEMENTOFALL'
(OpenSSL ドキュメンテーションでは cipher strings および keywords と呼ばれる) 他のパラメーターを ciphers コマンドに渡して出力を絞ります。特別なキーワードを使うと、特定の条件を満たすスイートのみを一覧表示することができます。たとえば、HIGH グループに属するスイートのみを一覧表示するには、以下のコマンドを実行します。
~]$ openssl ciphers -v 'HIGH'
利用可能なキーワードおよび暗号化文字列の一覧は、ciphers(1) の man ページを参照してください。
「有効にするアルゴリズムの選択」 の推奨事項を満たす暗号化スイートを一覧表示するには、以下のようなコマンドを実行します。
~]$ openssl ciphers -v 'kEECDH+aECDSA+AES:kEECDH+AES+aRSA:kEDH+aRSA+AES' | column -t
ECDHE-ECDSA-AES256-GCM-SHA384  TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=AESGCM(256)  Mac=AEAD
ECDHE-ECDSA-AES256-SHA384      TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=AES(256)     Mac=SHA384
ECDHE-ECDSA-AES256-SHA         SSLv3    Kx=ECDH  Au=ECDSA  Enc=AES(256)     Mac=SHA1
ECDHE-ECDSA-AES128-GCM-SHA256  TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=AESGCM(128)  Mac=AEAD
ECDHE-ECDSA-AES128-SHA256      TLSv1.2  Kx=ECDH  Au=ECDSA  Enc=AES(128)     Mac=SHA256
ECDHE-ECDSA-AES128-SHA         SSLv3    Kx=ECDH  Au=ECDSA  Enc=AES(128)     Mac=SHA1
ECDHE-RSA-AES256-GCM-SHA384    TLSv1.2  Kx=ECDH  Au=RSA    Enc=AESGCM(256)  Mac=AEAD
ECDHE-RSA-AES256-SHA384        TLSv1.2  Kx=ECDH  Au=RSA    Enc=AES(256)     Mac=SHA384
ECDHE-RSA-AES256-SHA           SSLv3    Kx=ECDH  Au=RSA    Enc=AES(256)     Mac=SHA1
ECDHE-RSA-AES128-GCM-SHA256    TLSv1.2  Kx=ECDH  Au=RSA    Enc=AESGCM(128)  Mac=AEAD
ECDHE-RSA-AES128-SHA256        TLSv1.2  Kx=ECDH  Au=RSA    Enc=AES(128)     Mac=SHA256
ECDHE-RSA-AES128-SHA           SSLv3    Kx=ECDH  Au=RSA    Enc=AES(128)     Mac=SHA1
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-RSA-AES256-SHA             SSLv3    Kx=DH    Au=RSA    Enc=AES(256)     Mac=SHA1
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-RSA-AES128-SHA             SSLv3    Kx=DH    Au=RSA    Enc=AES(128)     Mac=SHA1
上記のコマンドはセキュアでない暗号をすべて省略し、ephemeral elliptic curve Diffie-Hellman 鍵交換と ECDSA 暗号を優先します。また、RSA 鍵交換も省略します (perfect forward secrecy が保証されます)。
これはやや厳密な設定であることに注意してください。現実には条件を多少緩和して、より広い範囲のクライアントとの互換性を可能にする必要があるかもしれません。

4.11.2.2. GnuTLS での暗号化スイートの使用

GnuTLS は、SSL および TLS の各プロトコルとそれに関連する技術を実装する通信ライブラリーです。

注記

Red Hat Enterprise Linux 7 上の GnuTLS は、ほとんどのユースケースに十分なセキュリティーをもたらす、最適なデフォルト設定値を提供します。特別なセキュリティー要件がない限り、提供されたデフォルト値の使用が推奨されます。
gnutls-cli コマンドを -l (または --list) オプションと実行すると、サポート対象の暗号化スイートすべてが一覧表示されます。
~]$ gnutls-cli -l
-l オプションで表示された暗号化スイート一覧を絞り込むには、ひとつ以上のパラメーター (GnuTLS ドキュメンテーションでは priority strings および keywords と呼ばれる) を --priority オプションに渡します。利用可能な priority strings の全一覧は、http://www.gnutls.org/manual/gnutls.html#Priority-Strings にある GnuTLS ドキュメンテーションを参照してください。たとえば、少なくとも 128 ビットのセキュリティーを提供する暗号化スイート一覧を表示するには、以下のコマンドを実行します。
~]$ gnutls-cli --priority SECURE128 -l
「有効にするアルゴリズムの選択」 の推奨事項を満たす暗号化スイートを一覧表示するには、以下のようなコマンドを実行します。
~]$ gnutls-cli --priority SECURE256:+SECURE128:-VERS-TLS-ALL:+VERS-TLS1.2:-RSA:-DHE-DSS:-CAMELLIA-128-CBC:-CAMELLIA-256-CBC -l
Cipher suites for SECURE256:+SECURE128:-VERS-TLS-ALL:+VERS-TLS1.2:-RSA:-DHE-DSS:-CAMELLIA-128-CBC:-CAMELLIA-256-CBC
TLS_ECDHE_ECDSA_AES_256_GCM_SHA384                      0xc0, 0x2c      TLS1.2
TLS_ECDHE_ECDSA_AES_256_CBC_SHA384                      0xc0, 0x24      TLS1.2
TLS_ECDHE_ECDSA_AES_256_CBC_SHA1                        0xc0, 0x0a      SSL3.0
TLS_ECDHE_ECDSA_AES_128_GCM_SHA256                      0xc0, 0x2b      TLS1.2
TLS_ECDHE_ECDSA_AES_128_CBC_SHA256                      0xc0, 0x23      TLS1.2
TLS_ECDHE_ECDSA_AES_128_CBC_SHA1                        0xc0, 0x09      SSL3.0
TLS_ECDHE_RSA_AES_256_GCM_SHA384                        0xc0, 0x30      TLS1.2
TLS_ECDHE_RSA_AES_256_CBC_SHA1                          0xc0, 0x14      SSL3.0
TLS_ECDHE_RSA_AES_128_GCM_SHA256                        0xc0, 0x2f      TLS1.2
TLS_ECDHE_RSA_AES_128_CBC_SHA256                        0xc0, 0x27      TLS1.2
TLS_ECDHE_RSA_AES_128_CBC_SHA1                          0xc0, 0x13      SSL3.0
TLS_DHE_RSA_AES_256_CBC_SHA256                          0x00, 0x6b      TLS1.2
TLS_DHE_RSA_AES_256_CBC_SHA1                            0x00, 0x39      SSL3.0
TLS_DHE_RSA_AES_128_GCM_SHA256                          0x00, 0x9e      TLS1.2
TLS_DHE_RSA_AES_128_CBC_SHA256                          0x00, 0x67      TLS1.2
TLS_DHE_RSA_AES_128_CBC_SHA1                            0x00, 0x33      SSL3.0

Certificate types: CTYPE-X.509
Protocols: VERS-TLS1.2
Compression: COMP-NULL
Elliptic curves: CURVE-SECP384R1, CURVE-SECP521R1, CURVE-SECP256R1
PK-signatures: SIGN-RSA-SHA384, SIGN-ECDSA-SHA384, SIGN-RSA-SHA512, SIGN-ECDSA-SHA512, SIGN-RSA-SHA256, SIGN-DSA-SHA256, SIGN-ECDSA-SHA256
上記のコマンドは、出力を 128 ビット以上のセキュリティーがある暗号に絞り込み、より強力なものを優先しています。また、RSA 鍵交換と DSS 認証を禁止しています。
これはやや厳密な設定であることに注意してください。現実には条件を多少緩和して、より広い範囲のクライアントとの互換性を可能にする必要があるかもしれません。

4.11.3. 特定アプリケーションの設定

アプリケーションはそれぞれ、TLS 用に個別の設定メカニズムを提供します。本セクションでは、最も一般的に使用されているサーバーアプリケーションが使用する TLS 関連の設定ファイルについて説明し、よくある説明例を示します。
いずれの設定を選択しても、サーバーアプリケーションが サーバー側の暗号命令 を強制し、使用される暗号化スイートが必ずユーザー設定の命令で決定されるようにしてください。

4.11.3.1. Apache HTTP サーバーの設定

Apache HTTP Server は、TLSOpenSSLNSS の両方のライブラリーを使用できます。選択した TLS ライブラリーによって、mod_sslmod_nss のモジュールをインストールする必要があります (その名前の付いたパッケージが提供)。たとえば、OpenSSL mod_ssl モジュールを提供するパッケージをインストールするには、root で以下のコマンドを実行します。
~]# yum install mod_ssl
mod_ssl パッケージは /etc/httpd/conf.d/ssl.conf 設定ファイルをインストールし、これを使うと Apache HTTP ServerTLS 関連の設定を修正できます。同様に、mod_nss パッケージは /etc/httpd/conf.d/nss.conf 設定ファイルをインストールします。
httpd-manual パッケージをインストールして Apache HTTP Server の完全なドキュメンテーションを取得します。これには、TLS 設定が含まれます。/etc/httpd/conf.d/ssl.conf 設定ファイルで利用可能なディレクティブの詳細は、/usr/share/httpd/manual/mod/mod_ssl.html で説明されています。各種設定の例は、/usr/share/httpd/manual/ssl/ssl_howto.html で確認できます。
/etc/httpd/conf.d/ssl.conf 設定ファイルの設定を修正する場合は、少なくとも下記の 3 つのディレクティブを確認してください。
SSLProtocol
許可する TLS (または SSL) のバージョンを指定するディレクティブです。
SSLCipherSuite
優先する暗号化スイートを指定する、もしくは許可しないスイートを無効にするディレクティブです。
SSLHonorCipherOrder
コメントを解除して、このディレクティブを on に設定すると、接続先のクライアントが指定された暗号化の命令に従います。
例を示します。
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite HIGH:!aNULL:!MD5
SSLHonorCipherOrder on
上記の設定は最小限のものであり、「有効にするアルゴリズムの選択」 にある推奨事項にしたがうことでさらに強化できることに注意してください。
mod_nss モジュールを設定、使用するには、/etc/httpd/conf.d/nss.conf 設定ファイルを修正します。mod_nss モジュールは mod_ssl から派生しているため、後者と多くの機能を共有しています。設定ファイルの構成だけでなく、利用可能なディレクティブも同様です。mod_nss ディレクティブには、SSL ではなく NSS の接頭辞が付くことに注意してください。mod_nss に適用できない mod_ssl 設定ディレクティブの一覧を含む mod_nss についての概要は、https://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html を参照してください。

4.11.3.2. Dovecot メールサーバーの設定

Dovecot メールサーバーが TLS を使用するように設定するには、/etc/dovecot/conf.d/10-ssl.conf 設定ファイルを修正します。このファイルで利用可能な基本的な設定ディレクティブの一部は、/usr/share/doc/dovecot-2.2.10/wiki/SSL.DovecotConfiguration.txt (このヘルプファイルは標準 Dovecot インストールに含まれています) で説明しています。
/etc/dovecot/conf.d/10-ssl.conf 設定ファイルの設定を修正する場合は、少なくとも下記の 3 つのディレクティブを確認してください。
ssl_protocols
許可する TLS (または SSL) のバージョンを指定するディレクティブです。
ssl_cipher_list
優先する暗号化スイートを指定する、もしくは許可しないスイートを無効にするディレクティブです。
ssl_prefer_server_ciphers
コメントを解除して、このディレクティブを yes に設定すると、接続先のクライアントが指定された暗号化の命令に従います。
例を示します。
ssl_protocols = !SSLv2 !SSLv3
ssl_cipher_list = HIGH:!aNULL:!MD5
ssl_prefer_server_ciphers = yes
上記の設定は最小限のものであり、「有効にするアルゴリズムの選択」 にある推奨事項にしたがうことでさらに強化できることに注意してください。

4.11.4. その他の情報

TLS の設定および関連トピックについての詳細情報は、以下に挙げるリソースを参照してください。

インストールされているドキュメント

  • config(1)/etc/ssl/openssl.conf 設定ファイルの形式を説明しています。
  • ciphers(1) — 利用可能な OpenSSL キーワードおよび暗号化文字列の一覧が含まれています。
  • /usr/share/httpd/manual/mod/mod_ssl.htmlApache HTTP Server 用に mod_ssl が使用する /etc/httpd/conf.d/ssl.conf 設定ファイルで利用可能なディレクティブを詳細に説明しています。
  • /usr/share/httpd/manual/ssl/ssl_howto.htmlApache HTTP Server 用に mod_ssl が使用する /etc/httpd/conf.d/ssl.conf 設定ファイルでの現実的な設定例が含まれています。
  • /usr/share/doc/dovecot-2.2.10/wiki/SSL.DovecotConfiguration.txtDovecot メールサーバーが使用する /etc/dovecot/conf.d/10-ssl.conf 設定ファイルで使用可能な基本的設定ディレクティブについて説明しています。

オンラインのドキュメント

関連項目

  • 「SSL/TLS」 では、SSL および TLS プロトコルを簡潔に説明しています。
  • 「OpenSSL の使用」 では、OpenSSL を使用して鍵を作成、管理し、証明書を生成し、ファイルを暗号化、暗号化解除する方法を説明しています。