Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails以外の開発一般

ApacheのTLS設定を2020年向けに更新する

BPSの福岡拠点として一緒にお仕事をさせていただいています、株式会社ウイングドアのモリヤマです。

今回のテーマはTLS対応(触れるのはHTTPS化の設定に関するお話)です!
ネットワーク/インフラエンジニアの方々の領域に、ちょっとだけ学習の手を伸ばしてみました。

本記事はTLSへの理解度が下記の様な方々が対象です❗️

  • とりあえず通信を暗号化するやつって事は知ってる
  • SSL/TLS対応は行った事あるが、詳しく考えたことがない
  • セキュリティ関連にちょっとでも強くなりたい意志のある方

背景

ずいぶん前にAmazonLinux2で構築したサーバー(趣味関連ブログ用)がふと気になり、
SSL/TLSの設定ってデフォルトのままいじってないなーどうなってんだろう🤔
そして軽い気持ちでQualys SSL Labs SSL Server Test で脆弱性スキャンしたのがきっかけでした。

結果は『B』所々に『INSECURE」!?

※レポート結果のドメイン表示が???.?????.netなのは日本語ドメインを使っている為です🙈

うん、あんまり良い状態とは言えませんね😢
そんな訳で、まずはSSL/TLS暗号設定ガイドラインの確認です。

2020年09月現在の状況

IPAの情報セキュリティページにて、2020年7月7日に『TLS暗号設定ガイドライン第3.0.1版』が公開されました。

以前(2018年5月8日第2.0版)は『SSL/TLS暗号設定ガイドライン』として公開されていましたが、第3.0.1版ではついにSSLの文字が消えましたね。
SSLは2015年6月から使用禁止となっており、次世代規格のTLSに名称が置き換わるのは当然の流れなのですかね🤔

ガイドライン第3.0.1版で変わった事

ガイドラインでversion2.xversion3.xの大きな違いとして下記が挙げられていました。

高セキュリティ型

version2.x
TLS1.2
version3.x
TLS1.3(必須)及びTLS1.2(オプション)

推奨セキュリティ型

version2.x
TLS1.2〜TLS1.0のいずれか | (PFSなしも推奨)
version3.x
TLS1.2(必須)及びTLS1.3(オプション) | (PFSのみ推奨)

セキュリティ例外型

version2.x
TLS1.2〜SSL3.0のいずれか
version3.x
TLS1.3〜TLS1.0のいずれか

設定するべきTLSプロトコルバージョンは?

つまり基本的には「TLS1.3」と「TLS1.2」を使用して、
止むを得ない事情がある場合は「TLS1.0」までを許容する設定が良さそうです。

趣味ブログなので、TLS1.0を対応する必要はない(見られない環境の方々は諦めてもらう)ので
「推奨セキュリティ型」または「高セキュリティ型」を目指して設定変更を行いました。

試行錯誤して最終的に落ち着いた設定(結論)

目指したのは設定は下記となりますが、実際に行った設定はかなり妥協しました😭
※設定例はプライム・ストラテジー株式会社様のKUSANAGI環境の設定値(デフォルト)になります。
※今回対応するブログ用のサーバーとは別に、KUSANAGI環境は個人利用させていただいております。

設定例(Apache)

  • ホワイトリスト形式で+TLSv1.2 +TLSv1.3を許可
  • 脆弱性のあるRC4暗号スイートなどは明示的に無効化
  • 暗号の選択をサーバ側で決定するように設定
  • HTTPS 接続で SSL/TLS データ圧縮をしないように設定
SSLProtocol -All +TLSv1.2 +TLSv1.3
SSLCipherSuite AES128+ECDHE:AES256+ECDHE:AES128+EDH:AES256+EDH:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4!CAMELLIA!AES128-SHA!AES128-SHA256!AES128-GCM-SHA256:!AES256-GCM-SHA384:!AES256-SHA256:!AES256-SHA!AES256-CCM8!AES256-CCM!AES128-CCM!ARIA128-GCM-SHA256!AES128-CCM8!ARIA256-GCM-SHA384
SSLHonorCipherOrder on
SSLCompression off

上記結論にたどり着くまでの試行錯誤

早速、Apacheのssl.confを確認します👀

元の状態

  • Server version: Apache/2.4.x
#   SSL Protocol support:
# List the enable protocol levels with which clients will be able to
# connect.  Disable SSLv2 access by default:
SSLProtocol all -SSLv3

#   SSL Cipher Suite:
#   List the ciphers that the client is permitted to negotiate.
#   See the mod_ssl documentation for a complete list.
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA

#SSLHonorCipherOrder on 

SSL3.0は無効化されていますが、RC4は無効化されていません(´・ω・`)
また暗号スイート順序はサーバ側の順序を優先するSSLHonorCipherOrderディレクティブもどうやらデフォルトのままです。

対応1:SSLProtocolの修正

  • TLS1.0とTLS1.1も無効化する
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1

SSLProtocolは+で有効化、-で無効化することができます。
-allで設定する場合は、使いたいプロトコルだけを設定する事も可能です。

対応1の結果

  • 全体評価『B』→『B』変わらず(´・ω・`)

Protocol Supportのスコアは70から100に改善しました。

対応2:CipherSuiteの修正

  • RC4を無効化
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA!ADH:!RC4

SSLCipherSuiteは、「使わせない」暗号化方式を指定していきます。「!」にて無効化します。
より強固なセキュリティ設定を目指す場合は、電子政府暗号推奨リストなどを参考に設定する必要があります。

対応2の結果

  • 全体評価『B』→『B』変わらず(´・ω・`)

RC4関連で出ていたINSECUREなどの警告は無事に消えました☺️

対応3:SSLHonorCipherOrderの修正

  • 暗号化方式の決定順序をサーバ優先の設定に変更する
SSLHonorCipherOrder on 

対応3の結果

  • 全体評価『B』→ 『A』に!🎉

TLS1.2のみでいいのか...🤔
とは思ったのですが、OpenSSLのバージョンが低くTLS1.3まで対応させる場合は、
影響の大きそうなアップグレード作業が必要だった為、今回はここまで打ち止めにしました。

備考

KUSANAGIサーバーのスキャン結果

ほぼデフォルトの設定で下記の結果がでるKUSANAGI環境はやっぱりすごい。

まとめ

今回TLS1.3への対応はやろうとして諦めた行いませんでしたが、
もしTLS1.3に対応する場合は、下記バージョン以降にアップグレードが必要となります。

  • Apache 2.4.37
  • OpenSSL 1.1.1

その他にも依存関係がぞろぞろ出てくると思いますので、
環境によっては対応が厳しい場合もあるのではないでしょうか😓

近年はLet's Encryptの普及もあり、HTTPSを常に利用するのが当たり前になってきていますが、
何のためにTLS対応が必要かを見つめ直す機会になりました。

HTTPS化で暗号化してるからヨシッ!🐱ではなく、
今後は脆弱性や推奨設定を定期的に確認して、環境のアップグレードを定期的に実施していこうと思います💪


株式会社ウイングドアでは、Ruby on RailsやPHPを活用したwebサービス、webサイト制作を中心に、
スマホアプリや業務系システムなど様々なシステム開発を承っています。



CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。