SIM フリーどさにっき 〜2014年5月下旬〜

by やまや
<< = >>

2014年5月22日(木)

ssl 設定 2014/05 版

_ 2013/03 版以降で SSL の安全性に関する大きなトピックというと、最近の Heartbleed bug(およびその後に続く世界的なコードレビュー大会)と、それから スノーデン事件で注目されることになった PFS。ちうことで、このへんどうすればいいのかってことを考えてみる。

_ Heartbleed については、なにはなくとも openssl 穴のないバージョンに上げとけ。以前からコードが汚いとはさんざん言われていながらもこれまで致命的な穴は見つかってなかったけど、今回の件はさすがにひどすぎて徹底的なコードレビューがはじまってるんで、これほどでもないけどそれなりに影響のある脆弱性は今後もしばらくぽこじゃか見つかりそうな気配(つーか、もう 出てる)。つーことで、致命的なものが見つかったらいつでも入れ替えができるような体制は整えておくべきかと。

_ それから PFS。暗号通信をキャプチャして保存しておけば、後で秘密鍵が漏洩したときに入手することで、過去の暗号もあとから復号できちゃうよ、というのが従来の RSA な鍵交換、認証時の鍵と鍵交換の鍵を変えることで漏洩しにくくしたのが forward secrecy。さらに定期的に鍵交換をやりなおすと perfect forward secrecy になるらしい。うん、結論の重要性は理解できるけど、それを実現するための理論が難しくてさっぱりわからんね。とりあえず理屈はブラックボックスで、結論だけわかってればいいと思う。

_ ちうことで、そのへん考慮した mod_ssl の設定。

SSLProtocol all -SSLv2
SSLCompression off
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:EECDH:EDH:ECDH:DH:AESGCM:HIGH:MEDIUM:+RC4:!LOW:!EXP:!MD5:!SSLv2:!aNULL:!eNULL
SSLHonorCipherOrder On
まず、PFS な ECDHE、DHE 暗号、次いで FS な ECDH、DH、そしてそれ以外の暗号という優先順位で使われるように設定する (*1)。で、それらの中でも、 Lucky13対策として AES-GCM なものが先に使われるようにする。この優先度がクライアント側の都合で勝手に変えられないように SSLHonorCipherOrder on でサーバ側の都合を優先させ、 CRIME attack(とその派生の BREACH)の対策に SSLCompression off を設定する。 前回は RC4 を明示的に禁止したけど、やっぱり互換性を考えると残しておいた方がいいかもなー、ということで、いちおう優先度最低で入れておく (*2)。やっぱりなくていいかも。

_ この設定で SSL Server Testにかけると、…あれ、Java 6u45 が1024ビットより大きい DH パラメータを扱えなくてネゴに失敗する、と出てくるなぁ。注意書きに "Browsers tend to retry with a lower protocol version" とあるのでたぶん大丈夫なんじゃないかなぁどうかなぁ。


(*1): ECDHE、DHE な暗号(ephemeral の E はケツにつく)は openssl では EECDH、EDH (E は頭につく)と表現するので注意。
(*2): openssl の cipherlist の指定で、+HOGE はリスト中にある HOGE な暗号の優先度をいちばん下げるという意味で、HOGE という暗号を明示的に使えるようにする、という意味ではないことに注意(リスト中に HOGE な暗号がなければ、+HOGE を指定しても HOGE は使えない)。また、HOGE+FUGA (HOGE かつ FUGA な暗号)の + とはまったく意味が異なる。

<< = >>
やまや