LoginSignup
17
11

More than 1 year has passed since last update.

CloudFront + S3 の環境で、IPアドレスの制限を行う

Last updated at Posted at 2021-01-05

はじめに

S3 に配置されたファイルを CloudFront を使って配信しているときに、特定の IP アドレスに限定して配信したいときがあります。次の3つの要素を組み合わせることで、実現できます。

  • S3 で Public Access を Block
  • S3 で Bucket Policy を設定し、CloudFront の OAI(Origin Access Identity) を使い、特定の Distributions のみアクセス許可
  • CloudFront に WAF ACL を設定し、特定の IP アドレスのみアクセス許可

詳細な設定手順を備忘録として残しておきます。

S3 にファイルを配置

まず、S3 Bucket にテスト用のファイルを配置します。適当に作成した Bucket を開きます

1609745473239.png

こんな感じのテストファイルを格納します

<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <title>CloudFront用制限</title>
 </head>
 <body>
  <h1>CloudFront用制限</h1>
 </body>
</html>

このように test.html としてアップロードしています

1609747122241.png

ObjectURLをクリックしても、、、

1609747168513.png

Access Denied となり、アクセスできません。Public Access をブロックしているので、正しい動作です。

1609747190769.png

CloudFront Distribution 作成

CloudFront で、Create Distribution

1609835626393.png

Get Started

1609835660374.png

パラメータを入れて Create を押します

  • Origin Domain Name : S3 の名前を選択
  • Restrict Bucket Access : Yes にすると、OAI (Origin Access Identity) などの設定項目が現れます
  • Grant Read Permission on Bucket : S3 Bucket Policy を自動的に設定し、新たに作成する Distribution のみアクセス許可

1609850282453.png

作成完了 (Enabled)

1609838625823.png

OAI(Origin Access Identity) の ID は E10TWFFU3GRT9S で生成されている

1609840937033.png

S3 の Bucket Policy には自動的に設定されている

1609840983855.png

Bucket Policy を文字列でもメモ

{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E10TWFFU3GRT9S"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::cloudfronttest-sugi01/*"
        }
    ]
}

WAF ACL 作成

CloudFront に IP アドレスのアクセス制限を付与するために、WAF ACL を設定します

1609838660429.png

まず、アクセスを許可する IP アドレスを、IP set として定義します

Create IP set

1609839289044.png

自分が持っている環境の IP アドレスを指定

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313030323737342f63333461303563642d656364652d633835312.png

作成完了

1609839383370.png

Web ACL を作成します

1609838818863.png

パラメータ指定して Next

1609839077170.png

Add my own rules and rule groups

1609839589275.png

IP set を選択して、定義された IP アドレスのみアクセスを許可します。

1609839701143.png

Default Block にすることで、IP set の IP アドレスのみアクセス可能です

1609839737162.png

Next

1609839756423.png

Next

1609839778584.png

Create ACL

1609839806181.png

Distribution に WAF ACL をアタッチ

Distribution の詳細画面に移動

1609840321489.png

Edit

1609840379095.png

新たに作成した、WAF Web ACL を紐づけます

1609840418681.png

Progress となり、一定時間後に Deployed になります。

1609840622603.png

動作確認

CloudFront の Domain Name は d2jkfmdznxvpdo.cloudfront.net なので、次のようにアクセス可能です
https://d2jkfmdznxvpdo.cloudfront.net/test.html

許可した IP アドレスから、CloudFront 経由で S3 へアクセス
正常に表示されています

1609841140150.png

許可していない IP アドレスから、CloudFront 経由で S3 へアクセス
403 ERROR となっており、正常な動作です

1609841197236.png

S3 直接アクセスはもちろん禁止されているので、エラーになります
https://cloudfronttest-sugi01.s3-ap-northeast-1.amazonaws.com/test.html

1609841151996.png

参考URL

17
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
11