Application Load Balancers へのアクセスを制限する
Elastic Load Balancing の Application Load Balancer によって提供されるウェブアプリケーションやその他のコンテンツには、CloudFront はオブジェクトをキャッシュしてユーザー(閲覧者)に直接提供し、Application Load Balancer の負荷を軽減できます。CloudFront は、レイテンシーを削減し、分散型サービス拒否 (DDoS) 攻撃を吸収することにも役立ちます。ただし、ユーザーが CloudFront をバイパスして、Application Load Balancer に直接アクセスできる場合には、これらのメリットを得られません。ですが、 Amazon CloudFront と Application Load Balancer を設定して、ユーザーがApplication Load Balancer に直接アクセスできないようにすることができます。これにより、ユーザーは CloudFront 経由でしか Application Load Balancer にアクセスできず、CloudFront を使用するメリットを得ることができます。
ユーザーが Application Load Balancer に直接アクセスできないようにし、CloudFront 経由だけでアクセスを許可するためには、以下の高レベルのステップを実行します。
-
CloudFront を設定して、Application Load Balancer に送信するリクエストにカスタム HTTP ヘッダーを追加します。
-
カスタム HTTP ヘッダーを含むリクエストだけを転送するように、Application Load Balancer を設定します。
-
(オプション)このソリューションのセキュリティを向上させるためには、HTTPS が必要です。
詳細については、以下のトピックを参照してください。これらのステップを完了すると、ユーザーは CloudFront 経由でしかApplication Load Balancer にアクセスできなくなります。
トピック
リクエストにカスタム HTTP ヘッダーを追加するための CloudFront 設定
オリジン(この場合、Application Load Balancer)に送信するリクエストにカスタム HTTP ヘッダーを追加するように CloudFront を設定できます。
重要
このユースケースは、カスタムヘッダー名と値の機密性維持を信頼しています。ヘッダー名と値が機密でない場合、他の HTTP クライアントは、Application Load Balancer に直接送信するリクエストにヘッダー名や値を含める可能性があります。これにより、リクエストをしていない時に、リクエストが CloudFront から送信されたかのように Application Load Balancer を動作させる可能性があります。これを防ぐためには、カスタムヘッダー名と値を機密にしておきます。
CloudFront コンソール、AWS CloudFormation、または CloudFront API を使用して、オリジンリクエストにカスタム HTTP ヘッダーを追加するように CloudFront を設定できます。
- カスタム HTTP ヘッダーの追加 (CloudFront コンソール)
-
CloudFront コンソールで、オリジン設定のオリジンカスタムヘッダー設定を使用します。次の例に示すように、ヘッダー名とその値を入力します。
注記
この例のヘッダー名と値は、デモンストレーションのためだけに使用されます。製作では、ランダムに生成された値を使用します。ヘッダー名と値は、ユーザー名やパスワードなどの安全な資格情報として扱います。
既存の CloudFront ディストリビューションのオリジンを作成または編集するとき、新しいディストリビューションを作成するときには、オリジンカスタムヘッダー設定を編集できます 。詳細については、「ディストリビューションの更新」および「ディストリビューションの作成」を参照してください。
- カスタム HTTP ヘッダー (AWS CloudFormation) の追加
-
AWS CloudFormation テンプレートで、次の例に示すように、
OriginCustomHeaders
プロパティを使用します。注記
この例のヘッダー名と値は、デモンストレーションのためだけに使用されます。製作では、ランダムに生成された値を使用します。ヘッダー名と値は、ユーザー名やパスワードなどの安全な資格情報として扱います。
AWSTemplateFormatVersion: '2010-09-09' Resources: TestDistribution: Type: 'AWS::CloudFront::Distribution' Properties: DistributionConfig: Origins: - DomainName: app-load-balancer.example.com Id: Example-ALB CustomOriginConfig: OriginProtocolPolicy: https-only OriginSSLProtocols: - TLSv1.2 OriginCustomHeaders: - HeaderName: X-Custom-Header HeaderValue: random-value-1234567890 Enabled: 'true' DefaultCacheBehavior: TargetOriginId: Example-ALB ViewerProtocolPolicy: allow-all CachePolicyId: 658327ea-f89d-4fab-a63d-7e88639e58f6 PriceClass: PriceClass_All ViewerCertificate: CloudFrontDefaultCertificate: 'true'
詳細については、『AWS CloudFormation ユーザーガイド』のオリジンとオリジンカスタムヘッダープロパティを参照してください 。
- カスタム HTTP ヘッダーの追加 (CloudFront API)
-
CloudFront API で、
CustomHeaders
内部オブジェクトOrigin
を使用します 。詳細については、『 Amazon CloudFront API リファレンス 』の CreateDistributionとUpdateDistribution、SDK またはその他の API クライアントのドキュメントを参照してください。
オリジンカスタムヘッダーとして指定できないヘッダー名がいくつかあります。詳細については、「CloudFront でオリジンリクエストに追加できないカスタムヘッダー」 を参照してください。
特定のヘッダーを含むリクエストだけを転送するように Application Load Balancer を構成する
CloudFront を設定して、Application Load Balancer に送信するリクエストにカスタム HTTP ヘッダーを追加した後( 前のセクションを参照 )、このカスタムヘッダーを含むリクエストだけを転送するようにロードバランサーを設定できます。これを行うためには、新しいルールを追加し、ロードバランサーのリスナーでデフォルトルールを変更します。
前提条件
次の手順を使用するためには、最低 1 つのリスナーがある Application Load Balancer が必要です。まだ作成していない場合には、『Application Load Balancers のユーザーガイド』のApplication Load Balancer の作成を参照してください。
次の手順では、HTTPS リスナーを変更します。同じプロセスを使用して HTTP リスナーを変更できます。
Application Load Balancer リスナーのルールの更新
-
Amazon EC2 コンソールで [ロードバランサー] ページを開きます
。 -
CloudFront ディストリビューションのオリジンであるロードバランサーを選択してから、[ リスナー] タブを選択します。
-
変更しているリスナーに、[ルールの表示/編集] を選択します。
-
アイコンを選択してルールを追加します。
-
[Insert Rule] を選択します。
-
新しいルールでは、次の操作を実行します。
-
[条件の追加] を選択してから、[Http ヘッダー] を選択します。CloudFront でオリジンカスタムヘッダーとして追加した HTTP ヘッダー名と値を指定します。
-
[アクションの追加] を選択してから、[ 転送先] を選択します。リクエストを転送するターゲットグループを選択します。
-
[保存] を選択して新しいルールを作成します。
-
-
アイコンを選択してルールを編集します。
-
デフォルトルールの編集アイコンを選択します。
-
デフォルトルールでは、次の操作を行います。
-
デフォルトのアクションを削除します。
-
[ アクションの追加 ] を選択してから、[ 固定応答を返す] を選択します。
-
[応答コード] に、
403
を入力します。 -
[応答本文] に、
Access denied
を入力します 。 -
「更新」を選択して、デフォルトルールを更新します。
-
これらのステップを完了すると、次の図が示すように、ロードバランサーリスナーに 2 つのルールがあります。最初のルールは、HTTP ヘッダーを含むリクエスト(CloudFront からのリクエスト)を転送します。2 番目のルールは、他のすべてのリクエスト(CloudFront 以外からのリクエスト) に対して固定レスポンスを送信します。

