CloudFrontの地理制限
AWS SAAの出題範囲の1つでもある、セキュアなアプリケーションとアーキテクチャの設計に関する内容です。
CloudFrontの機能の1つである地理制限を確認します。
特定の国のユーザーによるコンテンツへのアクセスを回避する必要がある場合は、CloudFront の地域制限を使用して、次のいずれかを行うことができます。
・承認された国のホワイトリストに含まれているいずれかの国にユーザーがいる場合のみ、コンテンツへのアクセスを許可する。
・禁止された国のブラックリストに含まれているいずれかの国にユーザーがいる場合、コンテンツへのアクセスを禁止する。
コンテンツの地理的ディストリビューションの制限
今回はホワイトリスト方式の地理制限を設定し、実際の挙動を確認します。
構築する環境
3つのVPCを作成します。
1つはCloudFrontで地理制限を行うWebサーバ用のVPCです。
VPCは東京リージョン(ap-northeast-1)に作成します。
CloudFrontのオリジンサーバは最新のAmazon Linux 2ベースのEC2インスタンスです。
Apacheをインストールし、Webサーバとして動作させ、自身のインスタンスIDを返すように設定します。
残りの2つは試験用のVPCです。
東京リージョンとヴァージニアリージョン(us-east-1)に全く同一の環境を構築します。
Webサーバにアクセス用のEC2インスタンスを作成し、Webサーバにアクセスして検証を行います。
CloudFormationテンプレートファイル
上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置してます。
https://github.com/awstut-an-r/awstut-saa/tree/main/03/001
テンプレートファイルのポイント解説
CloudFrontでホワイトリスト形式の地理制限を設定する
地理制限に関する設定を中心に確認します。
CloudFrontのオリジンサーバとして、EC2インスタンスを設定する方法や、キャッシュの設定方法に関しては、以下のページをご確認ください。
Resources:
CloudFront:
Type: AWS::CloudFront::Distribution
Properties:
DistributionConfig:
DefaultCacheBehavior:
AllowedMethods:
- GET
- HEAD
CachedMethods:
- GET
- HEAD
Compress: true
ForwardedValues:
Cookies:
Forward: none
QueryString: false
TargetOriginId: !Ref InstancePublicDnsName
ViewerProtocolPolicy: allow-all
DefaultTTL: !Ref CacheTTL
MaxTTL: !Ref CacheTTL
MinTTL: !Ref CacheTTL
Enabled: true
Origins:
- CustomOriginConfig:
OriginProtocolPolicy: http-only
HTTPPort: !Ref HTTPPort
DomainName: !Ref InstancePublicDnsName
Id: !Ref InstancePublicDnsName
PriceClass: PriceClass_All
Restrictions:
GeoRestriction:
Locations:
- !Ref GeoRestrictionLocation
RestrictionType: whitelist
Code language: YAML (yaml)
地理制限を設定するために重要なパラメータは、Restrictionsプロパティ内のGeoRestrictionプロパティです。
RestrictionTypeプロパティで、制限方法をホワイトリスト方式・ブラックリスト方式のどちらかから選択することができます。今回は前者で動作させますので、「whitelist」を指定します。
Locationsプロパティで対象の国名を指定します。今回はホワイトリスト方式で制限をかけますので、指定した国からのアクセスのみ許可することになります。今回は組み込み関数Fn::Refを使用して、「JP」を指定することによって、日本からのアクセスのみを許可します。
環境構築
CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。
CloudFormationスタックを作成し、スタック内のリソースを確認する
CloudFormationスタックを作成します。
今回は3つのVPCを作成しますが、VPCごとにスタックを作成します。
以下はS3バケット上に設置されたテンプレートファイルを参照してスタックを作成するコマンドです。
$ aws cloudformation create-stack \
--stack-name saa-03-001 \
--template-url https://[s3-bucket-url]/saa-03-001.yaml \
--capabilities CAPABILITY_IAM \
--region ap-northeast-1
$ aws cloudformation create-stack \
--stack-name saa-03-001-test \
--template-url https://[s3-bucket-url]/saa-03-001-test.yaml \
--capabilities CAPABILITY_IAM \
--region ap-northeast-1
$ aws cloudformation create-stack \
--stack-name saa-03-001-test \
--template-url https://[s3-bucket-url]/saa-03-001-test.yaml \
--capabilities CAPABILITY_IAM \
--region us-east-1
Code language: Bash (bash)
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。
各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。
- WebサーバのインスタンスID:i-0ad8cf475359b2566
- WebサーバのパブリックDNS:ec2-18-176-173-96.ap-northeast-1.compute.amazonaws.com
- テストクライアント(東京リージョン)のインスタンスID:i-05f2bf8cfdcfcf971
- テストクライアント(ヴァージニアリージョン)のインスタンスID:i-07fdf65d6a22d9422
AWS Management Consoleからも、作成されたCloudFrontの状況を確認します。
正常にCloudFrontディストリビューションが作成されています。
作成されたディストリビューションのドメイン名が「d1ck6twa84zr1c.cloudfront.net」ということがわかります。
EC2インスタンスがオリジンサーバとして設定されていることがわかります。
地理制限として、日本からのアクセスのみが許可されていることがわかります。
動作検証1:地理制限で許可された地域からアクセスする
準備が整いましたので、実際に挙動を確認します。
まず東京リージョン側の検証環境からアクセスを試みます。
同環境内のインスタンスにSSM Session Managerを使用してアクセスします。
同サービスを使用したインスタンスへのアクセスについては、以下のページをご確認ください。
% aws ssm start-session \
--target i-05f2bf8cfdcfcf971
--region ap-northeast-1
sh-4.2$
Code language: Bash (bash)
正常にアクセスできました。
続けてCloudFrontにアクセスして検証を行います。
sh-4.2$ curl https://d1ck6twa84zr1c.cloudfront.net
instance-id: i-0ad8cf475359b2566
Code language: Bash (bash)
正常にアクセスすることができました。
このようにホワイトリストで指定した国からのアクセスであれば、通常通りにアクセスすることができました。
動作検証2:地理制限で許可されていない地域からアクセスする
今度はヴァージニアリージョン側の検証環境からアクセスを試みます。
% aws ssm start-session -\
-target i-07fdf65d6a22d9422 \
--region us-east-1
sh-4.2$
Code language: Bash (bash)
正常にアクセスできました。
先ほどと同様にCloudFrontにアクセスして検証を行います。
sh-4.2$ curl https://d1ck6twa84zr1c.cloudfront.net
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<TITLE>ERROR: The request could not be satisfied</TITLE>
</HEAD><BODY>
<H1>403 ERROR</H1>
<H2>The request could not be satisfied.</H2>
<HR noshade size="1px">
The Amazon CloudFront distribution is configured to block access from your country.
We can't connect to the server for this app or website at this time. There might be too much traffic or a configuration error. Try again later, or contact the app or website owner.
<BR clear="all">
If you provide content to customers through CloudFront, you can find steps to troubleshoot and help prevent this error by reviewing the CloudFront documentation.
<BR clear="all">
<HR noshade size="1px">
<PRE>
Generated by cloudfront (CloudFront)
Request ID: qx0x5Uy6vGqeHrpIyE1pTBV73_twJfRSGOFuZZhKFaK5VzPDzV1LpQ==
</PRE>
<ADDRESS>
</ADDRESS>
</BODY></HTML>sh-4.2$
Code language: Bash (bash)
エラーページが表示され、アクセスに失敗しました。
エラーメッセージを確認すると、CloudFrontの地理制限機能によって、インスタンスがホスティングされている国(米国)からのアクセスが制限されている旨が記述されています。
このようにCloudFrontの地理制限機能を使用することによって、特定の国からのアクセスを制限することができました。
まとめ
CloudFrontを使用することによって、地理的な条件でコンテンツへのアクセスを制限できることがわかりました。
地理制限はホワイトリスト方式・ブラックリスト方式のいずれかで設定できることを確認しました。