🌵

詳説 AWS ネットワーキング2 CloudFront(ANS-C01試験対策)

2024/03/05に公開

📌サービス概要

Amazon CloudFrontは、AWSが提供するコンテンツデリバリネットワーク(CDN)です。リージョンデータセンターよりもユーザーに近いAWSエッジロケーションからコンテンツを配信することで大量アクセス・低遅延を実現します。他社が提供するCDNサービスとしては、Akamai、Fastly、Cloudflareも有名です。

Cloudflare コンテンツ配信ネットワーク(CDN)とは? より引用

以下3つの構成要素からCDNが成り立っています。

  • オリジンサーバー:コンテンツの元となるサーバー。EC2、ECS、S3がオリジンサーバーとなることが多い。
  • CDNサーバー:オリジンサーバーのコンテンツをキャッシュしてユーザーに配信するサーバー。キャッシュされていない場合は、オリジンサーバーから取得します。動作からキャッシュサーバーとも呼ばれる。
  • ユーザー:実際にコンテンツをリクエストするユーザー。DNSで名前解決する際に地理的に近いのCDNサーバーのIPが返却されることで、遅延が少ないCDNサーバーを選択できる。

上図では、アメリカにオリジンサーバーがあり、世界中にCDNサーバーが配置されています。このCDNサーバーがオリジンサーバーのコンテンツをキャッシュしてくれています。日本のユーザーがアメリカのオリジンサーバーまでリクエストを投げる必要はなくなり、地理的に一番近いCDNサーバーからリクエストが返却されるため、高速なコンテンツ配信が実現できます。

📌1.キャッシュ

[AWS Black Belt Online Seminar] Amazon CloudFront deep dive より引用

CloudFrontではサーバーのレスポンスをキャッシュし、ユーザーからのリクエスト時にサーバーに問い合わせず、キャッシュした内容を返答する機能(図の4.コンテンツをキャッシュする)と説明しました。このキャッシュ機能がCDNの根幹です。このキャッシュ設定がCloudFrontの「ビヘイビア」の設定です。
CloudFrontの設定は以下のような階層構造となります。

  • CloudFrontディストリビューション
    • ビヘイビア
      • ビューワープロトコルポリシー
    • カスタム SSL証明書
    • フィールドレベル暗号化

キャッシュについては設問のみとし、この後は頻出の「ビューワープロトコルポリシー」、「カスタムSSL証明書」と「フィールドレベル暗号化」を解説します。

📌問題1ー1

ある企業はAWSに静的な画像や動画コンテンツがメインのウェブアプリを展開しています。 このアプリは、ap-northeast-1リージョンの ALBの背後に配置されたEC2から配信されています。 DNSは、Amazon Route 53 を使用して登録しています。 エンドユーザーのほとんどは日本在住ですが、一部のトラフィックはアメリカやヨーロッパから発信されます。

企業のエンジニアは、エンドユーザーの待ち時間を最小限のコストで削減したいと思っています。また、ALBまでのトラフィックが転送中に暗号化されることが必要です。これらの要件を満たすソリューションはどれですか。

  1. ap-northeast-1でAWS Global AcceleratorをALBに紐づけて利用します。Global AcceleratorのHTTPSリスナーを作成します。 カスタムドメイン名を Global Accelerator に割り当てられているDNS名にルーティングするようにRoute 53のエイリアスレコードを設定します。
  2. HTTPSリスナーを使用するように ALB を設定します。 Amazon CloudFront ディストリビューションを作成します。 SSL 証明書を使用するようにCloudFrontを設定します。 ビューワープロトコルポリシーでHTTPSを強制するように設定します。 カスタムドメイン名をALB に割り当てられ DNS 名にルーティングするようにRoute 53のエイリアス レコードを構成します。
  3. HTTPSリスナーを使用するように ALB を設定します。 Amazon CloudFront ディストリビューションを作成します。 SSL 証明書を使用するようにCloudFrontを設定します。 ビューワープロトコルポリシーでHTTPをHTTPSにリダイレクトするように設定します。 カスタムドメイン名をCloudfront に割り当てられ DNS 名にルーティングするようにRoute 53のエイリアス レコードを構成します。
  4. us-west-1でAWS Global AcceleratorをALBに紐づけて利用します。Global AcceleratorのHTTPSリスナーを作成します。 ap-norhteast-1に加えて、us-west-1に2つ目のアプリを作成し、Global Acceleratorに登録します。 カスタムドメイン名を Global Accelerator に割り当てられているDNS名にルーティングするようにRoute 53のエイリアスレコードを設定します。

📌解答1ー1

解答

3

