手順として大きく
- HTTPS通信を可能にする
- httpとhttps両方の通信が可能になる
- httpをhttpsにリダイレクトする
- すべてhttpsにする
HTTPS通信を可能にする2つの方法
Elastic Beanstalk 環境用に HTTPS を設定するに従って設定する。
日本語訳ページでは、”terminate HTTPS”が「HTTPSを終了する」と訳されていて、要するに暗号化通信をどの段階で終了するかという意味。以下の記事だとSSL終端と言っている。
常時HTTPS化の落とし穴<解決編>
ロードバランサーを使っている場合、というかクライアントとWebサーバーの間に中継者がいる場合は、HTTPSを終了する(復号する)場所は2箇所考えられる。以下の①と②。
[クライアント] ←①→ [ロードバランサー] ←②→ [Webサーバー]
ロードバランサーでHTTPSを終了する
①の通信だけを暗号化する。
情報を表示するだけのWebサイトとかブログ程度ならこの方法で十分だと思う。会員登録があり個人情報がやり取りされる場合でも機密性の度合いによっては大丈夫なんじゃないか。
この方法の利点は、ロードバランサーが通信の中身を見れるため、
- ルーティングを最適化
- 応答メトリクスのレポート
などロードバランサーの機能を最大限に利用できる。一方、②は暗号化されない。ただ、AWSリソース間のネットワークトラフィックは外部からはもちろん、内部つまり同じアカウントであっても接続の一部ではないインスタンスからは見れないようになっているから、②がHTTP通信であっても通常は問題ない。
WebサーバーでHTTPSを終了する
①〜②の通信をすべて暗号化する。
こちらの場合は、クライアントとWebサーバーの間でエンドツーエンドの暗号化通信をする。ただこれにも2通りの方法があるみたい。
冒頭のAWSドキュメントによると、
- 「負荷分散された環境でのエンドツーエンドの HTTPS の場合、インスタンスとロードバランサーの終了を組み合わせて、両方の接続を暗号化できます。」
- 「また、HTTPS トラフィックを復号せずに中継するように、ロードバランサーを設定することもできます。」
の2つのやり方があるようだ。後者については文字通り、ロードバランサーでは複合化せずにそのままクライアントとWebサーバーを中継する方法。この場合は、ロードバランサーはリクエストを見れないためルーティングの最適化などの機能が使えなくなる。
前者のやり方がよくわからない。一旦ロードバランサーで復号化したあと再度暗号化するということなのか。
以下、①の方法だけ手順をさらっと書く。
①のHTTPS化の設定
今回私は単なる情報表示のWebサイトを運用するので、①のみ暗号化する方法をとった。手順は大まかに
- あらかじめドメインを取得し、そのドメインでEB環境にアクセスできる状態にしておく
- そのドメインのACM証明書を取得する
- 冒頭のAWSドキュメントに従って、EBコンソールでロードバランサーに443リスナーを追加し、取得したACM証明書を使用するように設定する。
これでHTTPS通信ができるようになる。しかしこの状態だとhttpでもhttpsでもアクセスできてしまう。だから常時https化するためには、httpへのアクセスが来たときにhttpsへリダイレクトする必要がある。
httpからhttpsへリダイレクトする設定
これはロードバランサーの種類によって設定方法が違う。2通り。
HTTP から HTTPS へのリダイレクトの設定によると、
- インスタンスウェブサーバーを設定する
- どの環境でも可能
- ロードバランサーを設定する
- Application load balancerを使っている場合のみ可能
- Application load balancerを使うためにはClassic load balancerから移行しなければならない
- しかし、Application Load Balancer を設定するによると、環境作成後にロードバランサーを変更することはできないと書いてある
設定方法としては、Application load balancerを使っている場合の設定が簡易でやりやすいから、今Classic load balancerを使っている環境を一旦終了し、新たにApplication load balancerを使うように設定した環境を立ち上げた。
それから、改めてHTTPSリダイレクション設定をする。
- Route53で、マイドメインから新しいEB環境へのエイリアスを再度Aレコードで登録する
- EC2コンソールのLoad balancersから、使用中のApplication load balancerを選択する
- Application Load Balancer を使い HTTP リクエストを HTTPS にリダイレクトするにはどうすればよいですか?の通りに設定する
- HTTPからHTTPSへリダイレクトするリスナーを追加
- HTTPSリスナーを追加
- ロードバランサーのセキュリティグループが443トラフィックを許可していることを確認
これでできた。
疑問
ロードバランサーの設定がよくわからない。EB環境を作った場合、ロードバランサーの設定はEBコンソールとEC2コンソールでそれぞれ見れる。ポートリスナーの設定も両方から見れる。今回はEC2コンソールからHTTPSリスナー追加とHTTPSリダイレクション設定をした。しかしEBコンソールのロードバランサー設定画面を見ると相変わらずリスナーはHTTPリスナーが一つだけ。これはそれぞれ異なる設定なのか。EBコンソールから同じ設定をすることはできるのか。不明。少なくともHTTPSリスナーを追加するのはEBコンソールからでもできるが、どう違うのかわからない。またEBコンソールの設定ではリダイレクト設定はできないよう見える。