はじめに
S3に配置したhtmlファイルにCloudFront経由でアクセスします。
よりセキュアにするため、アクセス制限をかけます。
特に、CloudFrontへのIPアドレス制限について、CloudFront Functionsを利用してIPアドレス範囲指定でアクセス制限をする記事が見つからなかったので投稿します。
やること
構成としては以下となります。
それぞれの説明です。
- S3のアクセスは「パブリックアクセスをブロック」
- S3のバケットポリシーには「CloudFront経由のみアクセス許可」
- CloudFrontで「IPアドレス制限」(構成の図の赤線の箇所です。)
ここで、CloudFront Functionsを利用します。
利用方法は以下が参考になります!
しかしながら、IPアドレスのリストを指定するのは良いですが、
「X.X.X.X/16」などCIDRブロックで指定したい場合はどうしましょう?
全てのIPアドレスを記述するのは現実的ではないでよすね。
そこで、正規表現を利用します。
function handler(event) {
var request = event.request;
var clientIP = event.viewer.ip;
// アクセス許可するIPアドレス範囲を設定
var pattern = new RegExp('1.2.\\d{1,3}.\\d{1,3}')
// クライアントIPが、アクセス許可するIPアドレス範囲にマッチすればtrueを返す
var isPermittedIp = clientIP.match(pattern);
if (isPermittedIp) {
// trueの場合はオリジン側へリクエストを渡す
return request;
} else {
var response = {
statusCode: 403,
statusDescription: 'Forbidden',
}
// falseの場合はViewer に対してレスポンスを返す
return response;
}
}
上記コードの
var pattern = new RegExp('1.2.\\d{1,3}.\\d{1,3}')
で正規表現を利用しています。
var isPermittedIp = clientIP.match(pattern)
で判定しています。
IPアドレス範囲指定のアクセス制限動作確認
テストしてみます。
CloudFront Functionsのテストタブでテスト実行します。
「IPアドレス」に「1.2.3.4」を入力し、
「関数をテスト」ボタンをクリックすると・・・ ステータス「成功」
「IPアドレス」に「1.3.3.4」を入力し、
「関数をテスト」ボタンをクリックすると・・・ ステータス「403 Forbiden」
意図した通りに動作してますね
さいごに
- CloudFront Functionsがあったなんて!(便利だな。)
- CloudFront Functionsは書き方に制限があるようですが、JavaScriptとして他にも表現できそうですね。