Edited at

Qualysの SSL Server TestでA+評価を取得した設定例(2017-01-15時点, CentOS7 + Apache HTTPD 2.4.6)

More than 1 year has passed since last update.

2017-01-15 時点で、以下の環境で Qualys SSL Labs の SSL Server Test で A+ 評価を取得できましたので、設定例として公開します。

OS:

$ cat /etc/centos-release
CentOS Linux release 7.3.1611 (Core)

Apache HTTPD, mod_ssl, OpenSSLはCentOS7提供のRPMを利用:
httpd-2.4.6-45.el7.centos.x86_64
openssl-1.0.1e-60.el7.x86_64
openssl-libs-1.0.1e-60.el7.x86_64
mod_ssl-2.4.6-45.el7.centos.x86_64

証明書 : Let's Encrypt で取得したRSA 2048bit の証明書を使用

対象ドメイン : www.glamenv-septzen.net

"SSL Server Test" はセキュリティ専門会社のQualysが無償で提供している、証明書とSSL/TLSの設定についてセキュアな設定になっているか、代表的な既知の脆弱性が無いかなどをチェックしてくれるツールです。チェック対象のドメインには、インターネットから接続できる必要があります。

このratingが高くなるほど、そのサイトの証明書とSSL,TLS設定はよりセキュアな状態であると考えられます。

Let's Encrypt で証明書を取得した流れについては以下参照:

注意:今後のSSL/TLS関連の発展や脆弱性動向により評価が変化する場合があります。あくまでも 2017-01-15 時点ではこうだった、という参考として本記事をご活用ください。


方針

Webを中心としたソフトウェアの技術情報がメインの個人blogサイトですので、以下のような方針としました。


  • 想定読者層から、古いブラウザ/スマホ端末/ガラケーでアクセスしてくる人は殆ど居ないと想定し、プロトコルバージョンをTLSv1.2のみに絞る。

  • IE10以前, Android 4.x系以前, JDK 1.7以前 などサポート切れ含む古めのブラウザ・クライアントには対応しない。

  • FS(Forward Secrecy)のみに絞り、さらに Apache HTTPD 2.4.6 だとDHE鍵パラメータをカスタマイズしてないようなので、DHE系のCipherSuiteは使わない。


    • => 鍵交換はECDHE系のみに絞る。想定読者層としてもECDHE系をサポートしていないブラウザ/クライアントからのアクセスは殆ど無いと想定。

    • => これを以て Logjam 対策とする。

    • なお、RHEL(ひいてはCentOS側)で独自にDHE鍵パラメータを指定できるようなパッチが当たっていないか調べてみたが、2017-01-15時点ではパッチ有無が不明に終わった。



  • HTTP Strict Transport Security (HSTS) は有効化する。


    • 対象ドメインの下にサブドメインを作る予定が無いので、特に副作用は考えず、 includeSubDomains を指定。



※以下については、ぶっちゃけ、2017-01-15時点でこれら無しで A+ 評価取れてしまったので、時間の都合 + 対応する動機が無くなったため、見送ってます。


  • HSTS Preload

  • Certificate Transparency

  • Public Key Pinning (HPKP)

  • DNS Certification Authority Authorization (CAA)


    • (DNS CAAの参考資料は後述)

    • 今回の対象ドメインはお名前.comのDNSレコード設定機能でDNS設定をしているが、2017-01-15時点ではCAAレコードタイプをサポートしていなかったため、諦めた。

    • (ドメインNavi ->「ドメイン設定」->「ネームサーバーの設定」->「DNS関連機能の設定」->「DNSレコード設定」で、登録できるレコード設定に"CAA"が無かった。)




設定例


/etc/httpd/conf.d/ssl.conf

Listen 443 https

SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog
SSLSessionCache shmcb:/run/httpd/sslcache(512000)
# ...

# OCSP Stapling のキャッシュディレクトリとキャッシュサイズ指定
# デフォルトで SSLSessionCache shmcb:/run/httpd/sslcache(512000)
# となっていたので、ディレクトリをそこに揃えた。
SSLStaplingCache shmcb:/run/httpd/stapling_cache(128000)

<VirtualHost *:443>
# ...
<Directory "(...)">
# ...
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</Directory>

SSLEngine on

# プロトコルの明示的な指定により、TLSv1.1/TLSv1.0/SSL3/SSL2 を無効化
# (Android 4.x 系, IE10以前は切り捨てる)
SSLProtocol TLSv1.2

# CipherSuiteを ECDHE + AES 系のみに絞る。
# (from https://mozilla.github.io/server-side-tls/ssl-config-generator/)
# -> IPA SSL/TLS暗号設定ガイドライン, C.2.2. OpenSSL 系での暗号スイートの設定例 からDHE系を外している。
# Apache HTTPD 2.4.6 のためDHE鍵パラメータを設定できなかったこともあり、
# DHE系を外すことでLogjam対策も完了したことにする。
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256

# 暗号スイート順序はサーバ側の順序を優先する設定を有効化
SSLHonorCipherOrder on

# 明示的にSSL圧縮をOFF
# (from https://mozilla.github.io/server-side-tls/ssl-config-generator/)
SSLCompression off

# OCSP Stapling 有効化
SSLUseStapling on
# (from https://mozilla.github.io/server-side-tls/ssl-config-generator/)
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off

SSLCertificateKeyFile /etc/letsencrypt/live/www.glamenv-septzen.net/privkey.pem
SSLCertificateFile /etc/letsencrypt/live/www.glamenv-septzen.net/cert.pem
SSLCertificateChainFile /etc/letsencrypt/live/www.glamenv-septzen.net/chain.pem

# ...
</VirtualHost>


https -> https リダイレクト設定:

<IfModule mod_rewrite.c>

RewriteEngine On
#...
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,redirect=301]
#...
</IfModule>


テスト結果


参考資料


OCSP Stapling


Logjam 対策


HSTS


http -> https リダイレクト設定


DNS Certification Authority Authorization (CAA)