CloudFront ディストリビューションと Application Load Balancer にリクエストを送信することで、ソリューションが機能することを確認できます。CloudFront へのリクエストは、ウェブアプリケーションまたはコンテンツを返し、Application Load Balancer に直接送信されたリクエストは、403
プレーンテキストメッセージが入ったレスポンスを返しますAccess denied
。
(オプション)このソリューションのセキュリティ向上
このソリューションのセキュリティ向上のために、Application Load Balancer にリクエストを送信するときに、常に HTTPS を使用するように CloudFront ディストリビューションを設定できます。このソリューションは、カスタムヘッダー名と値を機密に保つ場合に限り機能します。HTTPS を使用すると、盗聴者がヘッダー名と値を検出するのを防ぐことに役立ちます。また、ヘッダー名と値を定期的に交換することをお勧めします。
オリジンリクエストに HTTPS を使用する
オリジンリクエストに HTTPS を使用するように CloudFront を設定するためには、[オリジンプロトコルポリシー] 設定を [HTTPS だけ] に設定します。この設定は、CloudFront コンソール、AWS CloudFormation、および CloudFront API で使用できます。詳細については、「プロトコル (カスタムオリジンのみ)」を参照してください。
オリジンリクエストに HTTPS を使用するように CloudFront を設定する場合には、前のセクション で示すように、Application Load Balancer に HTTPS リスナーがあることを確認する必要があります。これには、Application Load Balancer にルーティングされるドメイン名と一致する SSL/TLS 証明書が必要です。詳細については、『Application Load Balancer のユーザーガイド』 の [HTTPS リスナー] を参照してください。
ウェブアプリケーションのエンドユーザー( 閲覧者、または クライアント とも呼ばれる)が HTTPS を使用できる場合には、エンドユーザーからの HTTPS 接続を優先(または必要とする)ように CloudFront を構成することもできます。これを行うためには、[ビューワープロトコルポリシー] 設定を使用します。エンドユーザを HTTP から HTTPS にリダイレクトする、またはHTTP を使用するリクエストを拒否するように設定できます。この設定は、CloudFront コンソール、AWS CloudFormation、および CloudFront API で使用できます。詳細については、「ビューワープロトコルポリシー」を参照してください。
ヘッダー名と値を交換する
HTTPS の使用に加え、ヘッダー名と値を定期的に交換することをお勧めします。これを行うためのハイレベルな手順は次のとおりです。
-
CloudFront を設定して、Application Load Balancer に送信するリクエストに追加のカスタム HTTP ヘッダーを追加します。
-
Application Load Balancer リスナールールを更新して、この追加のカスタム HTTP ヘッダーを含むリクエストを転送します。
-
CloudFront を設定して、Application Load Balancer バランサーに送信するリクエストへの元のカスタム HTTP ヘッダー追加を停止します。
-
Application Load Balancer リスナールールを更新して、元のカスタム HTTP ヘッダーを含むリクエストの転送を停止します。
これらの手順を実行する方法の詳細については、前述のセクションを参照してください。