こんにちは。ゆーろんです。
最近このWEBサイトへのアクセスログを見ると、CloudFront経由ではなく直接HTTPリクエストを送って見られることが多いです。
ログを見るとKali付属のツールを使ってスキャニングを行いセキュリティホールを探すようなリクエストばかりでした。
特に海外からのスキャニングが多い…。
セキュリティ強度を上げるため、HTTP/HTTPSリクエストはCloudFrontのみから受け付けるようにすることにしました。
というわけでその方法をメモしていきます。
CloudFrontのみのアクセスにする仕組み
仕組みとしては以下の通りです。
- CloudFrontからオリジンへリクエストを送る際に秘密の独自HTTPヘッダを付与
- オリジン側では独自HTTPヘッダが付いていればCloudFrontからのリクエストと判断し、もし付いていなければ403を返してアクセス拒否する
結構、仕組みはシンプルです。
CloudFrontの機能で「カスタムヘッダーの追加」という設定項目で自由にヘッダーを付けることができるので使用します。
環境
環境は以下の通りです。
- CDN: CloudFront
- Webサーバ: Apache
Apache以外も大体似た感じに設定できると思うので適宜読み替えてください。
実装手順
CloudFrontの設定
CroudFrontのすでに展開しているディストリビューションを編集し以下画像のように任意のヘッダと任意の文字列を追加します。
なお文字列は推測されにくい文字列を設定することをお勧めします。
これで設定を反映したらステータスがDeployedになるまで待ちます。
Webサーバの設定
Lightsailの場合は/etc/apache2/apache2.conf
がApacheの設定ファイルになります。
設定ファイルに以下のように追加(<と>はとってください)。
<Directory /opt/bitnami/wordpress>
Require all granted
AllowOverride All
SetEnvIf <任意のヘッダ名> \"^<任意の文字列>\" CDNValid
Order deny,allow
Deny from all
Allow from env=CDNValid
</Directory>
動作確認
curl
コマンドでオリジンへ直接アクセスし以下のようにレスポンスがあれば成功。
curl <オリジンのIPアドレス>/wordpress
<!DOCTYPE HTML>
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don\'t have permission to access this resource.</p>
</body></html>
これでHTTPリクエストでオリジンへ直接アクセスすることを禁止にできました。