ALB配下のEC2 VirtualhostにてHSTSの設定をしてみた

## はじめに
**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はブラウザに対して動作するため、コマンドプロンプトのチェックは意味がありません。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/2170f66a-054b-8587-00a7-fa90545ae227.png)

## HSTSの設定をブラウザで確認した
**キャッシュが残ると正しく設定しているか確認出来ないため、chromeのシークレッドウィンドウで試すことをお勧めします。**

①chromeを開き、https://server1.example.comでアクセスする
②chrome://net-internals/#hstsをURLの箇所に入力して以下の画面を開く、またはchormeのブラウザをリロードする
以下の赤枠「Query HSTS/PKP domain」に「server1.example.com」ドメインを入力してQueryボタンを押下した
Foundと表示されたパラメータが表示されたため、HSTSが設定されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/cb9f8977-698b-e963-9a91-c7a2f285e4ae.png)


次にHSTSを設定していないドメインを
①chromeを開き、https://server2.example.comでアクセスする
②chrome://net-internals/#hstsをURLの箇所に入力して以下の画面を開くまたはchormeのブラウザをリロードする
以下の赤枠「Query HSTS/PKP domain」に「server2.example.com」ドメインを入力してQueryボタンを押下した
Not Foundと表示されたため、HSTSが設定されていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/01f57285-a676-20ce-0d92-f788a510e75f.png)

chrome://net-internals/#hstsのHSTS状態確認の手順は以下のサイトを参考にしました。
https://chidakiyo.hatenablog.com/entry/chrome-hsts

一度ブラウザでHSTSが設定してあるサブドメインで、https://サブドメインでアクセスすると
ブラウザにHSTSの設定が保存されてしまうため、
再度試したい場合は以下の赤枠「Delete domain security policies」にドメインを入力して削除をしてください
削除後、上記の①～②手順を実施する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/6773c62c-08b0-0c46-67a1-a450fded15b2.png)


## まとめ
バーチャルホストの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/