Amazon API Gateway と AWS WAFで行うリファラーチェック

こんにちは。
Insurtech研究所の取り組みで、AWSサービスを利用した開発を経験させていただきました
今回はその中から、バックエンドAPIとして構えているAmazon API GatewayにAWS WAFでリファラーチェックを導入した方法を紹介したいと思います。

Amazon APIGatewayとは?

ざっくり説明すると
AWSが提供するフルマネージドサービスで、簡単にAPIの作成ができるサービスです。
AWS Lambda等の他AWSサービスと統合しサーバレスアークテクチャとしてよく利用されています。

AWS WAFとは?

IP アドレス、HTTP ヘッダーと本文、またはカスタム URI を含む条件に基づいてウェブトラフィックをフィルタリングするルールを作成でき、悪意のあるアクセスをブロックするといったもの。

またWAFには旧バージョンであるAWS WAF Classic、最新バージョンのAWS WAFの2種類が提供されていますが、今回はAWS WAFを使用します。

AWS WAFで行うリファラーチェックの仕組み

WAFのWebACLを使用することでリクエストのヘッダーからRefererを取り出し、
作成したルール(正規表現)で確認。
確認できたものは通す、できなければ弾くといったもの。

API GatewayのステージにWebACLをアタッチすることで
API Gatewayへのリクエストに対してそのまま適応することができます。

API Gatewayの作成

ここからAWSへログインした後の操作

  • APIの作成

API Gatewayのサービスページより、「APIの作成」を押下し作成するAPIのセットアップを行なっていきます。

次ページにて以下設定値を選択し、APIGatewayを作成します。

  • ステージのデプロイ

作成後はAPI Gatewayの編集画面に遷移するため、そのままナビゲーションペインより「リソース」を選択し、
「アクション」-> 「APIのデプロイ」の順で押下。

任意のステージ名を入力し、「デプロイ」を押下。
インターネットへ公開した状態にします。

これでインターネットへ公開した状態となりました。

  • 疎通確認

ステージエディタに記載されたURLにリクエストを投げレスポンスがあるか確認。

$ curl https://{識別子}.execute-api.ap-northeast-1.amazonaws.com/sample/pets
[
  {
    "id": 1,
    "type": "dog",
    "price": 249.99
  },
  {
    "id": 2,
    "type": "cat",
    "price": 124.99
  },
  {
    "id": 3,
    "type": "fish",
    "price": 0.99
  }
]

インターネットへ公開されたことが確認できました。

このAPI GatewayにWAFでリファラーチェック用のルールをアタッチし、
ルールにマッチしないリクエストはブロックされるように設定していきます。

Refererルール(Regex pattern set)の作成

  • Refererルール(Regex pattern set)の作成

AWS WAFのサービスページを開き、ナビゲーションペインより「Regex pattern sets」を押下、ページ遷移後「Create Regex pattern sets」を押下しリファラーチェックに使用する正規表現の作成を行います。

入力後、画面右下の「Create regex pattern set」を押下し作成。

Web ACLの作成

  • Web ACLの作成

ナビゲーションペインより「Web ACLs」を押下、ページ遷移後「Create web ACL」を押下しパラメータを入力していきます。

「Add AWS resources」を押下し、先ほど作成したAPI Gatewayを選択し、追加します。

「Add」を押下し、次の画面で使用するルールの設定を行います。

Rule typeは「Rule builder」を選択します。

先ほど作成したRefererルール(Regex pattern set)をWeb ACLsで使用するルールとして選択します。

ルールで使用している、正規表現と一致した際の挙動を設定します。
デフォルトでは拒否(Block)し、ルールと一致した際は許可(Allow)にしたいので、画像の通り設定を行いました。

「Add rule」を押下し、WebACLで使用するルールとして追加します。
「Next」を押下し、ルールの優先順位の設定を行います。

今回は一つしか設定していないのでそのまま「Next」を押下。
次画面にてメトリクスの設定を行います。
リクエストに対してどのルールが使用されたか等が見えるようです、必要に応じ設定してください。
設定後のレビュー画面右下にある「Create web ACL」を押下すると、WebACLが作成されます。

作成した時点で既にAPI Gatewayにアタッチした状態になっております。

  • 疎通確認

Refererヘッダなし

$ curl https://{識別子}.execute-api.ap-northeast-1.amazonaws.com/sample/pets
{"message":"Forbidden"}

Forbiddenで返ってきました、HeaderにRefereを埋め込んでないので想定通りの挙動ですね。

Refererヘッダあり

$ curl -H "referer: https://example.com/v1" https://{識別子}.execute-api.ap-northeast-1.amazonaws.com/sample/pets
[
  {
    "id": 1,
    "type": "dog",
    "price": 249.99
  },
  {
    "id": 2,
    "type": "cat",
    "price": 124.99
  },
  {
    "id": 3,
    "type": "fish",
    "price": 0.99
  }
]%  

WAF設定前のレスポンスと同じものが返却されました。想定通り。

ルールの修正

このままでも動くのですが、設定した正規表現で一箇所エスケープを入れ忘れていたので修正します。

修正前
^https:\/\/example.com\/v1$
↓
修正後
^https:\/\/example\.com\/v1$

・修正方法

作成したRegex patternを書き換えるとリアルタイムで反映されますのでそのまま編集しちゃいます。
注意点としては、一度追加した正規表現のルールを書き換えることはできない(UI上存在しない)ため、修正予定の正規表現を新規で追加してから、旧正規表現を削除する必要があること。

・修正パターンを追加

・修正前の正規表現を削除

終わりに

以上、AWS APIGatewayにWAFでリファラーチェックを導入した方法を紹介しました。
ご参考になれば幸いです

参考
https://docs.aws.amazon.com/apigateway/index.html
https://docs.aws.amazon.com/waf/index.html