目次
ごあいさつ
こんばんは。
最近肩こりを感じ始めたもに倉です。
今回は、HSTS設定の概要とApacheでの導入方法について書いていきます。
使い勝手がよさそうなのに、この設定の存在を知ったのがついこないだという……。
例によって超絶初心者向けなので、「厳密には違うけど?!」というツッコミはナシでお願いします♪
HSTSってなに?
HTTP Strict Transport Securityの略らしい。
ざっくり言うと、「このサイトにアクセスするときは、絶対HTTPSでアクセスしてくれよな!」とブラウザ側に伝えるための設定です。
HSTSが設定されているサイトに一度アクセスしてこの命令を受け取ったら、
設定された期間中のアクセスは全部自動的にHTTPSになります。
リダイレクト設定とは違うの?
「HTTP→HTTPSのリダイレクト設定と同じ動きってこと……?」
私がHSTSについて調べたとき、一番最初に疑問に思ったことです。
結論から言えば、「見え方は一緒」です。
http://~ でアクセスしても、https://~ に繋がる・という動きではあります。
ただ、仕組みに違いがあるので、それぞれ説明します。
リダイレクト設定の場合
①クライアントが対象WEBサイト(HTTP)へアクセス
②HTTPの中身をチラ見、リダイレクト設定があったのでHTTPSへ移動・サイト閲覧
③HTTPでアクセスするたびに①~②を繰り返す
HSTSの場合
①クライアントが対象WEBサイト(HTTP)へアクセス
②HTTPでサイト閲覧。
「これ以降このサイト見るときはHTTPSでアクセスしてな!」という設定があることを確認
③再度HTTPでアクセスしようとしても、②の設定を思い出し、最初からHTTPSを見に行くようになる
伝わるかなー。
HSTSだと、アクセスの二回目以降はHTTP通信を経由せずにHTTPS通信を行うので
ちょっと安全性が上がるかんじですね。
導入方法
それでは、さっそくHSTS設定の入れ方をご説明していきます。
用意するもの
- サーバ
- Apache
- 適当なWEBサイトのガワ
- SSL証明書
今回はEC2(瀕死のAmazon Linux2)で作業していきます。
また、SSL証明書にはLet's Encryptを使用します。
適当なWEBサイトのセットアップ~SSL証明書発行・設置
必要な作業は以下のとおりです。
- Apacheをインスコ
- mod_rewrite、mod_headersを有効化 ※後で使います
- mod_sslをインスコ
- epelをインスコ
- certbotをインスコ
- Let's EncryptでSSL証明書発行
- いいかんじにconfファイルをいじる
最終的に、confは↓のように設定してみました。
<VirtualHost *:80>
ServerName moni.{秘密}.net
DocumentRoot "/var/www/html"
CustomLog /var/log/httpd/access_log combined
</VirtualHost>
<VirtualHost *:443>
ServerName moni.{秘密}.net
DocumentRoot "/var/www/html"
CustomLog /var/log/httpd/ssl_access_log combined
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCertificateFile /etc/letsencrypt/live/moni.{秘密}.net/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/moni.{秘密}.net/privkey.pem
</VirtualHost>
HTTP、HTTPSそれぞれアクセスしたら対応したログファイルにログが出力されることを確認――。
/var/log/httpd/access_log
--------------------------------------------------------------------------
{IPアドレス} - - [29/May/2024:01:55:45 +0000] "GET / HTTP/1.1" 200 31 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
--------------------------------------------------------------------------
/var/log/httpd/ssl_access_log
--------------------------------------------------------------------------
{IPアドレス} - - [29/May/2024:01:56:28 +0000] "GET / HTTP/1.1" 200 31 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
--------------------------------------------------------------------------
ここまで準備できたら、いよいよHSTSの設定を入れていきます!
設定導入
導入はとっても簡単で、headerにHSTS設定を記載するだけです。
confファイルへの記載方法は↓のかんじ。
Header set Strict-Transport-Security: "max-age={秒数}"
max-ageは命令の有効時間で、「○○秒の間はHTTPSで通信してくださいねー」という内容になります。
このほかにも、うしろに「includeSubDomains」とつけるとサブドメインに対しても
HSTS設定が有効になるなど、オプションがちらほらあります。
そこは各人検索して調べてください(おい!)。
プラス HSTS設定だけだと初回にHTTPで接続があった場合、その接続はHTTPのままになってしまうので
HTTPSへのリダイレクト設定も入れておくとよいかと思います。
というわけで、confファイルはこんなかんじに↓
<VirtualHost *:80>
ServerName moni.{秘密}.net
DocumentRoot "/var/www/html"
CustomLog /var/log/httpd/access_log combined
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
Header set Strict-Transport-Security: "max-age=31536000"
</VirtualHost>
<VirtualHost *:443>
ServerName moni.{秘密}.net
DocumentRoot "/var/www/html"
CustomLog /var/log/httpd/ssl_access_log combined
Header set Strict-Transport-Security: "max-age=31536000"
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCertificateFile /etc/letsencrypt/live/moni.{秘密}.net/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/moni.{秘密}.net/privkey.pem
</VirtualHost>
結果
chrome://net-internals/#hsts の「Query HSTS/PKP domain」に対象ドメインを入力し、
ボタンをぽちっと押したときに「Found」と出たらHSTS設定が効いているということらしいです!
あとがき
お手軽だし、こりゃあ推し設定です。
たまごのひび割れから身が見え始めたエンジニア。