Apache2で常時SSL化(HSTS Preload)の設定を行う

2019年11月22日サーバー構築,Linux・Ubuntu TipsLinux,Apache,SSL

 

最近はどのウェブサイトでも常時SSL化を行うようになってきているが、近年(といっても2015年くらい)はHSTS(HTTP Strict Transport Security)という技術が使われるようになってきた。

この技術は、SSL化されているサイトへアクセスした際、次回以降httpからリダイレクトされることなく直接httpsへアクセスするようにサーバーからブラウザへ通知する技術である。

また、最近は「HSTS Preload」という、ブラウザに予めウェブサイトが常時SSL化に対応していることを通知し、はじめからHTTPSで接続することもできるようになっている。今回は、Apacheでこれらを設定していこう。

設定の注意事項

HSTS Preloadを設定すればセキュリティ的に問題なし、というわけではない……ということはさておき、あるドメインに対して設定する場合は、そのドメイン配下にある全てのサブドメインにも設定を適用する必要がある点に注意が必要だ。

VirtualHostの設定等、サブドメイン毎に細かく設定を区切っている場合には注意が必要だ。

httpから来たアクセスを全てhttpsへリダイレクトする

HSTS Preloadの基本は、まずhttpへのアクセスを全てhttpsへリダイレクトしてしまうことだ。手っ取り早く、mod_rewriteを使用してこれを設定する。当然、80番ポートへのアクセス(*:80)にのみ設定する。

<IfModulemod_rewrite.c>
    RewriteEngine On
    LogLevel alert rewrite:trace3
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>

HTTPヘッダにHSTS Preloadの設定を加える

HTTPヘッダには、アクセス要求に対してHSTS Preloadに対応していることを通知するための専用のヘッダを返す形となる。次のように設定すれば良い。

<IfModulemod_headers.c>
    Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
</IfModule>

max-ageは、ブラウザがHSTSに関するポリシーを記憶して保持する期間を入れる。特に問題がない場合は2年間にするのが望ましいとされている。

また、その後に続く「includeSubDomains」は全てのサブドメインを含むと言うこと、「preload」はプリロードに対応していることを指す。これらを省いてしまうと、HSTS Preloadへの対応ができないので要注意。

なお、このmod_headersを使うためには、Apacheでmod_headersが(当然ながら)有効化されている必要がある。
有効となっていない場合は、下記で有効化しておこう。

a2enmod headers

「www.」の証明書を取得しておく

使用していない場合でも、ホスト名がwwwとなるFQDN(www.example.com等)に対しては、SSL証明書を取得しておく必要がある。

ここまできたら、後はApacheを再起動したのちに、以下のサイトにアクセスしてみよう。

自分のドメインを打ち込んでみて、背景が緑色となり「Success」と表示されれば、HSTS Preloadの設定準備は完了だ。

このあと、上記サイトの下のほうにあるフォームから、HSTS Preloadの申請を行っておこう。申請はChrome、Firefox、Opera、Safari、IE11/Microsoft Edgeに送信される。

これで、サイトをまるごとHSTS Preloadに対応させることが出来る。少し時間がたてば、対応しているブラウザでアクセスをすれば初回からHTTPS接続となるはずだ。

Posted by webnetforce