オリジン(IIS)でCloudFront経由のアクセスを強制する方法

CF-ALB-EC2という構成で、ALBがAWS WAFに対応していないリージョンでも、ALBへの直接アクセスを禁止してみました。 WebサーバはIISを使用しています。
2018.05.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

おはようございます、加藤です。先日下記のブログでCloudFrontを利用している際にELBへ直接アクセスさせずにIPアドレス制限する方法をご紹介しました。

この方法は、ALBがWAFに対応していないリージョンでは使用することができません。そこで、ALBでは無くオリジン(EC2)でカスタムヘッダーを読み取ってCloudFront経由以外の接続を弾いて見ました。

AWS WAFを使って接続できるIPアドレスを制限してみた

概要

構成

このような構成を作ります。AWS WAFでのIPアドレス制限は冒頭に紹介した前回のブログで説明済みなので省略し、CloudFront経由以外のアクセスを弾くことに注力します。

前提

  • 上記の構成を構築済みである
  • WebServerにはWindows Server 2016を使用し、IISがインストール済みである

全体の構築については、省略します。前回のブログを参考に構築してください。また、WebServerにLinux(Nginx)を利用される方には下記のブログが参考になります。

CloudFrontのELBオリジンへ直接アクセスする通信を制限する方法

やってみた

URL Rewrite モジュールのインストール

Windows Server上で作業を行います。

URL Rewrite : The Official Microsoft IIS Site

上記のサイトへアクセスし、モジュールをダウンロードします。

「Install this extension」をクリックすると、ダウンロードが開始します。

インストールに特殊な作業は必要ありません、画像を参考にインストールを完了してください。

URL Rewriteの設定

healthcheck/* 以外のURLで、CloudFront経由の証明であるカスタムヘッダーがなければ 403 を返すように設定します。作業はWindows Server上で行います。

IISの管理画面からURL書き換えを開きます。

右側メニューの操作から「規則の追加...」をクリックし、「規則の追加」画面を開きます。「受信規則」の「空の規則」を選択状態にして、「OK」をクリックします。

「受信規則の編集」画面が開くのでパラメータを設定してきます。

ELBからのヘルスチェックにはカスタムヘッダーが付与されていません。その為、パス healthcheck/* についてはヘッダチェックから除外し、ELBのヘルスチェック用に使用します。

  • 名前
    • cloudfront
  • URLの一致
    • 要求されたURL 使用 パターン
      パターンに一致しない ワイルドカード healthcheck/*
  • 条件
    • 論理グループ化: すべて一致
    • 入力 種類 パターン
      {HTTP_CF_PRE_SHARED_KEY} パターンに一致しない secret
  • サーバー変数
    • デフォルトのまま
  • アクション
    • アクションの種類 状態コード 副状態コード 理由 エラーの説明
      カスタム応答 403 0 Forbidden: Access is denied Unauthorized access route.

右側メニューの操作から「適用」をクリックして設定を完了します。

ヘルスチェックページの作成

Copy-Item -Recurse C:\inetpub\wwwroot\ C:\inetpub\temp
Move-Item C:\inetpub\temp\wwwroot\ C:\inetpub\wwwroot\healthcheck

今回はデフォルトのウェルカムページをコピーして、ヘルスチェック用のページとします。PowerShellでディレクトリをコピーします。

ALBのヘルスチェック設定

ヘルスチェックの対象を healthcheck/ 配下に変更します。マネジメントコンソール上で作業します。

ターゲットグループの画面を開いて、設定を変更します。画像ではヘルスチェックの詳細設定がデフォルトから変更されていますが、今回の目的とは直接関係はありません。

CloudFrontのカスタムヘッダー設定

CloudFrontのOriginsでカスタムヘッダーを設定する。

Origin Custom Header

Header Name Value
cf-pre-shared-key secret

動作確認

 CloudFront経由でアクセス

正常にアクセスできているOK

ALBから直接アクセス

ヘルスチェックページ

正常にアクセスできているOK

その他のページ

アクセスできないOK

あとがき

ALBがAWS WAFに対応していないリージョンでのアクセス制限をやってみました。日本リージョンでは使う必要のあまりない情報ですが、誰かのお役に立てれば幸いです。

そして、このブログに協力してい頂いた大瀧さんに感謝を。

以上です❗