はじめに
HSTSはクライアントがリクエスト送信する時点でhttpsになるそうです。
apacheのバーチャルホストごとにHSTSの設定ができるか検証してみました
今回ドメインを例としてexample.comとしましたが各自のドメイン名に置き換えてください
以下の記事を参考にさせていただきました。
今回はRoute53にレコード「server1.example.com」と「server2.example.com」でそれぞれ
エイリアスにてALBを紐づけました。
ACMはリクエストを行い*.example.comで証明書を発行しました
ALBにてリスナー443ポートを追加してACM*.example.comで証明書を設定してターゲットグループにVirtualhostのEC2を紐づけました。
ALBにEC2を紐づけるためには事前にEC2のセキュリティグループの80ポートをALBのセキュリティグループを許可
する必要があります。許可し忘れるとEC2がターゲットグループにてunhealtyとなってしまいます。
以下のサイトを引用させていただきました。
EC2 Amazon Linux 2 のVirtualHost 設定手順
https://qiita.com/gama1234/items/02640dd9d9185360c4f0
HSTS (HTTP Strict Transport Security) の導入
https://qiita.com/takoratta/items/fb6b3486257eb7b9f12e
AWS ALB 配下で HSTS の設定を行う方法
https://qiita.com/syoimin/items/db85769349d2cb9bda24
前提条件
ACM ALB EC2を事前に作成する
対応手順
rootに昇格する
$ sudo su -
yum updateを実施する
今回はupdateするパッケージがありませんでした。
# yum update
今回はパッケージのアップデートはありませんでした。
Dependencies resolved.
Nothing to do.
Complete!
apacheのパッケージをインストールする
# yum install httpd
apacheのサービスを起動する
# systemctl start httpd
apacheのサービスの自動起動を有効にする
# systemctl enable httpd
自分の環境のドメイン名のディレクトリを作成する
例 mkdir -p /var/www/example.com/public_html
フォルダの権限を変更する
# chmod -R 755 /var/www
HTMLファイルを作成する
# echo "<html><body><h1>server1.examplecom Hello word</h1></body></html>" | sudo tee /var/www/server1.example.com/public_html/index.html
# echo "<html><body><h1>server2.examplecom Hello word</h1></body></html>" | sudo tee /var/www/server2.example.com/public_html/index.html
ディレクトリの所有ユーザー:所有グループを変更する
# chown -R apache:apache /var/www/example.com/public_html
example.comのapacheの設定ファイルを作成する
# vi /etc/httpd/conf.d/example.com.conf
<VirtualHost *:80>
ServerAdmin root@localhost
ServerName server1.example.com
DocumentRoot /var/www/server1.example.com/public_html
ErrorLog /var/log/httpd/example.com-error.log
CustomLog /var/log/httpd/example.com-access.log combined
Header set Strict-Transport-Security "max-age=31536000; preload" ※HSTSの設定をした
</VirtualHost>
<VirtualHost *:80>
ServerAdmin root@localhost
ServerName server2.example.com
DocumentRoot /var/www/server2.example.com/public_html
ErrorLog /var/log/httpd/example.com-error.log
CustomLog /var/log/httpd/example.com-access.log combined
</VirtualHost>
apacheの文法チェックをする。
# httpd -t
Syntax OK
apacheのサービス再起動をする
# systemctl restart httpd
コマンドプロンプトを開きcurlコマンドを実行した
HSTSはブラウザに対して動作するため、コマンドプロンプトのチェックは意味がありません。
HSTSの設定をブラウザで確認した
キャッシュが残ると正しく設定しているか確認出来ないため、chromeのシークレッドウィンドウで試すことをお勧めします。
①chromeを開き、https://server1.example.comでアクセスする
②chrome://net-internals/#hstsをURLの箇所に入力して以下の画面を開く、またはchormeのブラウザをリロードする
以下の赤枠「Query HSTS/PKP domain」に「server1.example.com」ドメインを入力してQueryボタンを押下した
Foundと表示されたパラメータが表示されたため、HSTSが設定されています。
次にHSTSを設定していないドメインを
①chromeを開き、https://server2.example.comでアクセスする
②chrome://net-internals/#hstsをURLの箇所に入力して以下の画面を開くまたはchormeのブラウザをリロードする
以下の赤枠「Query HSTS/PKP domain」に「server2.example.com」ドメインを入力してQueryボタンを押下した
Not Foundと表示されたため、HSTSが設定されていません。
chrome://net-internals/#hstsのHSTS状態確認の手順は以下のサイトを参考にしました。
https://chidakiyo.hatenablog.com/entry/chrome-hsts
一度ブラウザでHSTSが設定してあるサブドメインで、https://サブドメインでアクセスすると
ブラウザにHSTSの設定が保存されてしまうため、
再度試したい場合は以下の赤枠「Delete domain security policies」にドメインを入力して削除をしてください
削除後、上記の①~②手順を実施する。
まとめ
バーチャルホストのFQDNごとにHSTSを設定できることが分かりました。
/etc/httpd/httpd.confにHSTSの設定がされている場合は、/etc/httpd/conf.d/バーチャルホストファイル.conf
でHSTSが許可されていなくてもHSTSが設定されてしまいます。
注意が必要です。
同じドメインを持つサブドメインの場合は、HSTSのパラメータにincludeSubDomainsが含まれている場合は
server1.example.comにHSTSを許可したら、server2.example.comにHSTSが許可されていなくても許可されてしまうそうです。そのため、同じドメインのサブドメインごとにHSTSを設定有り無しを分ける場合は、includeSubDomainsのパラメータをHSTSに含めないでください
includeSubDomainsのパラメータについて以下のサイトがとても参考になりました。
引用させていただきました。
https://tech.quickguard.jp/posts/disable-subdomain-hsts/