AWS プログラミング

【Terraform】CloudFront + S3のウェブサイトでオリジンの直アクセスを制限する。

投稿日:

CloudFront + S3で構築した静的なウェブサイト(オリジンにS3を指定してるやつ)での問題点として、

オリジンのバケットがパブリック公開されているので、バケットのURLを叩くとオリジンに直接アクセスできてしまうというのが巷で言われてたやつ。

 

その解決法として、以下のサイトでCloudFrontからカスタムヘッダーを設定し、

そのヘッダー値が付与されている場合のみアクセスを許可するようにバケットポリシーを書くという方法が紹介されています。

アクセスが Referer ヘッダーで制限されたオリジンとして、ウェブサイトのエンドポイントを使用するの部分)

 

https://aws.amazon.com/jp/premiumsupport/knowledge-center/cloudfront-serve-static-website/

 

上記手順をTerraformで設定していきます。

また、アクセスを制限するにあたって、色々と注意すべき点があったので併せて紹介します。

 

CloudFrontからカスタムヘッダーを転送する。

まずは、CloudFrontからカスタムヘッダーを転送する設定を追加します。

originブロック内に以下の「custom_header」ブロックを追加。

 

 

ここのnameはRefererにします。任意の値ではダメみたいです。

 

AWS グローバル条件コンテキストキーに記載がありますが、aws:Refererでヘッダーにアクセスしにいくとのこと。

 

オリジンのS3のバケットポリシーを書く。

CloudFrontからのアクセスのみを通すためにバケットポリシーを以下の通り記載します。

 

policy.tf

 

許可と拒否を両方書くことに注意してください。

 

また、拒否に書いた条件2と3はAND条件になります。

なので、日本語にすると「カスタムヘッダーの値が異なる且つ自身のAWSアカウントではない場合に拒否」になります。

 

ちなみにstatementブロックで分けた条件はORになります。

 

https://dev.classmethod.jp/cloud/aws/s3-bucket-policy-multi-condition/

 

 

自身のAWSアカウント条件を追加しなくても問題ないですが、例えばWebサイトの更新者用のIAMアカウントがあったとして、そのユーザーもDenyされてしまうため、バケットを運用するユーザーを作っている場合、条件に加えても良いと思います。

 

まとめ

上記、CloudFrontとS3に付け足していただければ、オリジンの直アクセスを制限できるかと思います。

1点今回の制限方法がカスタムヘッダーに値があるかどうかの判定になるので、厳密にはヘッダーにその値を含めればアクセスはできてしまいます。

 

例えば、以下の通りにcurlするとアクセス可能です。

 

$ curl S3のオリジンURL -H "Referer:設定した値"

 

なので、できる限りカスタムヘッダーに含める値は乱数などわからないものにしましょう!

 

 

Terraformについてもっと学習したい方はUdemyのLearn DevOps: Infrastructure Automation With Terraform がめちゃくちゃおすすめなのでチェックしてみてください。

 

よく読まれている記事

1

  現在5年目のエンジニアで26歳です。 今回は20代の現役エンジニアとして、自分も含め転職について考えている方に向けて20代エンジニア転職に完全特化したおすすめのサービスを3つ紹介していき ...

2

これからエンジニアになりたい、プログラミングを使えるようになりたいという方に向けて 山のようにあるプログラミングスクールの中から、特におすすめなスクールをタイプ別に逆引きで3つ紹介します。 &nbsp ...

3

みなさんはを使っていますでしょうか。   本記事を見ていただいているということは、   プログラミングの勉強でを使うことに興味がある、 もしくはこれから動画を購入したいけどどれを買 ...

-AWS, プログラミング
-, ,

Copyright© クラインの備忘壺 , 2020 All Rights Reserved.