Amazon CloudFrontへのアクセスをAWS WAFでRefererによって制御してみた

Amazon CloudFrontへのアクセスをAWS WAFでRefererによって制御してみましたのでご紹介します。

概要

  • Amazon CloudFront(img.example.com)へ直接アクセスはできない。
  • 特定のドメイン (www.example.com) からのみアクセス可能。
  • AWS WAFでRefererによって制御する。

設定方法

マネジメントコンソールで設定していきます。

Web ACLを作成する

Create web ACL をクリックして web ACL を作成します。

Step 1: Name web ACL

画像

  • Web ACL name* : Web ACL の名前を入力
  • CloudWatch metric name* : 自動でCloudWatch metric名が入ります。
  • Region* : Global (CloudFront)
  • AWS resource to associate : ディストリビューションを選択

Next をクリック

Step 2: Create conditions

コンディションの作成をします。

String and regex match conditionsCreate condition をクリックします。

画像

  • Name* : Condition の名前を入力
  • Region* : Global (CloudFront)
  • Type* : String match

画像

  • Part of the request to filter on :
  • Header* :
  • Match type :
  • Transformation :
  • Value to match* : www.example.com/

Add filter をクリック create をクリック Next をクリック  

Step 3: Create rules

Create rule をクリックしてルールを作成します。

画像

  • Name* : ruleの名前を入力
  • CloudWatch metric name* : 自動でCloudWatch metric名が入ります。
  • Rule type* : Regular rule
  • Region* : Global (CloudFront)

  • Add conditions

    • match at least one of the filters in the string match condition を選択
    • 先ほど作成した condition を選択

create をクリック

画像

  • 作成したルールにマッチしたら許可
  • ルールにマッチしない場合は拒否

Step 4: Review and create

画像

設定を確認し Confirm and create  をクリック

設定が完了したのでアクセス制御ができているか確認します。

確認

curlで確認

  • www.example.com から img.example.com へアクセス
$ curl -H "Referer: http://www.example.com/" -I https://img.example.com/test.png
HTTP/2 200
content-type: image/png
content-length: 2602312
date: Sun, 13 May 2018 21:12:22 GMT
last-modified: Sun, 13 May 2018 18:56:58 GMT
etag: "80ff7e4b9e06df9c7d5348e484a4cc18"
accept-ranges: bytes
server: AmazonS3
x-cache: RefreshHit from cloudfront
via: 1.1 3a89ec81413ada8ae1c2005b5973a09f.cloudfront.net (CloudFront)
x-amz-cf-id: XxY0kwOvgHnbNfkgyhJNUgBD52WxQfFYGlFttnNtfLWOyRX69kk1rw==
  • 直接 img.example.com へアクセス
$ curl -I https://img.example.com/test.png
HTTP/2 403
server: CloudFront
date: Sun, 13 May 2018 21:16:14 GMT
content-type: text/html
content-length: 560
x-cache: Error from cloudfront
via: 1.1 e785d36fcfe1e6758d8c1a9a71445bbe.cloudfront.net (CloudFront)
x-amz-cf-id: vfWfWnExOATanVeyHuHTH48TtdAd8Nf0zE1heytn1m2JaucG10T2rg==
  • Refererが違う場合(example.com)から img.example.com へアクセス
$ curl -H "Referer: http://example.com/" -I https://img.example.com/test.png
HTTP/2 403
server: CloudFront
date: Sun, 13 May 2018 21:17:40 GMT
content-type: text/html
content-length: 560
x-cache: Error from cloudfront
via: 1.1 8616cfe905870ff4c06a2b1da3b52a99.cloudfront.net (CloudFront)
x-amz-cf-id: zo88rR56KCHn_4in5w74GD-FcNWu6QqA0x6Au8w_I125fpkjIB2SdA==

AWS WAFによりアクセスが制限できたことが確認できました。

まとめ

今回はAWS WAFの String and regex match conditionsReferer によってAmazon CloudFrontへのアクセスを制御しました。

参考URL