【AWS】プライベートALBを使ったSSL構成を試す

今回はパブリックサブネットにNLBを配置し、リダイレクト先にALB(内部向け)を指定することで、
ALBおよびEC2を直接インターネットに公開することなく、SSL通信を実現します。

#前提条件:
・ACM(AWS Certificate Manager)でパブリック証明書を作成済みであること
・Route 53で独自ドメインを購入済みであること

・検証用VPCの作成
VPC>VPCを作成 をクリックします。
VPCなど を選択します。

名前タグの自動生成 にVPC名を入力します。
IPv4 CIDRブロック、アベイラビリティゾーンの数など、以降の設定はデフォルトのまま、VPCを作成 をクリックします。
特に、VPCエンドポイント>S3ゲートウェイ は”なし”を選択しないように注意してください。
後の手順でサーバ設定をする際に必要となります。

セキュリティグループの穴あけを行います。
セキュリティ>セキュリティグループ>”対象のセキュリティグループ” をクリックします。
インバウンドのルールを編集をクリックします。


ルールを追加 をクリックし、以下の内容を入力します。
1つ目:
・タイプ:HTTPS
・ソース:0.0.0.0

2つ目:
・タイプ:HTTP
・ソース:0.0.0.0.
※ターゲットグループからのヘルスチェック用にHTTPも許可します。

ルールを保存をクリックします。

・検証用EC2インスタンスの作成
ALB経由でのアクセスを確認するため、EC2を2台作成します。

本記事では1台目の手順を記載しますが、2台目も基本的に同じ手順で問題ありません。

EC2>インスタンス>インスタンスを起動 をクリックします。

名前とタグ に任意のインスタンス名を入力します。

アプリケーションおよびOSイメージ はデフォルトのまま、Amazon Linux とします。

インスタンスタイプ もデフォルトのままとします。

キーペア はキーペアなしで続行 をクリックします。

ネットワーク設定>編集 をクリックし、以下の内容を入力します。

・VPC:"先ほど作成したVPC"
・サブネット:"先ほど作成したサブネット" ※前回と違いインターネットゲートウェイの関連付けがない、プライベートサブネットを選択します。
・パブリックIPの自動割り当て:無効化
・ファイアウォール:既存のセキュリティグループを選択する>セキュリティグループを編集>"先ほど作成したセキュリティグループ"

高度な詳細>ユーザーデータ に以下のシェルスクリプトを入力します。

※echo “Hello Web01!”をパイプでHTMLファイルに渡しているため、Webページにアクセスした際はこのメッセージが表示されます。2台目は、echo “Hello Web02!”のようにして、ALBによるアクセス先の振り分けを確認できるようにします。

#!/bin/bash
yum update -y
yum install -y httpd
systemctl start httpd
systemctl enable httpd
touch /var/www/html/index.html
echo "Hello Web01!" | tee -a /var/www/html/index.html

インスタンスを起動 をクリックします。

2台目も同様の手順で作成してください。

ターゲットグループ(EC2用)の作成

ALBの作成に移る前にリダイレクト先であるEC2用ターゲットグループを作成します。

ロードバランシング>ターゲットグループ>ターゲットグループの作成 をクリックします。

基本的な設定 を以下の内容で設定します。

・ターゲットタイプの選択:インスタンス

・ターゲットグループ名:任意

・プロトコル:ポート:HTTP 80 ※SSL終端がALBのため、ALBからEC2間はHTTP接続となります。

・IPアドレスタイプ:デフォルトのまま

・VPC:”先ほど作成したVPC”

・プロトコルバージョン:デフォルト(HTTP1)のまま

・ヘルスチェックプロトコル:デフォルトのまま ※SSL終端がALBのため、ALBからEC2間のヘルスチェックプロトコル はHTTPのままです。

以降の設定はデフォルトのままとし、次へ をクリックします。

使用可能なインスタンス>”先ほど作成したEC2″ にチェックを入れ、保留中として以下を含める をクリックします。

ターゲットグループの作成 をクリックします。

Application Load Balancerの作成

次に、ALBを作成します。

EC2>ロードバランサー>ロードバランサーの作成 をクリックします。

Application Load Balancer>作成 をクリックします。


基本的な設定 に以下の内容を入力します。

・ロードバランサー名:任意
・スキーム:内部向け
・ロードバランサーのIPアドレスタイプ:IPv4 ※デフォルト

ネットワークマッピングに以下の内容を設定します。

・VPC>"先ほど作成したVPC"
・マッピング>表示されたAZにチェック>サブネット>"先ほど作成したサブネット" ※プライベートサブネットを選択します。

・セキュリティグループ:デフォルトのまま
・リスナーとルーティング:
・1つ目:
・プロトコル:HTTP
・ポート:80
・デフォルトアクション:転送先>ターゲットグループの選択>"先ほど作成したEC2のターゲットグループ"
・2つ目:
・プロトコル:HTTPS
・ポート:443
・デフォルトアクション:転送先>ターゲットグループの選択>"先ほど作成したEC2のターゲットグループ"

