CloudFront 適用済みの WordPress サイトに ALB を適用してみる


0.はじめに

先日、こちらの記事の対応を行ったんですが、

EC2 への直接アクセスでのアタックがあり、CloudFront と EC2 との間に ALB を入れ、EC2 への直接アクセスを制限してみます。

こんな感じ。

1.ALB 用の ACM を作成する

  1. 以前バージニアリージョンに ACM を作成したので、同様の手順で該当リージョンにも作成します。

2.ALB 用のセキュリティグループを作成する

  1. CloudFront からのリクエストを HTTPS (443) でのみ受け入れたいので、以下のセキュリティグループを作成します。
    • タイプ:HTTPS、プロトコル:TCP、ポート範囲:443、ソース:0.0.0.0/0, ::/0

3.ALB を作成する

  1. 以下のページの手順に従って、ALB を作成します。
  2. 以下のページの手順に従って、ALB のアクセスログの出力先を設定します。
{
    "Version": "2012-10-17",
    "Id": "PolicyXXXXXXXXXXXXX",
    "Statement": [
        {
            "Sid": "StmtXXXXXXXXXXXXX",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::582318560864:root"
            },
            "Action": "s3:PutObject",
            "Resource": [
                "arn:aws:s3:::[S3バケット名]/[プレフィックス]/AWSLogs/[アカウントID]/*"
            ]
        }
    ]
}

4.CloudFront のオリジンを EC2 から、ALB に変更する

  1. 以下のオリジンを作成します。
    • Origin Domain Name : [作成した ALB の DNS 名]
    • Origin Path : -
    • Origin ID : ※「Origin Domain Name」入力により自動入力
    • Origin SSL Protocols : ※デフォルト
    • Origin Protocol Policy : 「HTTPS Only」を選択
    • Origin Response Timeout : ※デフォルト
    • Origin Keep-alive Timeout : ※デフォルト
    • HTTP Port : ※デフォルト
    • HTTPS Port : ※デフォルト
    • Origin Custom HeadersHeader NameValue :
  2. 各種 Behavior において、「Origin or Origin Group」の設定を作成した ALB のオリジンに変更します。

5.EC2 のセキュリティグループを変更し、EC2 へのアクセスを ALB のみにする

  1. ALB からの HTTPS (443) のリクエストのみ受け入れたいので、インバウンドルールをセキュリティグループに設定します。

6.ALB に AWS WAF を設定し、ALB へのアクセスを CloudFront のみにする

  1. 以下のページの手順に従って、ALB に AWS WAF を設定します。

99.ハマりポイント

  • そこまでハマった訳ではないですが…。

  • ALB 作成時、ターゲットグループ作成において、「登録済みに追加」ボタンを押下するのを忘れて、ウンウン唸ってました…。わかりづらかったっす…。随分と無駄な時間を…。orz…。

  • あとは、5.の EC2 へのアクセスを ALB のみにするやり方がわからなくてかなり苦労しました…。
  • セキュリティグループで出来るなんて、目から鱗!!
  • 他にも色々応用できそう♪

XX.まとめ

これで、セキュリティ的にも、パフォーマンス的にも、最適な構成になったんじゃないかと思います。
まだ残ってることとしては、ALB - EC2 間を HTTP (80) にするとかはやっても良いかなと。
そうすれば、EC2 の SSL 証明書が不要になるので、証明書の更新作業も不要になってメンテナンス作業も楽になるかと。

ただ、
ここまでやってみて思ったんですが…、Shifter 使えば全部楽になったりするんじゃ?
と思ったりも…。

今後その辺試してみようかとも思います。

何かご参考になれば。

では♪

👋