こんにちは。ごえです。
今回は、AWS WAFを設定しているWebサイトに対して、特定のUser-Agentからのアクセスを許可する方法を紹介します。
※ここでは、Google Apps Script(GAS)からのアクセスを許可する方法を紹介します。
不正アクセスが増加する近年、WAFで「海外IPからのアクセスは一括ブロックだ!」と設定してしまうケースがあります。
サイトのユーザーが日本人向けである場合は問題ないこともありますが、ケースによっては思わぬ不具合につながることがあります。
今回例として考えるのは、GASからWebサーバー上の特定ファイルへアクセスする必要がある環境です。「海外IPは全部ブロック!」と設定したら、必要なGASもブロックされたケースです。
・日本人しか見ないサイトですが、GASからのアクセスを受け付ける必要がある
・でも海外IPはブロックしたい
そんな場合に役立つAWS WAFの設定方法です。
Google Apps Scriptからアクセスする
方法としては実際のアクセスログからGASのUser-Agentを確認し、AWS WAFで許可するルールを作成しました。
まずは、Google Apps Scriptから対象URLへアクセスします。
今回確認したアクセスログでは、以下のようなUser-Agentでアクセスされていました。
Mozilla/5.0 (compatible; Google-Apps-Script; beanserver; +https://script.google.com; id: XXXXXXXX)
User-Agentに以下の文字列が含まれていることが分かります。
Google-Apps-Script
今回はこの文字列を利用して、AWS WAFでGASからのアクセスを判定します。
正規表現パターンセットを作成する
WAFのルール作成に先んじて、正規表現パターンセットというものを作成します。
WAFのルールでの一致条件に使用する文字列を、正規表現のリストとして用意しておくことができます。
複数のルールで使用する際は、ここで作成した正規表現パターンセットを使いまわすことができるので便利です。
WAF と Shield > 正規表現パターンセット> 「正規表現パターンセットを作成」をクリック
・正規表現パターンセット名:allow-ua-keywords(任意)
・リージョン:CloudFront(Global)
・正規表現:「google-apps-script」と”小文字”で入力(理由は後述)
以上です。
AWS WAFで許可ルールを作成する
次にAWS WAFのWeb ACLを開き、ルールを追加します。
今回は、「User-Agentに”Google-Apps-Script”が含まれていること」という条件に一致したアクセスを許可します。
アクション:Allow
ルール名:Allow-UA(任意)
リクエストが以下の場合:「ステートメントと一致する」を選択
検査:「単一ヘッダー」を選択
(ステートメント)
ヘッダーフィールド名:user-agent
一致タイプ:「正規表現パターンセットのパターンに一致」を選択
正規表現パターンセット:「allow-ua-keywords」を選択
テキスト変換:「小文字」を選択
これで、指定したURIにGASのUser-Agentでアクセスした場合のみ、AWS WAFで許可することができます。

テキスト変換を指定する場合の注意点
今回のルールでは、Text transformationに「小文字」を指定しています。
小文字を指定すると、AWS WAFは検査対象の文字列を小文字に変換してからルールを評価します。
例えば、実際のUser-Agentに以下の文字列が含まれている場合、
Google-Apps-Script
小文字による変換後は、以下の文字列として評価されます。
google-apps-script
そのため、AWS WAF側で比較する文字列についても、小文字で指定する必要があります。
実際のアクセスログに記録されているUser-Agentをそのままコピーして正規表現パターンセットへ登録すると、大文字が含まれている場合があります。
そのため、小文字を設定している場合は、正規表現パターンセット側の文字列も小文字になっているか確認する必要があります。
今回の設定でも、この点には注意が必要でした。
小文字に変換するメリットとしては、User-Agentの表記が
「Google-Apps-Script」でも「GOOGLE-APPS-SCRIPT」でも1つの条件で判定できる点です。
まずはCountで確認する
いきなりAllowに変更するのが不安な場合は、Actionを「Count」にして確認する方法があります。
Countの場合、条件に一致したリクエストをカウントしますが、その時点ではアクセスを許可・拒否せず、後続のルールの評価が継続されます。
一度Countでルールを作成し、GASを実行します。
想定したGASからのアクセスがルールに一致していることを確認できたら、ActionをAllowに変更します。
今回も、まずはCountで対象のアクセスを確認してから許可するのが安全です。
ルールの優先順位に注意する
AWS WAFではルールの優先順位にも注意が必要です。
ルールはPriorityの数値が小さいものから順番に評価されます。
また、AllowとBlockはそこで評価が終了するアクションです。Allowに一致した場合、それより後ろに設定されているWAFルールは評価されません。
そのため、今回作成したGASの許可ルールを、GASのアクセスをブロックしているルールより先に評価されるよう設定する必要があります。
例えば以下のような順番です。
1. GASからのアクセスを許可するルール 2. その他のWAFルール 3. ブロックするルール
ただし、GASの許可ルールに一致すると後続のWAFルールは評価されません。
まとめ
今回は、Google Apps ScriptからAWS WAF配下のWebサイトへアクセスするため、User-Agentを条件にした許可ルールを作成しました。しかし、これが万全である保証はありません。元も子もない話ですが、User-Agentを偽装されてしまうとアクセスを許してしまいます。
そのため何重にも網を張って警戒しておくことが必要です。
本記事はその1つの対処法として参考にしてください。
最後までお読みいただきありがとうございます。

