管理している別のサーバもSSL導入しました。
でも、SSLを導入したら安全かというと、答えはNO!という事らしいです。
ということで、色々と調べてみるとサイトのSSL脆弱性をチェックして評価してくれるサイトがあるそうなので、脆弱性の対策を行いたいと思います。
Qualys SSL Labsという会社が提供しているチェックサイトが結構有名みたいなので、そこのサイトでチェックしてみました。
まず、『SSL Server Test』のサイトに行きます。
すると、以下のメイン画面が表示されます。
(2020年02月時点のデザインなので、今後サイトデザインは変わるかもしれません。)
「Hostname:」という所にチェックしたいサイトのURLを入力します。
「Submit」ボタンをクリックするとチェックが始まります。そこそこの時間がかかりますので、お茶を飲んで待ちます。
「Do not show the results on the boards」チェックボックスはチェックしておい方が良いと思います。このチェックを外すと、チェックしたサイトが履歴に残ってしまいます。
しばらくするとチェック結果が表示されます。
それではセクション毎に見ていきましょう。
Summary
まずは、『Summary』です。そのなのとおり、要約ですね。結果は「B」でした。
診断結果には良い方から【A+】、【A】、【B】、【C】、【D】、【E】、【F】の7段階評価のようです。
そして、【B】以下は脆弱性が見つかったと言うことらしいので、該当サイトは脆弱性があるということですね。トホホ。
そして、評価の右側にそれぞれのカテゴリの安全度が表示されます。0に近いほど脆弱で、100に近いほど安全という意味ですが全てを100にするのはなかなか難しく、必ずしも全てを100にする必要は無いらしいです。
評価の下の項目は、薄い黄色がたんなる情報で、その下の薄いオレンジができれば直した方が良い脆弱性、薄い緑色が対処済みの脆弱性を表しているようです。
薄い黄色の脆弱性は「このサーバはTLS 1.0とTLS 1.1をサポートしているので、評価をBにしたよ」という内容です。
それでは具体的な脆弱性を見ていきます、画面をスクロールすると次のセクションが表示されます。
Certificate
ここで注目するのは赤四角で囲んだオレンジ色で表示されている『DNS CAA No』の部分です。
DNSのCAAレコードは、SSLサーバ証明書を第三者が勝手に発行することを防止する仕組みです。
2017年09月時点ではこの問題は特に対処しなくても問題ないとされていましたが、現在の状況がちょっとわかりません。
なので、対処しておきます。
対処方法はDNSのCAAレコードに認証局を指定してあげれば良いのですが、サーバ上にDNSが動いてない場合はやりようがありませんね。
ちなみに、BINDを使っている人はこちらのサイトが参考になると思います。
さくらインターネットを利用している人はこちらのサイトを参考にしてください。
RMSを利用している人はこちらのサイトを参考にしてください。
という感じで、自分に合った対処方法を探してください。
Additional Certificates & Certification Paths
Configuration
「TLS 1.0」と「TLS 1.1」が「No」になっています。
これらのプロトコルは危険なので使わない方が良いということで、無効にします。
httpサーバの種類により修正方法は異なります。
Nginxの場合は先ほど紹介したこちらのサイトを参考にしてください。
Apacheの修正方法を説明します。
その前に、まずSSL/TLSプロトコルの歴史を復習しておきましょう。
一般的には「SSL」という言葉を使うことが多いですが、「TLS」という表現が正しいのだと思います。(「SSL/TLS」という表現が多く使われていますけど、良くわからないですね。)
以下の表の通り、SSLは廃止されています。TLSも1.0と1.1は非推奨ですね。
現時点での最新はTLS 1.3ですが、サーバとクライアント(WEBブラウザ)がTLS 1.3に対応していないと駄目なので、若干不安があります。
本当はTLS 1.3対応をしたいのですが、色々と課題があるので今回は涙をのんでTLS 1.2のみ対応で見直そうと思います。
プロトコル名称 | バージョン | 公開年度 | ステータス |
SSL | 1.0 | (非公開) | 廃止 |
2.0 | 1995年 | 廃止 | |
3.0 | 1996年 | 廃止 | |
TLS | 1.0 | 1999年 | 非推奨 |
1.1 | 2006年 | 非推奨 | |
1.2 | 2008年 | 推奨 | |
1.3 | 2018年 | 推奨 |
TLS 1.0はSSL 3.0より新しい規格であることを示すため、ネゴシエーションにおけるバージョン番号は3.1となっています。
TLS 1.3はApache Version 2.4.37以降、OpenSSL V1.1.1以降サポートされていますので注意してください。(OpenSSL V1.1.1は脆弱性が報告されていますので、最新版を使うようにしてください)
また、この後説明するSSLCipherSuiteの記載方法も大幅に変更されているので、利用する人は事前に十分に調査を行ってから設定することをお勧めします。
修正するファイルは、Apacheであればデフォルトで「httpd-ssl.conf」ファイルです。
現在は以下の設定になっていました。
意味としては、全てのプロトコルバージョンから、「SSLv3のみを除いた」という設定になっていますね。(ついでにSSLProxyProtocolも直しちゃいます)
と言うことは、TLS 1.0とTLS 1.1はOKという設定だったので、評価結果に現れたのですね。
SSLProtocol all -SSLv3 SSLProxyProtocol all -SSLv3 |
なので、以下の通り「TLS 1.2のみ許可」したいと思います。
SSLProtocol +TLSv1.2 SSLProxyProtocol +TLSv1.2 |
設定が終わったらApacheを再起動しましょう。
「SSLv3のみ」にした場合、サイトが表示されなくなる場合がありますので、注意してください。
(そんなことする人はいないと思いますけど)
その場合、以下のようなエラー画面になります。
うまくサイトが表示されれば成功です。
ついでに、SSLの高速化を行うための「SSLセッション再利用(Session resumption)」を設定しておきましょう。
先ほど修正した「httpd-ssl.conf」ファイルをもう一度修正します。
修正箇所は「 SSLSessionCacheTimeout」です。
現在は以下の値になっています。
SSLSessionCacheTimeout 300 |
これを以下のように修正します。3600ぐらいが妥当な値のようです。
SSLSessionCacheTimeout 3600 |
Handshake Simulation
TLS 1.0系でたくさんエラーになっていますね。
でも、先ほど対策したので問題ないでしょう。
Protocol Details
HTTP Requests & Miscellaneous
はい、一通り対策をしたので、もう一度チェックをしてみます。
ところが、Cipher Suitesの部分だけは対処が必要な項目としてオレンジ色の表示になっています。
うーん、困りました。
「WEAK」になっているCipher Suitesを解決しないといけないみたいです。Cipher Suitesの数が少なくなりますね、必ず対応する必要は無いようなんですが、やはり気になるので対応します。
ちなみに、高レベルのセキュリティを求めるなら「電子政府暗号推奨リスト」に掲載されているアルゴリズムで構成させたほうが良いらしいです。
Cipher Suites
では設定を見直したいと思います。Cipher Suitesにあわせてもう少しセキュリティを強化したいと思います。
1脆弱性のあるRC4暗号スイートなどを明示的に無効化する
2暗号の選択をサーバ側で決定するように設定
1脆弱性のあるRC4暗号スイートなどを明示的に無効化する
以下が現在のデフォルト値です。既にRC4暗号化スイートは無効になっていますね。問題ないように思うのですが。。。
SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES SSLProxyCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES |
とりあえず、電子政府推奨暗号リストに従ってみましょう。
以下のようにしてみました。
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256!RC4:!LOW:!MD5:!aNULL:!eNULL:!3DES:!EXP:!PSK:!SRP:!DSS:!ADH:!DH SSLProxyCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256!RC4:!LOW:!MD5:!aNULL:!eNULL:!3DES:!EXP:!PSK:!SRP:!DSS:!ADH:!DH |
2暗号の選択をサーバ側で決定するように設定
既に「on」になっているので、これはこのままでオッケーです。
SSLHonorCipherOrder on |
それではもう一度チェックしてみます。
評価とポイントは変わらずです。
CipherSuiteの項目は消えました。
代わりに古いOSのIE 11やSafali等のブラウザが利用できなくなりましたが、仕方ないです。
とりあえず、これで設定は一旦完了とします。
セキュリティの問題は定期的に見直す必要があるなと思い直しました。