Cloudfront-EC2の構成でオリジンへの直接アクセスを制限する
2019-08-08

tl; dr

  • Cloudfrontにカスタムヘッダーを設定
  • webサーバーではそのヘッダーで検証する

構成

  • httpd 2.4
  • Cloudfront

設定

  • httpd

<Directory> でも <Files> でも <Location> でもお好きなところで。


<Directory "/var/www/html">
    Require expr req('X-Pre-Shared-Key') =~ /^rNM59WBezZ-ユニークな文字列-Sm8HYxg4CD$/
</Directory>
  • Cloudfront

Terraformで書くとこんな感じ。


resource "aws_cloudfront_distribution" "default" {
  origin {
    custom_header {
      name  = "x-pre-shared-key"
      value = "rNM59WBezZ-ユニークな文字列-Sm8HYxg4CD"
    }
  }
}

まとめ

  • Cloudfront経由以外だと403がレスポンスされる
  • 秘密の文字列がバレると直接アクセスできちゃう
  • Nginxでも似たような設定はできるはず(未検証)

location / {
  if ($http_x_pre_shared_key != "rNM59WBezZ-ユニークな文字列-Sm8HYxg4CD") {
    return 403;
  }

  proxy_pass http://127.0.0.1:3000;
}