ALBへのアクセスをCloudFront経由の通信に限定する

記事タイトルとURLをコピーする

はじめに

こんにちは、技術三課の三木宏昭です。
たった今、胃薬のつもりで正露丸を服用しました。

ALBへのアクセスをCloudFront経由の通信に限定する

CloudFrontで配信しているので、ALBへの直接アクセスを禁止したい時ってありますよね。
今回は、その方法をご紹介します。

尚、オリジンに対してCloudFront を経由しないアクセスを禁止する方法については、下記の記事で分かりやすく紹介しております。
よければ合わせてお読みください。

blog.serverworks.co.jp

★★★2022/2/8 にアップデートがありました
CloudFront のオリジンが EC2 や ALB のときはセキュリティグループのルールに 「Cloud Front のAWSマネージドプレフィクスリスト」のみを許可するルールを書くことができます
これにより CloudFront を経由した接続のみ許可可能になりました こちらもご参照ください

blog.serverworks.co.jp

構成

f:id:swx-miki:20201228192409p:plain

概要

  • CloudFrontでカスタムヘッダを付与して、それを元に以下のように制御
  • ケース1.ヘッダをALBでチェックし、カスタムヘッダが含まれていない通信はブロックする
  • ケース2.ヘッダをAWS WAFでチェックし、カスタムヘッダが含まれていない通信はブロックする

ケース1 ヘッダをALBでチェックし、カスタムヘッダが含まれていない通信はブロックする

設定方法

CloudFrontの設定

  1. CloudFrontのOrigin Settingsを開く f:id:swx-miki:20201228182351p:plain

  2. Origin Custom Headersを設定する
    (Header NameおよびValueは推測されない値なら何でもOK) f:id:swx-miki:20201228182926p:plain

ALBの設定

  1. 対象のALBを選び、「リスナー」タブの「ルールの表示/編集」を押下 f:id:swx-miki:20201228183134p:plain

  2. ルールの追加モードに移行し、デフォルトの上位にルールを追加する f:id:swx-miki:20201228183312p:plain

  3. IF の条件を HTTPヘッダー にして、CloudFrontで設定したカスタムヘッダを入力する f:id:swx-miki:20201228183427p:plain

  4. THEN のアクションを、デフォルトアクションと同一にして、保存する f:id:swx-miki:20201228183616p:plain

  5. ルールの編集モードにして、デフォルトアクションのTHENを削除する f:id:swx-miki:20201228183637p:plain

  6. THEN にアクションの追加で、固定レスポンス403を返すように設定する
    レスポンス本文に適する文言を入力して、保存する f:id:swx-miki:20201228183750p:plain

動作確認

何の設定もしていない状態だと、ALBに直接アクセスする事が可能でした f:id:swx-miki:20201228182103p:plain

設定後、ALBへの直接アクセスは出来なくなりました f:id:swx-miki:20201228183840p:plain

もちろん、CloudFrontからはアクセスが出来ます f:id:swx-miki:20201228183939p:plain

ケース2.ヘッダをAWS WAFでチェックし、カスタムヘッダが含まれていない通信はブロックする

設定方法

CloudFrontの設定

1.CloudFrontのOrigin Settingsを開く f:id:swx-miki:20201228182351p:plain

2. Origin Custom Headersを設定する
(Header NameおよびValueは推測されない値なら何でもOK) f:id:swx-miki:20201228182926p:plain

WAFの設定

3. WebACLの作成を開始し、通常の作成時と同じようにStep1を入力する
  (リージョンの選択を間違えないように注意)

4. Step2のRuleで、Add Rules > Add my own rules and rule groups を選択する f:id:swx-miki:20201228184229p:plain

5. 下の表に従い、パラメータを入力する

Name Parameter
Name <任意>
Type Regular rule
If a request maches the statement
Inspect Header
Header field name <CloudFrontで設定したHeader Name>
String to match <CloudFrontで設定したValue>
Action Allow

f:id:swx-miki:20201228184657p:plain

6. Default web ACL action for requests that don't match any rules を Block にする f:id:swx-miki:20201228184754p:plain

7. 以降の項目は通常と同様に入力する

動作確認

何の設定もしていない状態だと、ALBに直接アクセスする事が可能でした f:id:swx-miki:20201228182103p:plain

設定後、ALBへの直接アクセスは出来なくなりました
(圧を感じます。) f:id:swx-miki:20201228184957p:plain

もちろん、CloudFrontからはアクセスが出来ます f:id:swx-miki:20201228183939p:plain

また、CloudFrontのHeader値を変えると、アクセスが拒否されました f:id:swx-miki:20201228185214p:plain f:id:swx-miki:20201228190503p:plain

おわりに

いかがだったでしょうか。
皆様のお役に立てれば幸いです。

三木 宏昭 (執筆記事の一覧)

クラウドインテグレーション部 技術1課

紅茶と親子丼とAWSが好き

2021年の目標:毎日リングフィットアドベンチャーのコントローラーを持つ

2021 APN ALL AWS Certifications Engineers