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 以下になるようです。

Ubuntu14.04のSSL設定初期状態。SSLv3が有効になっている
Ubuntu14.04のSSL設定初期状態。SSLv3が有効になっている

これは /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

Ubuntu14.04の初期状態では暗号スイートで3DESがWEAK、RC4がINSECUREと出る
Ubuntu14.04の初期状態では暗号スイートで3DESがWEAK、RC4がINSECUREと出る

OS のアップグレード前に設定した際には 3DES は SECURE 扱いだったのですが、

3DESの扱いが変わってきた - 生存報告
3DESに関して最近確認したことなどを記述します。 システムを運用する方、脆弱性を調査する方などに参考にしていただければ。 背景 2016年8月に、3DESおよび64ビットのブロック暗号に対するSWEET32攻撃が報告されました。 このOpenSSLのブログでは、3DESの強度の評価を“HIGH”から“MEDIUM”に下げるとアナウンスされています。 脆弱性スキャナの対応 脆弱性スキャナの1つであるNessusでも評価の変更があったようで、2016年12月頃から3DESを中程度の強度の暗号として挙げるようになりました。 Here is the list of medium strength S…

なるほど……

ひとまず、

        #   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 に指摘を受けている
Chain Issues と DNS CAA に指摘を受けている

見る限り Chain Issues と DNS CAA に言及があるようなのですが、DNS CAA については DNS を管理してないので今回はひとまず見送り。そうなると Chain Issues に対応することになるわけですけど、Incomplete ってなんだ??

いろいろ調べながら、はたと気がついた中間CA証明書。対象サーバでは RapidSSL を利用してるのですが、中間CA証明書の設定が必要になります。で、そう言えば「○○年移行の証明書にはどの中間CA証明書を使え」とかあったっけなぁ……

中間CA証明書(ラピッドSSL用)ダウンロード(SHA-2)|SSLサーバ証明書 ジオトラスト
SSLならジオトラスト【公式サイト】サポートのご案内ページ。SSLのジオトラストは、SSLサーバ証明書を発行する世界第二位(22万社の導入実績)のSSLプロバイダです。

調べてみたら案の定、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を有効にしただけで満足せず、設定をちゃんと設定しておきたいものですね。