sonarwhal, a linting tool for the web には、セキュリティ関連のチェック項目があります。
その中の1つに、ssllabs
というルールがあり、SSL Server Test (Powered by Qualys SSL Labs) というツールを使って、セキュリティチェックを実行しています。このブログはこのツールでの評価がC
になっていたので、出力される警告に対処してみました。
結果を以下に記載します。
前提
使用しているOS、HTTPサーバ、ブログシステムの情報を記載します。
-
OS
cat /etc/redhat-release CentOS release 6.9 (Final)
-
HTTPサーバ
そろそろ、EOL なので、アップグレードを近々実施します。OS の アップグレードから実施しようかと思います。httpd -v Server version: Apache/2.2.15 (Unix) Server built: Oct 19 2017 16:43:38
EOLを迎えるapache2.2を2.4にアップグレードしよう! - 文系プログラマによるTIPSブログ -
ブログシステム
Django (1.10.7) Mezzanine (4.2.3)
参考
-
Qualysの SSL Server TestでA+評価を取得した設定例(2017-01-15時点, CentOS7 + Apache HTTPD 2.4.6) - Qiita
-
安全なWebサイトの構築方法(SSL編) ~Qualys SSL LABSでA評価を目指して~ - SHANON Engineer’s Blog
出力されていた警告について
このブログでは以下の警告が出力されていました。まず、以下、大雑把に出力される項目について対応していきます。
This server is vulnerable to the POODLE attack. If possible, disable SSL 3 to mitigate. Grade capped to C.
Google翻訳に警告文を入力すると以下の翻訳が得られます。
このサーバーはPOODLE攻撃に対して脆弱です。 可能であれば、SSL 3を無効にして緩和してください。 グレードはCにキャップされています
POODLE攻撃とは何かですが、「POODLE」攻撃というものがあるらしいけど、対策は必要? | マルウェア情報局 に詳しく記載されています。2年以上ブログ公開していましたが、その間放置でした。
恐ろしいです。
対策は、Webサーバーの設定でSSL 3.0を無効化
すればよいので、設定を変更して対応します。
-
ssl.conf 変更前
# SSL Protocol support: # List the enable protocol levels with which clients will be able to # connect. Disable SSLv2 access by default: SSLProtocol all -SSLv2
-
ssl.conf 変更後
SSLv3を無効化します。
上記設定で警告は解消されました。# SSL Protocol support: # List the enable protocol levels with which clients will be able to # connect. Disable SSLv2 access by default: # For POODLE (CVE-2014-3566) SSLProtocol all -SSLv2 -SSLv3
This server accepts RC4 cipher, but only with older protocols. Grade capped to B.
Google翻訳に警告文を入力すると以下の翻訳が得られます。
このサーバーはRC4暗号を受け入れますが、古いプロトコルでのみ使用できます。 等級はBにキャップされた。
RC4 cipher という暗号化の方式が古い ということなのかと思います。
RC4 を無効にします。
-
ssl.conf 変更前
# SSL Cipher Suite: # List the ciphers that the client is permitted to negotiate. # See the mod_ssl documentation for a complete list. SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:+3DES
-
ssl.conf 変更後
# SSL Cipher Suite: # List the ciphers that the client is permitted to negotiate. # See the mod_ssl documentation for a complete list. # no more RC4 SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:+3DES:!RC4
The server does not support Forward Secrecy with the reference browsers. Grade reduced to A-.
Google翻訳に警告文を入力すると以下の翻訳が得られます。
サーバーは、参照ブラウザでの前方秘密をサポートしていません。 グレードはA-に減少しました。
翻訳を見ても良く内容がわからなかったのですが、安全なWebサイトの構築方法(SSL編) ~Qualys SSL LABSでA評価を目指して~ - SHANON Engineer’s Blog での解説を読み内容を理解できました。
ただ、このブログの Apaceh の version は Apache/2.2.15
なので ECDHE(楕円曲線ディフィー・ヘルマン鍵共有)
が使えません。
調べた限り、Apache の Version UP が必要なことがわかり、2.2.x に Version UP しても 後 1ヶ月たらずで、EOL となります。
小一時間悩んだ末、一旦結局あきらめました。
いっそ、Cent OS 7 にして、HTTP/2 で通信できる HTTPサーバにしてしまおうかなと考えております。
HTTP Strict Transport Security (HSTS) with long duration deployed on this server
Google翻訳に警告文を入力すると以下の翻訳が得られます。
そして、緑色は警告ではなく、適切な設定が行われてるという意味だと思います。
このサーバーに長期間デプロイされたHTTP Strict Transport Security(HSTS)
これも翻訳の内容がさっぱりわからなかったのですが、HTTP Strict Transport Security に関する内容を調べたところ、以下の記事が見つかりました。
- HSTS (HTTP Strict Transport Security) の導入 - Qiita
- cybozu.com を真に常時 SSL にする話 - Cybozu Inside Out | サイボウズエンジニアのブログ
サーバー側で設定する HSTS
と、Chrome 等のブラウザに設定してもらう Preloaded HSTS
があり、双方の設定をしてみます。
-
サーバー側1設定
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"
を設定しました。
後述しますが、結局この設定は削除しました。
<VirtualHost *:443> # General setup for the virtual host, inherited from global configuration ServerName www.monotalk.xyz Header set Strict-Transport-Security "max-age=31536000; includeSubDomains" </VirtualHost>
-
クライアント側の設定
Preloaded HSTS
HSTS Preload List Submission からwww.monotalk.xyz
を登録したところ次のエラーメッセージが出力されました。
HSTS ヘッダが複数存在する旨のエラーです。確認したところ、実は既に Django 側の設定で、ヘッダを設定しており、Apache 側の設定は不要なことがわかりました。Error: Multiple HSTS headers Response error: Multiple HSTS headers (number of HSTS headers: 2).
そのため、HTTP サーバー側の設定は削除し、Django 側の設定で出力することにしました。 -
settings.pyの設定
設定値について説明します。SECURE_HSTS_SECONDS = 31536000 SECURE_HSTS_INCLUDE_SUBDOMAINS = True #SECURE_HSTS_PRELOAD = True
-
SECURE_HSTS_SECONDS
HSTS に付与する時間になります。HSTS Preload List Submission では、1年以上が推奨らしく、画面からドメイン登録時にエラーになったので、31536000
を設定しました。 -
SECURE_HSTS_INCLUDE_SUBDOMAINS
サブドメインを HSTSの対象にするかを設定します。 -
SECURE_HSTS_PRELOAD
これはDjango 1.11
から追加されました。HSTS ヘッダ に preload 属性を追加します。
この設定を行わないと、HSTS Preload List Submission への登録リスエストの要求ができません。
現状、Django 1.10.7
を使用しており、SECURE_HSTS_PRELOAD の設定は行えないため、preload の設定はあきらめました。 1
-
対処後の結果
A-
になりました。この結果に満足しております。
まとめ
Qualys SSL Server Test で、セキュリティチェックを行い、出力される警告に対処しました。
以下、まとめます。
-
OpenSSL の セキュリティチェックの観点があり、それを無料でチェックできるのが
Qualys SSL Server Test
。 -
CentOS 6.9 で、HTTP > HTTPS 対応しただけでは、
Qualys SSL Server Test
でのチェックでは、低い評価となる。 -
CentOS 6.9 で、シンプルに yum してインストールできる Apache では、評価
A
ランクにはできない。 -
Apache 2.2 系は、2017年12月に EOF になり、その後のパッチは提供されない。
過去、このブログに対して、幾つか セキュリティチェック を実施して、警告には対処してきましたが、SSL
についてのチェックは未実施で、ぼろぼろでした。
実際に脆弱性があるからといって、即問題になるとはいえないですが、サイト運用者がチェックツール(チェック観点) として知っている、知っていないでセキュリティホールに気づかずに運用し続けるパターンは結構あるのかなと思います。
仕事上、セキュリティ専門ではないですがサービス事業者側としては、各チェック観点は INDEX レベルで押さえておく、各 INDEX に対応するツールは引き出せるようにしておく必要はあるかと思いました。
以上です。
-
preload なし試してみたところ、エラーとなりました。 ↩
コメント