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 経由だけでアクセスを許可するためには、以下の高レベルのステップを実行します。
-
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 ユーザーガイド」の [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 リスナーのルールの更新
-
新しいルールを追加します。「ルールの追加」の手順を使用します (ただし、以下の変更を加えます)。
CloudFront ディストリビューションのオリジンであるロードバランサーにルールを追加します。
[条件を追加] で、[HTTP ヘッダー] を選択します。CloudFront でオリジンカスタムヘッダーとして追加した HTTP ヘッダー名と値を指定します。
[アクションを追加] で、[転送先] を選択します。リクエストを転送するターゲットグループを選択します。
-
ロードバランサーのリスナーのデフォルトルールを編集します。「ルールの編集」の手順を使用します (ただし、以下の変更を加えます)。
CloudFront ディストリビューションのオリジンであるロードバランサーのデフォルトルールを編集します。
デフォルトのアクションを削除し、[アクションを追加] で、[固定レスポンスを返す] を選択します。
[応答コード] に、
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 を設定する場合は、以下も適用されます。
-
オリジンリクエストポリシーを使用して
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 の使用に加え、ヘッダー名と値を定期的に交換することをお勧めします。これを行うためのハイレベルな手順は次のとおりです。
-
CloudFront を設定して、Application Load Balancer に送信するリクエストに追加のカスタム HTTP ヘッダーを追加します。
-
Application Load Balancer リスナールールを更新して、この追加のカスタム HTTP ヘッダーを含むリクエストを転送します。
-
CloudFront を設定して、Application Load Balancer バランサーに送信するリクエストへの元のカスタム HTTP ヘッダー追加を停止します。
-
Application Load Balancer リスナールールを更新して、元のカスタム HTTP ヘッダーを含むリクエストの転送を停止します。
これらの手順を実行する方法の詳細については、前述のセクションを参照してください。
(オプション) CloudFront の AWS マネージドプレフィックスリストを使用してオリジンへのアクセスを制限します。
Application Load Balancer へのアクセスをさらに制限するには、サービスが AWS マネージドプレフィックスリストを使用しているときに CloudFront からのトラフィックのみを受け入れるように、Application Load Balancer に関連付けたセキュリティグループを設定します。これにより、CloudFront から発信されていないトラフィックは、ネットワーク層 (レイヤー 3) またはトランスポート層 (レイヤー 4) で Application Load Balancer に到達しないようになります。
詳細については、ブログ記事「Amazon CloudFront の AWS マネージドプレフィックスリストを使用してオリジンへのアクセスを制限する