Ubuntu 14.04 サーバの SSL の設定を見直す
長らく Ubuntu 12.04 で運用していたサーバを、サポート期限を機に 14.04 へアップグレードしたのは GW の話。
それからしばらくして、常時 HTTPS サイトの立ち上げの際に、そのサイトの状態を SSL Server Test (Powered by Qualys SSL Labs) で確認したのをきっかけに、前の 14.04 へアップグレードしたサーバもテストしてみたところ、C と出て「まじか?!」と思い、 /etc/apache2/mods-available/ssl.conf
の設定を覗いてみたら、SSL の設定がほぼ初期状態に戻っていることに気がついて直しました。というお話です。
Ubuntu 12.04 -> Ubuntu 14.04 は apach2 も 2.2 系から 2.4 系へメジャーバージョンアップしてしまいますから……ね。
まずはプロトコル
SSL Server Test の結果でまず最初に目を引いたのがプロトコル。SSLv3 が有効になっています。SSL Server Test では SSLv3 が有効になっているとそれだけで C 以下になるようです。
これは /etc/apache2/mods-available/ssl.conf
の内容が
# The protocols to enable. # Available values: all, SSLv3, TLSv1, TLSv1.1, TLSv1.2 # SSL v2 is no longer supported SSLProtocol all
となっているところによるものです。
なお、apache2.2 で SSLProtocol all
だと SSLv2 も有効になるのですが、apache2.4 では無効になります。
対象サーバはほぼ内輪しか触らないサーバなので、TLSv1.2(あるいは +TLSv1.1)でも問題ないはずなのですが、少々思うところがあって
# The protocols to enable. # Available values: all, SSLv3, TLSv1, TLSv1.1, TLSv1.2 # SSL v2 is no longer supported - SSLProtocol all + SSLProtocol all -SSLv2 -SSLv3
としておきました。後々の自分が勘違いしないように明示的に -SSLv2
としています。
暗号スイート: 3DES が WEAK 扱い
次に気になったのが Cipher Suites の 3DES が WEAK になっている点。/etc/apache2/mods-available/ssl.conf
の初期状態では RC4 が有効になってるので SSL Server Test では 3DES の他、RC4 が INSECURE と怒られてますw
OS のアップグレード前に設定した際には 3DES は SECURE 扱いだったのですが、
なるほど……
ひとまず、
# SSL Cipher Suite: # List the ciphers that the client is permitted to negotiate. See the # ciphers(1) man page from the openssl package for list of all available # options. # Enable only secure ciphers: - SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5 + SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5!RC4!3DES!IDEA # Speed-optimized SSL Cipher configuration: # If speed is your main concern (on busy HTTPS servers e.g.), # you might want to force clients to specific, performance # optimized ciphers. In this case, prepend those ciphers # to the SSLCipherSuite list, and enable SSLHonorCipherOrder. # Caveat: by giving precedence to RC4-SHA and AES128-SHA # (as in the example below), most connections will no longer # have perfect forward secrecy - if the server's key is # compromised, captures of past or future traffic must be # considered compromised, too. #SSLCipherSuite RC4-SHA:AES128-SHA:HIGH:MEDIUM:!aNULL:!MD5 - #SSLHonorCipherOrder on + SSLHonorCipherOrder on + SSLCompression off
と変更。
SSLCipherSuite
は理屈の上では強度の評価が落ちたスイートを無効化していけば良いのでしょうが、情報を漏らさずチェックし続ける自信もないですし、せめてもう少し信用できる何かがないかと探してみるとこういうサイトがあるそうです。
Ubuntu 14.04 の apache2 は 2.4.7、OpenSSL は 1.0.1f なので、そのバージョンを指定、その他
- 設定は Intermediate を選択
- HSTS は 有効
という設定だと
<VirtualHost *:443> ... SSLEngine on SSLCertificateFile /path/to/signed_certificate SSLCertificateChainFile /path/to/intermediate_certificate SSLCertificateKeyFile /path/to/private/key # Uncomment the following directive when using client certificate authentication #SSLCACertificateFile /path/to/ca_certs_for_client_authentication # HSTS (mod_headers is required) (15768000 seconds = 6 months) Header always set Strict-Transport-Security "max-age=15768000" ... </VirtualHost> # intermediate configuration, tweak to your needs SSLProtocol all -SSLv3 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 SSLHonorCipherOrder on SSLCompression off # OCSP Stapling, only in httpd 2.3.3 and later SSLUseStapling on SSLStaplingResponderTimeout 5 SSLStaplingReturnResponderErrors off SSLStaplingCache shmcb:/var/run/ocsp(128000)
こういう設定(例)を返してくれるサービスです。
HSTS は mod-headers を有効にする必要がある
HSTS の設定は /etc/apache2/sites-available/default-ssl.conf
の方で設定しておきます。
# SSL Engine Switch: # Enable/Disable SSL for this virtual host. SSLEngine on + # HSTS (mod_headers is required) (15768000 seconds = 6 months) + Header set Strict-Transport-Security "max-age=15768000"
ところが apachectl configtest
を実行すると
Invalid command ‘Header’, perhaps misspelled or defined by a module not included in the server configuration
とエラーを吐いてくれますw
これは Ubuntu 14.04 で mod-headers が初期状態で無効化されているのが原因で、
sudo a2enmod headers sudo service apache2 restart
で有効化する必要があります。
対象サーバでは B から上がらない
本来ならここまでやれば A 以上は出てくれるはずなのですが、対象サーバでは何をやってもなぜか B のまま変化が起こりません。オレンジ(もしくは赤)字のまま残っているのは
見る限り Chain Issues と DNS CAA に言及があるようなのですが、DNS CAA については DNS を管理してないので今回はひとまず見送り。そうなると Chain Issues に対応することになるわけですけど、Incomplete ってなんだ??
いろいろ調べながら、はたと気がついた中間CA証明書。対象サーバでは RapidSSL を利用してるのですが、中間CA証明書の設定が必要になります。で、そう言えば「○○年移行の証明書にはどの中間CA証明書を使え」とかあったっけなぁ……
調べてみたら案の定、2017年2月に更新した証明書に対して「2016年3月1日(火) 仕様変更適用前に発行された証明書」の中間CA証明書を設定してた……。
ただ、ここで分かったのは、Chain Issues が Incomplete と出てるとどんな設定をしても B 以下になるようです。
まとめ
そのほか、色々試してみて分かったことをまとめておきます。2017年8月現在の評価で、時期が経てばどんどん評価は変わってくるはずです。
- SSLv3 が有効だとそれだけで C 以下になります
- Chain Issues が Incomplete と出てるとそれだけで B 以下になります
- HSTS が無効だと A 以下になるようです
- Forward Secrecy が有効になってないと A か A- 以下になるようです
- 現時点では DNS CAA の設定は評価に影響しません
- 同じく、TLSv1 は A+ のネガティブ要因にはならないようです
- やや古いですが QUALY SSL LABS「SSL Server Test」2017年評価基準 という記事が出ています
SSLを有効にしただけで満足せず、設定をちゃんと設定しておきたいものですね。