Application Load Balancers へのアクセスを制限する - Amazon CloudFront

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 経由だけでアクセスを許可するためには、以下の高レベルのステップを実行します。

  1. CloudFront を設定して、Application Load Balancer に送信するリクエストにカスタム HTTP ヘッダーを追加します。

  2. カスタム HTTP ヘッダーを含むリクエストだけを転送するように、Application Load Balancer を設定します。

  3. (オプション)このソリューションのセキュリティを向上させるためには、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 コンソールのオリジンカスタムヘッダーフィールド 。

既存の 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 リファレンス 』の CreateDistributionUpdateDistribution、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 リスナーのルールの更新
  1. Amazon EC2 コンソールで [ロードバランサー] ページを開きます

  2. CloudFront ディストリビューションのオリジンであるロードバランサーを選択してから、[ リスナー] タブを選択します。

  3. 変更しているリスナーに、[ルールの表示/編集] を選択します。

    
                        Amazon EC2 コンソールでロードバランサーの [ルールの表示/編集] リンク。
  4. アイコンを選択してルールを追加します。

    
                        Amazon EC2 コンソールでロードバランサーにルールを追加します。
  5. [Insert Rule] を選択します。

    
                        Amazon EC2 コンソールでロードバランサーにルールを挿入します。
  6. 新しいルールでは、次の操作を実行します。

    1. [条件の追加] を選択してから、[Http ヘッダー] を選択します。CloudFront でオリジンカスタムヘッダーとして追加した HTTP ヘッダー名と値を指定します。

    2. [アクションの追加] を選択してから、[ 転送先] を選択します。リクエストを転送するターゲットグループを選択します。

    3. [保存] を選択して新しいルールを作成します。

    
                        Amazon EC2 コンソールでロードバランサーの新しいルール。
  7. アイコンを選択してルールを編集します。

    
                        Amazon EC2 コンソールでロードバランサーのルールを編集します。
  8. デフォルトルールの編集アイコンを選択します。

    
                        Amazon EC2 コンソールでロードバランサーのデフォルトルールを編集します。
  9. デフォルトルールでは、次の操作を行います。

    1. デフォルトのアクションを削除します。

      
                                Amazon EC2 コンソールでロードバランサーのデフォルトルールを削除します。
    2. [ アクションの追加 ] を選択してから、[ 固定応答を返す] を選択します。

    3. [応答コード] に、403を入力します。

    4. [応答本文] に、Access deniedを入力します 。

    5. 更新」を選択して、デフォルトルールを更新します。

    
                        Amazon EC2 コンソールでロードバランサーのデフォルトルールを更新します。

これらのステップを完了すると、次の図が示すように、ロードバランサーリスナーに 2 つのルールがあります。最初のルールは、HTTP ヘッダーを含むリクエスト(CloudFront からのリクエスト)を転送します。2 番目のルールは、他のすべてのリクエスト(CloudFront 以外からのリクエスト) に対して固定レスポンスを送信します。


                Amazon EC2 コンソールのロードバランサーのルールが更新されました。

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 の使用に加え、ヘッダー名と値を定期的に交換することをお勧めします。これを行うためのハイレベルな手順は次のとおりです。

  1. CloudFront を設定して、Application Load Balancer に送信するリクエストに追加のカスタム HTTP ヘッダーを追加します。

  2. Application Load Balancer リスナールールを更新して、この追加のカスタム HTTP ヘッダーを含むリクエストを転送します。

  3. CloudFront を設定して、Application Load Balancer バランサーに送信するリクエストへの元のカスタム HTTP ヘッダー追加を停止します。

  4. Application Load Balancer リスナールールを更新して、元のカスタム HTTP ヘッダーを含むリクエストの転送を停止します。

これらの手順を実行する方法の詳細については、前述のセクションを参照してください。