Qualys SSL Server Test を実行し、出力される警告に対処する


sonarwhal, a linting tool for the web には、セキュリティ関連のチェック項目があります。
その中の1つに、ssllabs というルールがあり、SSL Server Test (Powered by Qualys SSL Labs) というツールを使って、セキュリティチェックを実行しています。このブログはこのツールでの評価がC になっていたので、出力される警告に対処してみました。
結果を以下に記載します。


前提

使用しているOS、HTTPサーバ、ブログシステムの情報を記載します。


参考


出力されていた警告について

このブログでは以下の警告が出力されていました。まず、以下、大雑把に出力される項目について対応していきます。
"Before check result"

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 と、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 を登録したところ次のエラーメッセージが出力されました。

    Error: Multiple HSTS headers
    Response error: Multiple HSTS headers (number of HSTS headers: 2).
    
    HSTS ヘッダが複数存在する旨のエラーです。確認したところ、実は既に Django 側の設定で、ヘッダを設定しており、Apache 側の設定は不要なことがわかりました。
    そのため、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 の設定はあきらめました。 [^2]

    [^2]: preload なし試してみたところ、エラーとなりました。


対処後の結果

A- になりました。この結果に満足しております。
"After check result"


まとめ

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 に対応するツールは引き出せるようにしておく必要はあるかと思いました。

以上です。

コメント