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

Application Load Balancer へのアクセスを制限する

インターネットに接続している Elastic Load Balancing の Application Load Balancer によって提供されるウェブアプリケーションやその他のコンテンツについて、CloudFront はオブジェクトをキャッシュしてユーザー(閲覧者)に直接提供し、Application Load Balancer の負荷を軽減できます。インターネットに接続しているロードバランサーは、パブリックに解決可能な DNS 名を持ち、クライアントからのリクエストをインターネット経由でターゲットにルーティングします。

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 ユーザーガイド」の [Origin] プロパティと [OriginCustomHeader] プロパティを参照してください。

カスタム 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 Balancer のユーザーガイドで「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 を設定する場合は、以下も適用されます。

  • オリジンリクエストポリシーを使用して Host ヘッダーをオリジンに転送するように CloudFront を設定する必要があります。AllViewer マネージドオリジンリクエストポリシーを使用できます。

  • 前のセクションで示したように、Application Load Balancer に HTTPS リスナーがあることを確認します。詳細については、Application Load Balancer のユーザーガイドで「HTTPS リスナーの作成」を参照してください。HTTPS リスナーを使用するには、Application Load Balancer にルーティングするドメイン名と一致する SSL/TLS 証明書が必要です。

  • CloudFront の SSL/TLS 証明書は、AWS Certificate Manager (ACM) の us-east-1 AWS リージョンでのみリクエスト (またはインポート) できます。CloudFront はグローバルサービスであるため、証明書は、us-east-1 リージョンから CloudFront ディストリビューションに関連するすべてのリージョンへと自動的に配布されます。

    • 例えば、ap-southeast-2 リージョンに Application Load Balancer (ALB) がある場合、ap-southeast-2 リージョン (CloudFront と ALB オリジンの間で HTTPS を使用する場合) と us-east-1 リージョン (ビューワーと CloudFront の間で HTTPS を使用する場合) の両方で SSL/TLS 証明書を設定する必要があります。どちらの証明書も、Application Load Balancer にルーティングするドメイン名と一致する必要があります。詳細については、「AWS Certificate Manager の場合は AWS リージョン」を参照してください。

  • ウェブアプリケーションのエンドユーザー( 閲覧者、または クライアント とも呼ばれる)が 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 ヘッダーを含むリクエストの転送を停止します。

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

(オプション) CloudFront の AWS マネージドプレフィックスリストを使用してオリジンへのアクセスを制限します。

Application Load Balancer へのアクセスをさらに制限するには、サービスが AWS マネージドプレフィックスリストを使用しているときに CloudFront からのトラフィックのみを受け入れるように、Application Load Balancer に関連付けたセキュリティグループを設定します。これにより、CloudFront から発信されていないトラフィックは、ネットワーク層 (レイヤー 3) またはトランスポート層 (レイヤー 4) で Application Load Balancer に到達しないようになります。

詳細については、ブログ記事「Amazon CloudFront の AWS マネージドプレフィックスリストを使用してオリジンへのアクセスを制限する」を参照してください。