CloudFront

S3をCloudFrontから配信&LambdaとWAFを組み合わせて利便性とセキュリティを確保してみる

この記事は、AWS Lambda Advent Calendar 2017 の5日目となります。 今回は S3 にある画像ファイルを CloudFront から配信をしつつ、 CloudFront のアクセスログを Lambda で解析を行って、WAF の IPリストへ追加を行って、セキュリティの担保を行ってみようと思います。   S3 を CloudFront から配信する理由 前提条件に、弊社の S3 バケットにはユーザー個人が撮影した画像がアップロードされます。 なのでセキュリティには気を置いてしっかり運用していく必要性があります。 AWS SDK を使用すれば S3 から署名付きURLが吐き出され、これにアクセスすれば画像を取得できます。が、この署名付きURLには有効期限が設定されており、アプリから使うにはちょっと面倒です。 S3 を CloudFront から配信をすると、WAF が使えるようになるので固定URLで配信しつつ、セキュリティも担保できます。   構成 ①ユーザーが CloudFront にアクセスを行う ②リクエストヘッダー等を WAF へ送る ③WAF にあるルールと照合し、結果を返す ④③がOKなら S3 から画像を持ってくる(NG なら 403 を返す) ⑤アクセスログを S3 へ保存する ⑥⑤のタイミングで、Lambda が発火する ⑦アクセスログに HTTPステータスコードが 200 以外のものがあったら、IPを WAF の IPリストに追加する Lambda 関連のアドベントカレンダーなのに、Lambda の部分を特筆するところがねぇ…   CloudFront ディストリビューションの作成 オリジンに、対象の S3 バケットを。 ログの設定も何となく分かると思います。 S3 は CloudFront からのみアクセスできるようにしておきます。 ブルートフォースアタック等で、キー(/user_id/hoge_id/file_name_.jpg みたいな)がバレないように、こうします。CloudFront + WAF を組み合わせればキーがバレる前にブラックリストに入れて、アクセスを拒否できます。   WAF web ACL の作成 AWS resource to associate には先程作成した CloudFront のディストリビューションを設定します。 ルールの作成部分では IP address で作成する。 文字列判定を使えば特定の文字列をヘッダーに載せるとアクセスできるなんて仕組みもできます。   こんな感じです。 最初に IPアドレス判定を行ってから、文字列判定のルールでヘッダー認証をします。順番が大事です。今回はなんちゃってヘッダー認証があるので、デフォルトアクションは全て 403 を返すようにしています。   Lambda スクリプトを作る 言語は好きなものを選んでください。 今回僕が書いて運用しているコードを貼っておきます。 IP_SET_ID には WAF -> IP addresses の自分で作成した空のルールにアクセスすると、URLにある /ipsets/<ここ> を指定します。…

no image

Amazon CloudFront CDN を使用して WordPress を使ってみる

CDN をどれ使おうかと色々試してみる中で勉強がてらAmazon CloudFrontのCDNとWordpressを組み合わせて使ってみることにした。   CDNの種類 [table "19" not found /]     CloudFront CDN Amazon AWSのCDN、従量課金制で別ドメイン型である。 リクエスト数だけで見ると料金は安いがページの容量が大きかったりすると一気に料金が跳ね上がる。 画像の容量を抑え、CSSなどはインライン化とかしてリクエスト数を減らせば料金も抑えられると思う。 HTTPSで運用しているサイトは、HTTPSで配信する必要性がある。     CloudFrontの設定 証明書のアップロード 初めてCloudFrontを使ったわけですが証明書のアップロードが面倒くさいです。 Web上からできないのでコマンドラインから証明書をアップデートする必要性があります。 参考 http://qiita.com/n0bisuke/items/a2a7d5efdc1311dc479a なおCDN用に証明書を用意できないので今回はデフォルトの証明書を使います。   CloudFrontの設定 イメージ図的にはこんな感じであってるのだと思う。draw.io 便利〜 HTTPSでサーバーを動かしてるときには 同じくHTTPSでCDNから転送しないと主要ブラウザではエラーを吐いてレイアウトが崩れて表示されてしまいます。   General Default CloudFront Certificate (*.cloudfront.net) にチェックをつけます。 独自ドメインでCDN配信するにはまた工程が増えるのでこのまま使うことをオススメします。   Origins Originの設定です。 今回はHTTPSでしか配信を行わないので Origin Protocol Policy は HTTPS Only にします。   Behaviors 特に記述することもなく。   ログイン画面、管理画面でキャッシュさせないように上記のような設定をします。 Path Patternに関して私の環境では /wordpress を付けてます。     Behavioursの設定は上記のようになると思います。   WordPressの設定 WordPressアドレス(URL) : https://<CloudFrontから割り当てられたアドレス>/wordpress サイトアドレス : https://luispc.com とします。   これで画像を開いてみるとCloudFrontアドレスになっていると思います。