こんにちは、株式会社FIXERの村上滉樹です。
Webサービスを提供するときにアクセス元を、日本限定に絞りたい時があります。例えば、ECサイトなどで商品の配送先を日本国内に限定したり、配信コンテンツの利用規約が日本国内に限定されていたりとサイトへのアクセス制御が必要なときがあります。
本ブログでは、Amazon CloudFront(以下、CloudFront)を利用して、特定の国からのアクセスをフィルタリングし、想定以外のトラフィック要求を拒否できるのか検証してみます。
■いきなり結論
CloudFrontのGeographic Restrictions機能を利用します。
- CloudFront ディストリビューションの地理的制限を導入する
地理的制御には、「許可リスト」と「ブロックリスト」の制御方法があります。
■前提条件
- CloudFront + Webアプリ(S3やFargateなど)の構成を用意します。
■設定方法
▼パターン1. 地理的制御(許可リスト)を導入してみる
CloudFront コンソールにアクセスし、対象の[ディストリビューション]を選択します。
[セキュリティ] のCloudFront geographic restrictionsから「許可リスト」を押下し、トラフィック要求を許可したい国を選択します。
▼パターン2. 地理的制御(ブロックリスト)を導入してみる
■検証結果
本ブログでは、海外からのアクセス元として Azure 仮想マシンを米国西部(カリフォルニア)で構築して検証しています。
▼パターン1(許可リスト)
・日本からのアクセス
自宅からアクセスできました(日本在籍)。許可リストに含まれている国なので、想定どおりの振る舞いをしましたね。
・海外からのアクセス
アクセス拒否されました。エラーメッセージにも「Amazon CloudFront ディストリビューションは、あなたの国からのアクセスをブロックするように設定されています。現時点では、このアプリまたは Web サイトのサーバーに接続できません。」と表記があるため、想定どおりの振る舞いをしましたね。
【原文】
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.
If you provide content to customers through CloudFront, you can find steps to troubleshoot and help prevent this error by reviewing the CloudFront documentation.
▼パターン2(ブロックリスト)
・日本からのアクセス
アクセスできました。(以下略)
・海外からのアクセス
アクセス拒否されました。(以下略)
■公式ドキュメントを確認してみた
CloudFront のドキュメント(2024年1月時点)には、アクセス元を100% 制御できるわけではなく、99.8%の精度と語っています。これは、CloudFrontに採用されている地理的制御のソフトウェアに依存しているように見えます。ソフトウェア内のDBには、各国ごとに割り当てられているグローバルIPアドレスをすべてマッピングできてないため、その漏れたIPアドレスからのアクセスは制御されないためです。
CloudFront determines the location of your users by using a third-party database. The accuracy of the mapping between IP addresses and countries varies by Region. Based on recent tests, the overall accuracy is 99.8%.
If CloudFront can’t determine a user’s location, CloudFront serves the content that the user has requested.
上記の詳細は、クラスメソッド様のDevelopersIOで紹介されていました。
・「コンテンツ配信の地域制限」回避方法をググる前に読む記事