先週話題になっていた、輸出グレードの RSA 暗号をサポートしていたことに起因する脆弱性 「FREAK」 に関連して、Apache + OpenSSL で運用しているサーバに対して SSLCipherSuite の設定を見直してみたので、その方法と具体的な設定についてまとめておきます。
まず、FREAK に関しての詳細な情報については下記のリンク先などをご覧ください。この記事では件の脆弱性に対応するため、Web サーバ側で行った設定変更についてのみ触れています。
SSL Server Test による確認
Web サーバで問題の輸出グレード暗号が使用されているかは、openssl ciphers -v
としても確認できますが、もっと手軽な方法として 「SSL Server Test」 を利用することにします。
確認は簡単で、上記 Web サイトにアクセスしたら、「Do not show the results on the boards」 にチェックを入れた上で、確認したい Web サイトのドメイン名を入力し、テストを実行します。少し時間はかかりますが、数分で結果が表示されると思います。
対策を行う前のテスト結果が下記ですが、輸出グレード暗号をサポートしていて、問題があると指摘されているのがわかります (赤字になっている部分)。
ちなみに、SSL 3.0 が無効になっているのは、以前 POODLE 対策で無効にしているからです。
FREAK 対策を行った結果
先に結果を出しておきます。後述する対策を行うことで、同じ SSL Server Test によるテスト結果は下記のようになります。
なお、「Handshake Simulation」 の部分で、各ブラウザのバージョンでどのような接続がされるかも表示されます。
ここを見ると、Windows XP 上の IE6 で接続できないとなっていますが、これは SSL 3.0 を無効にしている時点で既知の問題点で、特に気にしていません。
それから、「No SNI」 と注釈で書かれているのは、SNI 未対応ブラウザの意味ですが、SNI については、下記の記事で詳しく書いていますので参考までにどうぞ。
なお、総合評価的にも下記のような感じになります。
具体的な設定内容
ということで、具体的な設定方法を最後に。
まずは OpenSSL のバージョンを最新版にアップデートしておきます。私の環境ではすでに最新版へのアップデートは終わっていたので、今回は特に行っていません。OpenSSL のバージョンアップに関しては、下記の記事の後半で書いていますので参考まで。
SSL 側の設定的には問題になっている輸出グレード暗号を無効にしてしまえばよいのですが、現状のブラウザシェアを考えれば、128bit 未満の、強度が低い暗号化方式を一律無効にしてしまう方法でも問題なさそうです。ですので、今回はその前提で進めてみます。
対象となる環境は Apache サーバ (2.2.x) ですので、設定は、SSLCipherSuite によって行います。
さて、具体的な設定内容については、SSLCipherSuite Directive のドキュメントを見つつ、細かく自分で決めてもよいのですが、とっても面倒なので、下記のツールを使用して推奨設定を適用してみます。
Mozilla SSL Configuration Generator は、Mozilla が提供しているオンラインツールで、Web サーバのバージョン、OpenSSL のバージョンを指定することで、SSL に関する推奨設定例を表示してくれるとっても便利なツール。
例えば上記は、Apache 2.2.15 + OpenSSL 1.0.1k の環境で、「Intermediate (中間 / 「標準的」なくらいの意味ですね)」 を選択した場合の設定例です。
設定を 「Modern」「Intermediate」「Old」 と変えてみると、「Oldest compatible clients (互換性のある最も古いクライアントバージョン)」 の部分に、その設定で対応可能な最も古いブラウザのバージョンが表示されますので、それを見つつ、問題がなさそうなところを選べばよいと思います。
今回、私は 「Intermediate」 を選択しました。さすがに 「Modern」 だと IE のサポート範囲が狭すぎますし、前述の通り、すでに SSL 3.0 を無効にして Windows XP 上の IE6 は諦めていますので、「Old」 にする必要もないという理由です。
使用する設定は下記の部分。
SSLCipherSuite 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:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA SSLHonorCipherOrder on
詳しくは公式ドキュメントの SSLCipherSuite Directive の項目を見ていただければと思いますが、問題の輸出グレード暗号に関しては、!EXPORT
という記述で無効になっています。
また、SSLHonorCipherOrder ON
の設定により、ハンドシェイク時に、クライアントからの指定ではなくサーバ側の設定を優先して、暗号化方式を決定します (詳しくは SSLHonorCipherOrder Directive の項目を参照)。この指定と、SSLCipherSuite の指定の組み合わせによって ECDHE、もしくは DHE が優先的に使用されることで、PFS (Perfect forward secrecy) が実現します。
なお、SSLProtocol と、HSTS 関連の設定は、私の環境ではすでにしてあったので今回は不要でしたが、必要な場合は参考にするとよいと思います。
この設定を、ssl.conf に追記して、Apache を再起動後、SSL Server Test を再度実行して、結果に反映されているかを調べます。結果が問題がなければとりあえずは対策完了と言うことで。