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

# はじめに

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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/767c11c1-df76-685b-a2e5-e0ecc97b07d8.png)



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

```html
<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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/be165cdf-4445-1048-e1e8-86fb19361cfe.png)



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

![1609747168513.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/e972a7dd-d663-8a05-46cc-be4c35db8c27.png)



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

![1609747190769.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/ed43bed0-2543-8a69-eae5-ca6a57f9d7d4.png)



# CloudFront Distribution 作成

CloudFront で、Create Distribution

![1609835626393.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/2f71ee88-ee6c-46ed-170c-01a6de9c64e6.png)



Get Started

![1609835660374.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/b4f13d68-7ec3-f437-520a-973b220234e6.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/34898633-cede-2695-54ea-16a7b692d902.png)



作成完了 (Enabled)

![1609838625823.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/04c8dbb2-e7b2-5ca7-250c-9350028555ce.png)



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

![1609840937033.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/980feb02-2156-7d3d-e632-33c128e274c2.png)



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

![1609840983855.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/5a45a0d7-1399-a585-c3b1-ff87350f0c30.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/8eb7f9fa-0120-2027-6048-5639177c8b5f.png)



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

Create IP set

![1609839289044.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/7911cb38-492b-b32a-97d9-e0611be6683a.png)



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

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313030323737342f63333461303563642d656364652d633835312.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/862fcae2-b713-1e14-fda9-113d5e443afb.png)



作成完了

![1609839383370.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/e4381186-b905-f6f9-5e86-046f4f7fdcbd.png)



Web ACL を作成します

![1609838818863.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/e92be372-675e-f392-044c-1116939b715a.png)



パラメータ指定して Next

![1609839077170.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/dc3b5b9d-5ada-e830-bd1f-eb592081e8ca.png)



Add my own rules and rule groups

![1609839589275.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/0d466dc2-4e58-ac69-7c9e-d1a7e9ff9d23.png)



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

![1609839701143.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/f5d65504-d418-29b3-9e94-b63f030a410f.png)



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

![1609839737162.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/843f359c-c389-8755-5c7a-3522d37bd49a.png)



Next

![1609839756423.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c243d8eb-4bb4-4f3e-1eeb-8ad050fd92ac.png)



Next

![1609839778584.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/738bc06b-68fd-b725-9405-3f842ff36279.png)



Create ACL

![1609839806181.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/92b8f7ba-9643-78eb-5e92-84e035ed3172.png)



# Distribution に WAF ACL をアタッチ

Distribution の詳細画面に移動

![1609840321489.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/5b77ece5-66d1-1756-d014-d5864cd79b3c.png)



Edit

![1609840379095.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/f0924373-ac6e-712d-90f7-2947de4a8f9d.png)



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

![1609840418681.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/2fb6d147-a5ec-b90b-201e-d712520bd245.png)



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

![1609840622603.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/ec676744-165f-d409-6ada-457ce7cd0ca7.png)



# 動作確認

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



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

![1609841140150.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/efc439a6-ba56-bed4-051f-2667df3f100e.png)



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

![1609841197236.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/10ef1ab7-fbaa-a781-afeb-9c46eeac9013.png)



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

![1609841151996.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/e5669f4e-5488-e105-949d-22a7cbcfe5fb.png)



# 参考URL

https://ceblog.mediba.jp/post/156084994102/cloudfront-s3-%E3%81%A7%E3%81%AE-ip-%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E5%88%B6%E9%99%90%E8%A8%AD%E5%AE%9A%E3%82%92%E3%81%99%E3%82%8B