基本的には「静的なコンテンツの配信」と設問にある場合は、CloudFrontを利用します。CloudFrontと似た低レイテンシを提供するGlobal Acceleratorは、TCP/UDPプロトコルにのみ対応しており(HTTP特化ではない)、静的なHTTPコンテンツの配信にはCloudFrontを利用することが一般的です。
また、2 と 3 の選択肢の違いとしては、ビューワープロトコルポリシーの設定が「HTTPS強制」か「HTTPSへのリダイレクト」です。基本的には「HTTPSへのリダイレクト」を選択するべきです。詳しくは📌2.通信の暗号化にて解説します。よって、正解は 3 です。

📌2.通信の暗号化

📌ビューワープロトコルポリシー

CloudFrontでは、HTTPSをサポートしており通信の暗号化が可能です。
ビューワープロトコルポリシー(ユーザーが通信時に利用できるプロトコルを定めたポリシー)の選択肢として以下3つがあります。

ポリシー 動作
HTTP and HTTPS HTTPとHTTPSどちらも受け付ける
Redirect HTTP to HTTPS HTTPとHTTPSどちらも受け付けるが、HTTPSにリダイレクトする
HTTPS only HTTPSのみを受け付ける

通信の暗号化を強制する場合は、HTTPS only ではなく Redirect HTTP to HTTPS を選択することが多いかと思います。HTTPS only を選択するとHTTPリクエストがTimeoutとなり、ユーザービリティが損なわれるためです。

📌カスタム SSL証明書

AWS Hands-on for Beginners AWS エッジサービス入門ハンズオン より引用

HTTPS通信のために利用する、SSL/TLS証明書はACM(AWS Certificate Manager)に登録された証明書を利用できます。なお、CloudFrontで証明書を利用するためには、米国東部 (バージニア北部) リージョン (us-east-1)に登録する必要があります。

ACMでは、Amazonの認証機関(CA)により検証されたSSL/TLS証明書(ACM パブリック証明書という)を発行できます。また、GMOグローバルサイン等の第三者認証局から発行された証明書もインストールすることができます。

📌問題2ー1

ある企業が世界中の顧客に向けてECサイトを展開しています。このサイトのコンテンツはCloudFrontを利用してALBの背後に配置されたEC2から配信されています。顧客からEC2までのエンドツーエンド(E2E)でトラフィックを常に暗号化するセキュリティ要件を満たす必要があります。企業の担当者はどのような設定をする必要がありますか。(3つを選択)

  1. ALBに自己署名証明書をインポートし、HTTPリスナーを設定しHTTPSにリダイレクトする設定をします。
  2. CloudFrontにACMで発行した証明書をインポートし、HTTPからHTTPSへのリダイレクトを設定します。
  3. CloudFrontで対象のEC2を指定したE2E暗号化オプションを有効にします。
  4. ALBにACMで発行した証明書をインポートします。ALBでHTTPSリスナーのみを設定し、HTTPリスナーは削除します。
  5. EC2に認証局から発行された証明書をインポートします。ALBのターゲットグループでHTTPSを指定します。
  6. CloudFrontに自己署名証明書をインポートし、HTTPSリクエストのみを受け付けるように設定します。

📌解答2ー1

解答

2、4、5

