IMPOV::In My Point Of View

仕事、SEO、ウェブマーケティング、時事問題、健康、生き方などなど、書きたいことを勝手に書き倒しているブログです。とどのつまり「便所の落書き」

SSLCipherSuite を変更し perfect forward secrecy にも対応してみる - さくらVPS CentOS 6.5

SSLサーバー証明書を購入し設置を行ったので、この機会にSSLまわりの設定を見なおしてみることにした。
(2014/10/21追記:POODLE attack に対応するため、SSLProtocol に -SSLv3 を追加。)
(2016/03/03追記:古い記事なので今風のCipherSuiteについて、文末に追記しました。)

f:id:impov:20140428232512p:plain

現状の確認

まずはQualys SSL Labs SSL Server Testというサイトへ行って、現状をチェック。

最近チェックされたドメインリストに名前が出てしまうので、ドメイン名入力欄の下にあるチェックボックスをオンにしてリスト掲載を拒否する。
f:id:impov:20140428232518p:plain

数分待つと結果が表示される。

Beast攻撃がどうだとか、暗号強度が低いだとか、いろいろと指摘されてしまう。

また、ページの下の方へ行くと、メジャーなブラウザとの接続確認も可能だ。
f:id:impov:20140428232523p:plain

設定の変更

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 あたりが若干気になりますね。

*1:2014/10/21追記 POODLE attack に対応するため、SSLv3を無効

*2:現状では Firefox と Chrome が対応しており、IE は対応していないそうだ。