SSLCipherSuite を変更し perfect forward secrecy にも対応してみる - さくらVPS CentOS 6.5
SSLサーバー証明書を購入し設置を行ったので、この機会にSSLまわりの設定を見なおしてみることにした。
(2014/10/21追記:POODLE attack に対応するため、SSLProtocol に -SSLv3 を追加。)
(2016/03/03追記:古い記事なので今風のCipherSuiteについて、文末に追記しました。)
現状の確認
まずはQualys SSL Labs SSL Server Testというサイトへ行って、現状をチェック。
最近チェックされたドメインリストに名前が出てしまうので、ドメイン名入力欄の下にあるチェックボックスをオンにしてリスト掲載を拒否する。
数分待つと結果が表示される。
Beast攻撃がどうだとか、暗号強度が低いだとか、いろいろと指摘されてしまう。
また、ページの下の方へ行くと、メジャーなブラウザとの接続確認も可能だ。
設定の変更
SSLまわりの知識はほとんど皆無なので、色々なサイトを読みあさり設定を試行錯誤した結果、最終的に冒頭のA+という結果になった。
Apacheのバージョンアップ
さくらのVPSのCentOSでyumを使ってApacheをインストールすると、現状では2.2.15が導入される。しかし、このバージョンでは'SSLCompression off' という設定を使えないようなので、まずは Apache のバージョンアップを行う。
CentALTリポジトリを追加し、Apacheを停止して、yum でアップデート
rpm -ihv http://centos.alt.ru/repository/centos/6/x86_64/centalt-release-6-1.noarch.rpm service httpd stop yum update httpd httpd-devel
このままにしておくと、既にインストールしている他のパッケージの更新もCentALTでされてしまうので、デフォルトではこのレポジトリを無効にしておく。
以下のコマンドで、設定ファイルを編集し、enable=0 に変更する。
vim /etc/yum.repos.d/centalt.repo
これでApache 2.2.27が導入されたので、念のためサーバーを再起動。
今回は、ここで'proxy_ajp'がダブってロードされているとの警告が出た。
調べてみると、proxy_ajp.confという新しいファイルが追加されており、'proxy_ajp'のロードが、httpd.conf からこちらのファイルに分離されたようだ。そのため、今まで使っていた httpd.conf のロードモジュールの部分とあわせて2回読み込まれてしまう。
そこで、ファイル名を変更してこの新しいファイルの読込を回避。
mv /etc/httpd/conf.d/proxy_ajp.conf /etc/httpd/conf.d/proxy_ajp.conf.org
httpd.confの設定
Apacheの設定については、VirtualHostのSSL部分を以下のようにした。*1
SSLEngine on SSLProtocol all -SSLv2 -SSLv3 SSLHonorCipherOrder On SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS SSLCertificateKeyFile /etc/httpd/conf/サーバー.key SSLCertificateFile /etc/httpd/conf/サーバー.crt SSLCACertificateFile /etc/httpd/conf/中間証明.crt Header add Strict-Transport-Security "max-age=15768000"
また、SSLCompression off は、VirtualHostの外に書かないといけないと怒られたので、ssl.confに追加。
vim /etc/httpd/conf.d/ssl.conf
SSLCompression off #最後の行に追加
Apacheを再起動して、完了。
service httpd restart
SSLCipherSuiteについて
今回、もっとも悩んだのが SSLCipherSuite の記述。
いろいろなサイトの記事を都合十数ページ読んだが、何が良くて何が悪いのかサッパリ理解できない。そもそも、どのブラウザがどういった暗号形式に対応できているかという知識がないので、これだけ多くの暗号形式の中から適切なものを抜き出して使うことなど自分には不可能。
相当に幅の広い知識が必要な分野で、ここの部分に手を出すのは無理だと納得させられた。
そこで、今回使用した組合せは、以下のサイトからコピーして持ってきたものだ。
A better SSL configuration for Apache 2
このスーツでは、モダンブラウザにおいて perfect forward secrecy が実現されている。感謝です。
PFS
perfect forward secrecy は、ECDHEとDHEを優先して使用するようにすることで実現できるということらしい。
念のため、このセットで使用される暗号形式を調べてみる。ECDHEとDHEが含まれているのがわかる。
openssl ciphers -v 'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:EC DH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS' | sort AES128-GCM-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AESGCM(128) Mac=AEAD AES128-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA1 AES128-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA256 AES256-GCM-SHA384 TLSv1.2 Kx=RSA Au=RSA Enc=AESGCM(256) Mac=AEAD AES256-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(256) Mac=SHA1 AES256-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AES(256) Mac=SHA256 DES-CBC3-SHA SSLv3 Kx=RSA Au=RSA Enc=3DES(168) Mac=SHA1 DHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AESGCM(128) Mac=AEAD DHE-RSA-AES128-SHA SSLv3 Kx=DH Au=RSA Enc=AES(128) Mac=SHA1 DHE-RSA-AES128-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AES(128) Mac=SHA256 DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH Au=RSA Enc=AESGCM(256) Mac=AEAD DHE-RSA-AES256-SHA SSLv3 Kx=DH Au=RSA Enc=AES(256) Mac=SHA1 DHE-RSA-AES256-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AES(256) Mac=SHA256 ECDH-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AESGCM(128) Mac=AEAD ECDH-ECDSA-AES128-SHA SSLv3 Kx=ECDH/ECDSA Au=ECDH Enc=AES(128) Mac=SHA1 ECDH-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AES(128) Mac=SHA256 ECDH-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AESGCM(256) Mac=AEAD ECDH-ECDSA-AES256-SHA SSLv3 Kx=ECDH/ECDSA Au=ECDH Enc=AES(256) Mac=SHA1 ECDH-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AES(256) Mac=SHA384 ECDH-ECDSA-DES-CBC3-SHA SSLv3 Kx=ECDH/ECDSA Au=ECDH Enc=3DES(168) Mac=SHA1 ECDH-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AESGCM(128) Mac=AEAD ECDH-RSA-AES128-SHA SSLv3 Kx=ECDH/RSA Au=ECDH Enc=AES(128) Mac=SHA1 ECDH-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AES(128) Mac=SHA256 ECDH-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AESGCM(256) Mac=AEAD ECDH-RSA-AES256-SHA SSLv3 Kx=ECDH/RSA Au=ECDH Enc=AES(256) Mac=SHA1 ECDH-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AES(256) Mac=SHA384 ECDH-RSA-DES-CBC3-SHA SSLv3 Kx=ECDH/RSA Au=ECDH Enc=3DES(168) Mac=SHA1 ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(128) Mac=AEAD ECDHE-ECDSA-AES128-SHA SSLv3 Kx=ECDH Au=ECDSA Enc=AES(128) Mac=SHA1 ECDHE-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AES(128) Mac=SHA256 ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(256) Mac=AEAD ECDHE-ECDSA-AES256-SHA SSLv3 Kx=ECDH Au=ECDSA Enc=AES(256) Mac=SHA1 ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AES(256) Mac=SHA384 ECDHE-ECDSA-DES-CBC3-SHA SSLv3 Kx=ECDH Au=ECDSA Enc=3DES(168) Mac=SHA1 ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(128) Mac=AEAD ECDHE-RSA-AES128-SHA SSLv3 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA1 ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA256 ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD ECDHE-RSA-AES256-SHA SSLv3 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA1 ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA384 ECDHE-RSA-DES-CBC3-SHA SSLv3 Kx=ECDH Au=RSA Enc=3DES(168) Mac=SHA1 EDH-RSA-DES-CBC3-SHA SSLv3 Kx=DH Au=RSA Enc=3DES(168) Mac=SHA1
HSTSについて
Header add Strict-Transport-Security を設定しておくと、HSTSに対応したブラウザでは、一度 https で接続すると、それ以降そのドメインへのアクセスは、https での接続を強制するようになる。*2
したがって、SSL無しでアクセスされることを前提に作られたページで、スタイルシートや JavaScript の参照URLを、http:// からの絶対URLで記述している場合、これらの参照がブロックされてしまうので、http: を削除するか、相対パスでの記述に変更しなければならないので導入には注意が必要だ。
CipherSuiteについての追記(2016/3/3)
SSLの脆弱性が見つかるたびに、こちらの記事のアクセスがかなり増えるので追記いたします。
なお、この記事を書いている中の人は、ガチプロのサーバーエンジニアでは有りません。参考情報程度の扱いでお読み下さい。
現在は、Mozillaがかなり便利なユーティリティを提供してくれているので、以下のリンクから利用すると良いです。
Generate Mozilla Security Recommended Web Server Configuration Files
なるべく多くの端末やブラウザに対応したい場合の設定
ちなみに、「Apache - Intermediate」とした場合は、前出のQualys SSL Labs SSL Server Testにおいて、B+程度の評価になると思います。この場合、ほとんど全ての端末などと暗号化通信が可能となります。
SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
古い端末やブラウザから接続できるかどうかをあまり気にしない場合の設定
「Apache - Modern」とした場合は、A+を取ることができますが、レガシーブラウザや端末と暗号化通信ができなくなります。
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
接続ができなくなるものは以下のとおりです。(Qualys SSL Labs SSL Server Testの結果より)
- Android 4.0.4
- Android 4.1.1
- Android 4.2.2
- Android 4.3
- Baidu Jan 2015
- IE 6 / XP
- IE 7 / Vista
- IE 8-10 / Win 7
- IE 10 / Win Phone 8.0
- Java 7u25
- OpenSSL 0.9.8y
- Safari 5.1.9 / OS X 10.6.8
- Safari 6.0.4 / OS X 10.8.4
Android 4.3とWindows7のIE10 あたりが若干気になりますね。