複数選択のため選択肢ごとに正誤を判定します。

  1. ALBに自己署名証明書をインポートし、HTTPリスナーを設定しHTTPSにリダイレクトする設定をします。
    →不適切です。自己署名証明書(オレオレ証明書)をACMに登録することはできますが、世界中の顧客向けに展開しているECサイトで利用することは適切ではありません。証明書が検証できずブラウザで警告文が表示されます。
  2. CloudFrontにACMで発行した証明書をインポートし、HTTPからHTTPSへのリダイレクトを設定します。
    →適切です。HTTPからHTTPSにリダイレクトすることで、通信を常に暗号化できます。
  3. CloudFrontで対象のEC2を指定したE2E暗号化オプションを有効にします。
    →不適切です。E2E暗号化オプションはありません。
  4. ALBにACMで発行した証明書をインポートします。ALBでHTTPSリスナーのみを設定し、HTTPリスナーは削除します。
    →適切です。HTTPリスナーを削除し、HTTPSリスナーのみを設定することで、ALBではHTTPSのみを受け付けるようになります。HTTPでのリクエストは受け付けないため、通信を常に暗号化できます。
  5. EC2に認証局から発行された証明書をインポートします。ALBのターゲットグループでHTTPSを指定します。
    →適切です。ACM パブリック証明書をエクスポートできないため、E第三者認証局により発行された証明書をサーバーにインストールする必要があります。なお、NginxとApacheに限りACMの証明書を利用できます。(AWS Certificate Manager for Nitro Enclaves
    また、ターゲットグループでHTTPSを指定することでEC2への通信は常に暗号化されます。
  6. CloudFrontに自己署名証明書をインポートし、HTTPSリクエストのみを受け付けるように変更します。
    →不適切です。自己署名証明書(オレオレ証明書)をACMに登録することはできますが、世界中の顧客向けに展開しているECサイトで利用することは適切ではありません。証明書が検証できずブラウザで警告文が表示されます。

📌3.フィールドレベル暗号化

Cloudfront デベロッパーガイド より引用

CloudFrontでは、「フィールドレベル暗号化」と言われる機能があります。HTTPSを利用すれば通信が暗号化されるため、必要ないかと思われるかもしれません。しかしながら、「フィールドレベル暗号化」はクライアントから送られるデータ自体を暗号化する仕組みのため、ウェブサーバーがHTTPS通信を終端しても、データの中身は読み取れないことが利点となります。例えば、クレジットカード番号等を暗号化されたまま保持し、決済する際のみ復号することで、情報漏洩のリスクが低減できます。

手順としては以下の通り設定します。

  1. CloudFrontに公開鍵をインポートし、その公開鍵でデータを暗号化してもらいます。
  2. データを処理するサーバーで、秘密鍵を利用しCloudFrontにより暗号化されたデータを復号します。

なお、フィールドレベル暗号化を利用するには、 主に3つ注意が必要です。

  1. ビューワーからのHTTP POST および PUT リクエストを受け入れるようにする必要があります。(サーバーにデータを送ることが前提)
  2. ビューワープロトコルポリシーは、Redirect HTTP to HTTPS または HTTPS only に設定されている必要があります。(クライアントからの通信を暗号化することが前提)
  3. オリジンプロトコルポリシーは、match-biewer または https only に設定されている必要があります。(オリジンとの通信を暗号化することが前提)

オリジンプロトコルポリシーは、ビューワープロトコルポリシーと同じようにサーバーとの通信時に利用するプロトコルを指定するポリシーです。以下の3つが選択できます。

ポリシー 動作
HTTP only HTTPのみを利用する
HTTPS only HTTPSのみを利用する
Math viewer クライアントがリクエストしたプロトコル(HTTP/HTTPS)と同じプロトコルをサーバーとの通信に利用する

📌問題3ー1

ある企業が世界中の顧客に向けてECサイトを展開しています。このサイトのコンテンツはCloudFrontを利用して東京リージョンのALBとALB背後に配置されたEC2から配信されています。転送中のデータはHTTPSにより暗号化されているが、決済を処理するシステムのみがクレジットカード番号を読み取れるようにデータレベルで暗号化する必要があります。この要件を満たす手順はどれか。(2つ選択)

  1. データが暗号化されるため、ALBにはSSL証明書をインポートする必要はなく、CloudFrontだけにSSL証明書をインポートする。CloudFrontにインポートする証明書はACMの東京リージョン(ap-northeast-1)にアップロードする。
  2. ALBとCloudFrontだけにSSL証明書をインポートする。ALBインポートする証明書はACMの東京リージョンにアップロードする。CloudFrontにインポートする証明書はACMの米国東部リージョン(us-east-1)にアップロードする。
  3. 秘密鍵をCloudFrontにアップロードします。POSTリクエストを許可するようにビヘイビアを設定します。
  4. 公開鍵をCloudFrontにアップロードします。GETリクエストを許可するようにビヘイビアを設定します。
  5. 公開鍵をCloudFrontにアップロードします。POSTリクエストを許可するようにビヘイビアを設定します。

📌解答3-1

解答

2、5

複数選択のため似た選択肢ごとに正誤を判定します。

  1. データが暗号化されるため、ALBにはSSL証明書を登録する必要はなく、CloudFrontだけにSSL証明書をインポートする。CloudFrontに登録する証明書はACMの東京リージョン(ap-northeast-1)にアップロードする。
  2. ALBとCloudFrontにSSL証明書を登録する。ALBに登録する証明書はACMの東京リージョンにアップロードする。CloudFrontに登録する証明書はACMの米国東部リージョン(us-east-1)にアップロードする。

→2 が適切です。フィールドレベル暗号化では、通信が暗号化されている必要があるため、ALBにもSSL証明書を登録する必要があります。また、CloudFrontに登録する証明書は米国東部リージョン(us-east-1)にアップロードする必要があります。

  1. 秘密鍵をCloudFrontにアップロードします。フィールドレベル暗号化を利用するようCloudFrontを構成します。POSTリクエストを許可するようにビヘイビアを設定します。
  2. 公開鍵をCloudFrontにアップロードします。フィールドレベル暗号化を利用するようCloudFrontを構成します。GETリクエストを許可するようにビヘイビアを設定します。
  3. 公開鍵をCloudFrontにアップロードします。フィールドレベル暗号化を利用するようCloudFrontを構成します。POSTリクエストを許可するようにビヘイビアを設定します。

→ 5が適切です。CloudFrontに登録する鍵は公開鍵です。(RSA暗号の原理を理解していれば秘密鍵を公開することは危険だと分かるかと思います。)また、サーバーにデータを送信するPOSTリクエストが許可されている必要があります。GETリクエストは、サーバーからデータを取得するメソッドのため、フィールドレベル暗号化は利用できません。

📌次の記事

https://zenn.dev/retasu/articles/98b62402bae57c

Discussion