・セキュアリスナーの設定: ※2つ目のリスナーをHTTPSにした場合、追加で設定が必要です。
・セキュリティポリシー:デフォルトのまま
・デフォルト SSL/TLS サーバー証明書:証明書の取得先>ACMから>証明書の選択>"事前に作成したパブリック証明書"

以降の設定はデフォルトのまま、作成 をクリックします。

ALBの作成後、ターゲットグループが関連付けられます。
ステータスが以下のようになると思います。
初期: Target registration is in progress

ターゲットグループ(ALB用)の作成

NLBの作成に移る前にリダイレクト先であるALB用ターゲットグループを作成します。

ロードバランシング>ターゲットグループ>ターゲットグループの作成 をクリックします。

基本的な設定 を以下の内容で設定します。

・ターゲットタイプの選択:Application Load Balancer
・ターゲットグループ名:任意の名前を入力
・プロトコル:ポート:HTTP 443 ※SSL終端がALBのため、NLBからALB間はHTTPS接続となります。
・IPアドレスタイプ:デフォルト

ネットワークマッピング を以下の内容で設定します。

・VPC:"先ほど作成したVPC"
・プロトコルバージョン:デフォルト(HTTP1)のまま
・ヘルスチェックプロトコル:HTTPS ※SSL終端がALBのため、NLBからALB間のヘルスチェックプロトコル はHTTPSとします。

以降の設定はデフォルトのままとし、次へ をクリックします。

ターゲットを登録>今すぐ登録>Application Load Balancerを選択>”先ほど作成したALB” を選択します。

ターゲットグループの作成 をクリックします。

Network Load Balancerの作成

次に、NLBを作成します。
EC2>ロードバランサー>ロードバランサーの作成 をクリックします。
Network Load Balancer>作成 をクリックします。


・基本的な設定 に以下の内容を入力します。
・ロードバランサー名:任意
・スキーム:インターネット向け
・ロードバランサーのIPアドレスタイプ:IPv4 ※デフォルト

ネットワークマッピング に以下の内容を設定します。
・VPC:"先ほど作成したVPC"
・マッピング:"先ほど作成したサブネット" ※パブリックサブネットを選択します。
・セキュリティグループ:デフォルトのまま
・リスナーとルーティング:
・1つ目:
・プロトコル:TCP
・ポート:80
・デフォルトアクション:転送先>ターゲットグループの選択>"先ほど作成したALBのターゲットグループ"
・2つ目:
・プロトコル:TCP ※TLSを選択するとヘルスチェックエラーとなります。
・ポート:443
・デフォルトアクション:転送先>ターゲットグループの選択>"先ほど作成したALBのターゲットグループ"

以降の設定はデフォルトのまま、作成 をクリックします。

NLBの作成後、ALB用ターゲットグループが関連付けられます。
EC2用ターゲットグループの時と同様、ステータスが以下のようになると思います。
初期: Target registration is in progress

Route 53へのレコード登録

締めくくりとして、Route 53にNLBのレコードを登録します。

Route 53>ホストゾーン>”Route 53で購入した独自ドメイン” にアクセスします。

レコード>”独自ドメイン” にをチェックを入れ、レコードを編集 をクリックします。

以下の内容でレコードを編集します。

・レコード名:未入力 ※サブドメインを設定する予定がなければ、空白のままとします。
・レコードタイプ:A
・エイリアス
・トラフィックのルーティング先:Network Load Balancerへのエイリアス
・リージョン:先ほど作成したNLBのリージョン
・Network Load Balancerを選択:先ほど作成したNLB
・ルーティングポリシー:シンプルルーティング

保存 をクリックします。

SSL通信によるアクセス確認

実際にアクセスしていきましょう。
ブラウザからRoute 53に登録したドメインでアクセスし、Webページが表示されることを確認します。
例:https://"独自ドメイン".com

Webページがきちんと表示されました。

F5キーを繰り返すと、バックエンドの2台目のEC2にアクセスが分散されていることも確認できます。

HTTPアクセスも試してみます。

F12キー>デベロッパーツール>Network タブを開いた状態で、HTTPアクセスします。
例:http://"独自ドメイン".com

Name:”独自ドメイン”.com に対して、Status:300系 および200 が表示されています。

300系の方をクリックすると、HTTPSにリダイレクトされたことを確認できます。

以上、プライベートALB(内部向けALB)によるSSL通信環境を構築してみました。
インターネットからのパブリックアクセスはNLBで受け、ALBおよびバックエンドのEC2は隠ぺいできるため、
よりセキュアな環境を構築できました。

ただ、セキュリティグループは全リソースで共有しているため、(インターネットから直接アクセス不可とはいえ)若干の懸念は残ります。

そこで、次回はNLB・ALB・EC2ごとにセキュリティグループを作成し、
ALBおよびEC2はアクセス元をNLB、ALBに限定することで、セキュリティ強度を高めていきたいと思います。

ここまで見ていただき、ありがとうございました。