CloudFront+S3の場合、オリジンアクセスコントロールを行おうと思うとAWSコンソール上で作業が完結するのですが、ApacheサーバをEC2上に建ててCloudFrontを使っている場合、Apache側でアクセス制御を実施する必要があります。
このケースについてのまとまった情報があまり見つからなかったので備忘録として残しておきます。
仕様
以下のようなアクセス制御を実現します。
- CloudFrontからのオリジンアクセス時にカスタムヘッダーを設定
- Apacheではカスタムヘッダーを確認し、存在しない場合は403エラーを返す
- 403エラーの場合は.htaccessでCloudFrontのキャッシュページ(トップページ)を返す
設定方法
CloudFrontのディストリビューションにカスタムヘッダーを設定
ディストリビューション作成時に以下の設定項目があるのでここに適当な名前でカスタムヘッダーを設定します。
すでに作成済みの場合は、
対象ディストリビューションを選択→「オリジン」のタブをクリック→対象のオリジンを選択→「編集」で修正可能です。
今回はorigin-access-tokenという名前で値はランダムな文字列を設定しました。
Apacheの設定ファイルでカスタムヘッダーをチェック
Apacheサーバの設定ファイル(*.conf)に以下の記述を行います。
<Directory [アクセス制御をしたいディレクトリ]>
order deny,allow
deny from all
SetEnvIf origin-access-token "CloudFrontに設定した文字列" origin-access
allow from env=origin-access
</Directory>
設定後Apacheを再起動してください。
ここまでの作業でブラウザからはオリジンにアクセスできなくなっているはずです。
curlで確認
カスタムヘッダーなしでのチェック
$ curl -I [オリジンURL]
status 403が返ってくるはずです
カスタムヘッダーありでのチェック
# curl -H "origin-access-token:[設定文字列]" -I [オリジンURL]
status 200が返ってくるはずです
.htaccessで403エラー時に返すページを指定する
この設定はなくても構いませんが、ユーザに403の無機質なエラーページを見せたくない場合は.htaccessに設定してください。
ErrorDocument 403 [リダイレクト先ページ]
補足
カスタムヘッダーをChrome上で設定できるプラグインもあるので、管理者はこれを使えばブラウザからオリジンにアクセスできるようにもできます。
まとめ
うまくオリジンアクセス制御ができるようになりました。
セキュリティ的にあまり強固な方法とはいえない気がしますが、無尽蔵なオリジンアクセスをブロックするためにはやっておいた方がいい対策かなと思います。