2
1

【AWS】CloudFront FunctionsでIPアドレス範囲指定のアクセス制限

Last updated at Posted at 2024-04-25

はじめに

S3に配置したhtmlファイルにCloudFront経由でアクセスします。
よりセキュアにするため、アクセス制限をかけます。
特に、CloudFrontへのIPアドレス制限について、CloudFront Functionsを利用してIPアドレス範囲指定でアクセス制限をする記事が見つからなかったので投稿します。

やること

構成としては以下となります。

image.png

それぞれの説明です。

  • S3のアクセスは「パブリックアクセスをブロック」

image.png

  • S3のバケットポリシーには「CloudFront経由のみアクセス許可」

image.png

  • CloudFrontで「IPアドレス制限」(構成の図の赤線の箇所です。)

ここで、CloudFront Functionsを利用します。
利用方法は以下が参考になります!

しかしながら、IPアドレスのリストを指定するのは良いですが、
「X.X.X.X/16」などCIDRブロックで指定したい場合はどうしましょう?

全てのIPアドレスを記述するのは現実的ではないでよすね。
そこで、正規表現を利用します。

cloudfront-js-2.0
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のテストタブでテスト実行します。

image.png

「IPアドレス」に「1.2.3.4」を入力し、
「関数をテスト」ボタンをクリックすると・・・ :o: ステータス「成功」
image.png

「IPアドレス」に「1.3.3.4」を入力し、
「関数をテスト」ボタンをクリックすると・・・ :x: ステータス「403 Forbiden」
image.png

意図した通りに動作してますね:thumbsup:

さいごに

  • CloudFront Functionsがあったなんて!(便利だな。)
  • CloudFront Functionsは書き方に制限があるようですが、JavaScriptとして他にも表現できそうですね。
2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1