本記事は、Japan AWS Top Engineers であるエンタープライズクラウド事業部 構築第二セクションの新川 貴章さんに監修いただきました。

Amazon CloudFrontとは?

CloudFrontとは、静的及び動的なウェブコンテンツの配信を高速化してくれるサービスです。
例えば、WebサイトをホストしているEC2インスタンスが背後にあるALBを配信する場合、このALBをCloudFrontの「オリジン」として設定することで、全世界のユーザーが高速にウェブサイトへアクセスすることが可能となります。

VPCオリジンとは

AWS CloudFrontの機能の一部で、VPC内のプライベートサブネットでホストされているアプリケーションからのコンテンツ配信を可能とするものです。この機能により、ウェブアプリケーションを外部から完全に隔離した状態で配信することが可能となります。

以下は、ウェブサイトをホストするEC2が背後にあるALBをCloudFrontで配信する際の構成図です。

CloudFrontにおいて、ALBをオリジンとする場合、対象のALBをパブリックサブネットに配置する必要があります。この場合、インターネットからALBへアクセスできる経路が以下の2パターンとなります。

  1. CloudFrontのディストリビューションドメイン名からのアクセス
  2. ALBのDNS名へ直接のアクセス

エンドユーザーからの接続に、CloudFront経由のアクセス以外を禁止したい場合、通常はカスタムヘッダーを使用することで制限することが可能です。
CloudFrontにカスタムヘッダーを設定し、ALB側でヘッダー値を検証することで、それが正規のルートからの通信かどうかを判断することが可能となります。
しかし、この方法ではアクセスそのものを禁止にすることができないため、ALB自体はインターネットへ公開されている状態です。これでは不安は拭えません。

そこで活躍するのがVPCオリジンです。

VPCオリジンを使用することで、ALBを完全にプライベートな場所へ配置することが可能です。
これによる最大のメリットは、オリジンサーバーへのアクセス経路をCloudFront経由だけに限定することができる点です。

セキュリティ上のメリットとして以下の点が挙げられます。

攻撃対象領域の最小化


従来の方法では、CloudFront以外にALBやEC2インスタンス自体にセキュリティ対策を施す必要がありました。それぞれにセキュリティグループの設定などを行う必要があるため、管理が複雑化してしまいます。

VPCオリジンを使用すると、外部からのアクセス経路をCloudFrontに限定することができます。つまり、セキュリティ制御をCloudFrontの1点に集中することが可能となります。
さらに、AWS WAFの適用をCloudFrontに行うことで、クロスサイトスクリプティングやSQLインジェクション攻撃を対策することが可能です。

サイトに対する攻撃を全てオリジンサーバーに到達する前に無効化することが可能なため、オリジンサーバーへの影響を最小限に抑えることができます。

オリジンサーバーの秘匿性


オリジンサーバーが外部と完全に隔離されるため、パブリックIPアドレス自体を持ちません。これにより、オリジンサーバーへの偵察活動(ポートスキャンやOSのデータ取得など)を遮断することができます。

CloudFrontとALB間の通信はAWS内部のプライベートネットワークで行われるため、第三者が傍受する可能性は極めて低いと言えるでしょう。このように、オリジンサーバーへの脅威を高いレベルで排除することが可能です。

サービスの仕組み

VPCオリジンを作成すると、オリジンのALBを配置したサブネットそれぞれに自動的にENI(Elastic Network Interface)が作成されます。(上記の構成図を参照)
このENIによって、オリジンとなるALBとCloudFront間のプライベート通信が可能となります。前述の通り、ENIの作成や設定などは自動でAWSによって実行されます。

この機能により、開発者は設定や管理といった煩わしい作業が不要になるため、高いレベルのセキュリティを運用上のオーバーヘッド無しで実装することが可能となります。

実装の手順

具体的な実装のステップは以下の通りです。

  1. ウェブサイトをホストするEC2を背後に置くALBを作成
  2. CloudFrontでALBを指定したVPCオリジンを作成
  3. 作成したVPCオリジンをオリジンとするCloudFrontディストリビューションを作成

非常にシンプルですね。

VPCオリジンの作成は非常に簡単です。
上記の画面のように、CloudFrontのコンソールから作成することができます。VPCオリジンの名前とオリジンに設定するロードバランサーのARNを入力(もしくは選択)するだけでOK。

なお、作成完了まで5分以上待つ必要があります。


上記画像はVPCオリジン作成後に作成されたENI(Elastic Network Interface)の詳細です。

  • インスタンス所有者:AWS
  • インターフェイスのタイプ:cloudfront_managed
  • 説明:cloudfront configured ENI

このように、CloudFrontによって自動作成されたことがわかるようになっています。

VPCオリジンを作成後、それをオリジンとして設定するCloudFrontディストリビューションを作成することで、コンテンツを配信することが可能となります。
オリジンに設定する方法も非常に簡単で楽ですね。

ここまで設定できればあとはアクセスするだけです。

このように、ALBのDNS名からアクセスを試みるとアクセスができないことがわかります。
これは、ALBが完全に隔離されている状態にあり、ALBへアクセスすることができないからです。

CloudFrontのディストリビューションドメイン名からアクセスをしましょう。

アクセスすることができました。

このように、非常に簡単な方法でALBを外部ネットワークから完全に隔離してコンテンツを配信することができました。

難しい設定無しでALBへのアクセス経路をCloudFrontに限定することが可能なため、カスタムヘッダーを使用する方法と比較しても簡単で良いですね。

VPCオリジンの料金

VPCオリジンを使用するために必要な特別な料金はありません。
必要なのはCloudFront自体の料金と使用する他のサービス(VPCやEC2、ALBなど)にかかる料金のみでOKです。

最後に

簡単な設定だけで高いレベルのセキュリティをオリジンに実装することが可能なVPCオリジン。ぜひ使ってみてはいかがでしょうか。