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"が無かった。)
設定例
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>
テスト結果
-
設定前のRating : C
-
設定後のRating : A+
-
https://www.glamenv-septzen.net/images/20170115_https_rating/www.glamenv-septzen.net-ssllabs-20170115-02after.png
- (証明書が2つありますが、
Certificate #2
については実験用の別のvirtual host用なのでスルーしてください。)
- (証明書が2つありますが、
- 数ヶ月前に別のサイトでチェックしたときは気づかなかったが、
Certificate #1
でDNS CAA No
と表示されてる。現時点では A+ の評価に影響していないようなので、見送り。
-
https://www.glamenv-septzen.net/images/20170115_https_rating/www.glamenv-septzen.net-ssllabs-20170115-02after.png
参考資料
-
SSL/TLS暗号設定ガイドライン~安全なウェブサイトのために(暗号設定対策編)~:IPA 独立行政法人 情報処理推進機構
- https://www.ipa.go.jp/security/vuln/ssl_crypt_config.html
- Apache HTTPD, nginx, IISなど主要なWebサーバのSSL/TLS設定が紹介されている。
- 「高セキュリティ型」「推奨セキュリティ型」「セキュリティ例外型」として、典型的な設定パターンに分類して解説してくれているので、実用性が高い。
-
Generate Mozilla Security Recommended Web Server Configuration Files
- https://mozilla.github.io/server-side-tls/ssl-config-generator/
- Mozilla によるSSL設定ファイルのジェネレータ。
- 今回はこれを使って
Apache - Modern
,Server Version 2.4.6
,OpenSSL Version 1.0.1.e
,HSTS Enabled (チェックON)
で生成した設定も参考にしている。
-
Let's EncryptのSSL証明書で、Qualys SSLTestでA+評価を獲得するには - Qiita
- http://qiita.com/dseg/items/bab80f6f14349fcd9c22
- nginxを使った記事ですが、大変参考になりました。
OCSP Stapling
- OCSP Stapling on Apache 14.04 using Lets Encrypt - DavidEndersby.me
- How to Configure OCSP Stapling in Apache and nginx - SSLMate Blog
Logjam 対策
-
Logjam: PFS Deployment Guide
- https://weakdh.org/sysadmin.html
- ここに Apache HTTPD 用の対策ガイドがあるのだが、以下の2パターンのみで、2.4.6 以前の場合どうなってるのか記述されてない?
- Apache (2.4.8 and newer) and OpenSSL 1.0.2 or later =>
SSLOpenSSLConfCmd DHParameters "{path to dhparams.pem}"
- Apache with LibreSSL, or Apache 2.4.7 and OpenSSL 0.9.8a or later => 証明書のPEMの後ろにDHE鍵パラメータのPEMを追記
- Apache (2.4.8 and newer) and OpenSSL 1.0.2 or later =>
- Logjam Attack 対策を行う : アジャイル株式会社
- Logjam: TLS 脆弱性 (CVE-2015-4000) - Red Hat Customer Portal
- ssl - How to fix 'logjam' vulnerability in Apache (httpd) - Server Fault
HSTS
- HTTP Strict Transport Security - Web セキュリティ | MDN
- HSTS (HTTP Strict Transport Security) の導入 - Qiita
- HTTP Strict Transport Security(HSTS) 対応 | blog.jxck.io
- 常時SSL、技術者が注意すべき設定 | シマンテック
- cybozu.com を真に常時 SSL にする話 - Cybozu Inside Out | サイボウズエンジニアのブログ
- Google の透明性レポートと HSTS(HTTP Strict Transport Security)|Cybertrust.ne.jp
http -> https リダイレクト設定
- 【Apache】HTTP/HTTPS共存 リダイレクト設定 Rewrite【SSL設定】 - Qiita
- http から https へのリダイレクトを行う httpd.conf (mod_rewrite)
- apacheでhttpへのアクセスをhttpsへ自動リダイレクトする - Qiita
DNS Certification Authority Authorization (CAA)
- DNS Certification Authority Authorization (CAA) | GMOグローバルサインブログ
-
CAA Record Generator
- https://sslmate.com/labs/caa/
- こちらの解説によると、現在CAAレコードをサポートしているDNSサーバは BIND , NSD, PowerDNS (>= 4.0.0), Knot DNS (>= 2.2.0), Google Cloud DNS
- RFC3597 を使うとUnknownなDNSレコードタイプも使えるようだが、調べきれず、今回はギブアップ。
- ssl - Let's Encrypt -- "DNS ... query timed out looking up CAA for ..." - Server Fault
- Domain with active CAA record in DNS - Issuance Policy - Let's Encrypt Community Support
- What is a CAA record? - DNSimple Help
-
サポートされる DNS リソースレコードタイプ - Amazon Route 53
- http://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/ResourceRecordTypes.html
- 2017-01-15時点で、 Amazon Rote53 でもCAAレコードは未サポート