ApacheとNginxでのForward Secrecy設定方法
ユーザーとエンドユーザーの間の通信を暗号化するには、SSL証明書を購入してサーバーにインストールし、証明書を使用してこれらの通信を保護するようにWebサイトを構成します。
SSL接続は、エンドユーザーのブラウザがWebサイトにアクセスする際に開始されます。開始の最初の段階でハンドシェイクが行われます。
このハンドシェイク過程で、ブラウザとサーバーの暗号化に利用する情報が交換され、検証が行われ、ブラウザとサーバー両方の基準を満たすセッションキーが作成されます。
セッションキーが作成されると、エンドユーザーとサイト間の通信の残りの部分がセッションキーで暗号化されて通信が保護されます。
歴史的に、セッション鍵をネゴシエートする最も一般的な方法は、RSA公開鍵暗号方式です。
RSA公開鍵暗号方式では、ブラウザは作成したセッションキーパラメータをサーバーの公開鍵を使用して暗号化し、サーバに送信します。サーバーは、このセッションキーをサーバーの秘密鍵で復号化することができます。
RSA鍵交換メカニズムを使用すると以下の問題が発生します。
これは、サーバーの鍵ペアと、固有の安全なセッションごとに作成されたセッション鍵との間にリンクが作成されるためです。
- 攻撃者は暗号化されたトラフィックを任意の時間記録し、秘密鍵にアクセスできるようになるまでアーカイブすることができます。
- 攻撃者がサーバーの秘密鍵にアクセスできるようになった場合、すべてのアーカイブを復号化できます。
一方、Perfect Forward Secrecy(PFS)を有効にすると、サーバーの秘密キーと各セッションキーとのリンクがなくなるため、攻撃者がサーバーの秘密鍵にアクセスできるようになった場合でも、攻撃者は秘密鍵を使用してアーカイブを復号することはできません。
この特長から、「Perfect Forward Secrecy(PFS)完全前方秘匿性」と呼ばれています。
SSL Lab の SSL Server Testにホスト名を入力すると、そのWebサイトでPerfect Forward Secrecyが利用されているかを確認することができます。
Perfect Forward Secrecy の原理
Perfect Forward Secrecyでは、セッションキーの交換にRSA鍵交換メカニズムを使用するのではなく、楕円曲線ディフィー・ヘルマン [Elliptic Curve Diffie-Hellman (ECDHE)] 鍵交換を使う必要があります。
暗号化アルゴリズムではRSA公開鍵を使うことはできますが、鍵交換ではRSAを使うことはできません。
ECDHEは、通常のディフィー・ヘルマン [Diffie-Hellman(DH)] よりもはるかに高速ですが、どちらもSSL接続に関与するエンティティだけがアクセスできるセッションキーを作成します。
セッションキーはサーバーのキーペアにリンクされていないため、サーバーの秘密キーのみを使用してSSLセッションを復号化することはできません。
Perfect Forward Secrecyを設定する
楕円曲線暗号 [Elliptic Curve cryptography (ECC)] 対応WebサーバーとSSL/TLS libraryが必要です。
対応する最小バージョン
- OpenSSL 1.0.1c+
- Apache 2.4x
※HeartbleedバグとOpenSSLの脆弱性対応のため、OpenSSLは最新バージョンの利用をお勧めします。
Apache Perfect Forward Secrecy 設定手順
デフォルトでは、ハンドシェイクの過程ではクライアントが指定した暗号スイートが利用されます。
そこで、まずサーバーが指定した暗号スイートを利用するように設定します。次に、利用する暗号スイートをサーバーの設定ファイルで指定します。
-
設定対象のApacheサーバー設定ファイルを探す
事例サンプル
-
以下のコマンドを実行します。
この例では、/etc/apacheをApache サーバーの設定が置かれているディレクトリと想定していますが、インストール方法によって、/etc/httpd、/etc/apache2等のケースもあります。
grep -i -r "SSLEngine" /etc/apache
-
上のコマンドで、Forward Secrecy設定を行うべきファイル情報が得られますので、該当のファイルを開きます。
-
対象Virtual Hostディレクティブ内に以下の設定を追加
- SSLProtocolで以下を指定します。
SSLProtocol all -SSLv2 -SSLv3
- SSLHonorCipherOrderで以下を指定します。
SSLHonorCipherOrder on
-
For SSLCipherSuiteでは以下のどれかを指定します。
-
推奨の設定
このSSLCipherSuite設定では、タイミング攻撃に耐性があるGCM(Galois Counter Mode)スイートを利用します。
また、パフォーマンスを向上させるために、高速なECDHEスイートを可能な限り使用します。
SSLCipherSuite “EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4”
-
広範囲のブラウザや古いブラウザをサポートする最後の手段としてRC4で設定する(非推奨)
このSSLCipherSuite設定では、タイミング攻撃に耐性があるGCM(Galois Counter Mode)スイートを利用し、広範囲のブラウザや古いブラウザをサポートする最後の手段としてのみRC4を利用します。
また、パフォーマンスを向上させるために、高速なECDHEスイートを可能な限り使用します。
SSLCipherSuite “EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS +RC4 RC4”
-
Apacheの再起動
インストール環境によって異なる場合がありますが、以下のようにApacheを再起動します。
apachectl -k restart
-
SSL LabのSSL Server TestでPerfect Forward Secrecyが正しく設定されていることを確認してください。
楕円曲線暗号 [Elliptic Curve cryptography (ECC)] 対応WebサーバーとSSL/TLS libraryが必要です。
対応する最小バージョン
- OpenSSL 1.0.1c+
- Nginx 1.0.6+ and 1.1.0+
※HeartbleedバグとOpenSSLの脆弱性対応のため、OpenSSLは最新バージョンの利用をお勧めします。
Nginx Perfect Forward Secrecy設定手順
まず、サーバーが指定した暗号スイートを利用するように設定します。次に、利用する暗号スイートをサーバーの設定ファイルで指定します。
-
設定対象のNginxサーバー設定ファイルを探す
事例サンプル
-
以下のコマンドを実行します。
grep -r ssl_protocol /etc/nginx
この例では、/etc/nginx をNginxの設定ファイルのディレクトリと想定しています。ディレクトリ名は実情に合わせて指定してください。
-
上のコマンドでForward Secrecy設定を行うべきファイル情報が得られますので、該当のファイルを開き、対象のServer Blockを探します。
-
以下をForward Secrecy対象のServer Blockに追記する
- ssl_protocolsで以下を指定します。
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
- ssl_prefer_server_ciphersで以下を指定します。
ssl_prefer_server_ciphers on;
-
For ssl_ciphersでは以下のどれかを指定します。
-
推奨の設定
このSSLCipherSuite設定では、タイミング攻撃に耐性があるGCM(Galois Counter Mode)スイートを利用します。
また、パフォーマンスを向上させるために、高速なECDHEスイートを可能な限り使用します。
ssl_ciphers “EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4”;
-
広範囲のブラウザや古いブラウザをサポートする最後の手段としてRC4で設定する(非推奨)
このSSLCipherSuite設定では、タイミング攻撃に耐性があるGCM(Galois Counter Mode)スイートを利用し、広範囲のブラウザや古いブラウザをサポートする最後の手段としてのみRC4を利用します。
また、パフォーマンスを向上させるために、高速なECDHEスイートを可能な限り使用します。
ssl_ciphers “EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS +RC4 RC4”;
-
Nginxの再起動
インストール環境によって異なる場合がありますが、以下のようにNginxを再起動します。
sudo service nginx restart
-
SSL LabのSSL Server TestでPerfect Forward Secrecyが正しく設定されていることを確認してください。