BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【AWS】WAFにIPホワイトリストとなるルールを設定する方法

こんにちは!
BFT名古屋支店の佐野です。

今回はAWS WAFのお話です。
AWS WAFはEC2インスタンスやAPIGatewayなどの手前に配置することで、悪意ある攻撃や不審なアクセスを遮断できるサービスであり、特にAWSが用意しているルールを利用することで簡単に不正アクセス対策を行なえるものです。
しかし、時には正常なアクセスなのに内容がルールに引っかかってブロックされてしまったり、要注意対象として見なされてしまったりと、いわゆる誤検知が起こってしまうことがあります。
そういった誤検知を防ぐためには、正常なアクセスが行っている内容を監視対象外にするか、あるいは正常なアクセスを行なう送信元のIPの通信をルール評価の対象しない設定が必要となってきます。
此度は後者の方法、つまりWAFに対して通してもよいIPをまとめた、いわばホワイトリストを設定する方法をご紹介します。


はじめに:WAFにとってのホワイトリスト

WAFはアクセスが正常か不正かを判断する時には、必ずWeb ACLに設定されたルールを基準とします。
基本的にはそのルールに合致した不正な行為を検知した場合に、そのアクセスをブロックするという動きをするのです。
(設定次第ではそうでないようにすることも可能です)

そのため、WAFにホワイトリストを設定したい場合は、他のルールと同じように「指定したIPのアクセスがあった場合」という条件に合致した場合に、その通信を許可するルールをWeb ACLに設定します。
もちろんそういったものはマネージドルールにないため、ユーザーが自ら作らなければなりません。
なので、ここからはそのルールの作成方法と設定方法をお話ししてまいります。


その1:IPセットを作る

特定のIPを対象としたルールを作成する場合、その特定のIPが羅列されたリストが必要になります。
そのリストとなるのが、ここで作成するIPセットです。
IPセットは、AWS WAFコンソールの左ペインにある「IP sets」から作成することができます。

f:id:bftnagoya:20220202173229j:plain

この画像は、まだひとつもIPセットが作られていない時のIP sets画面の状態です。
IPセットを作った時、この画面に一覧として表示されます。

では、さっそくIPセットを作っていきましょう。
新規のIPセットの作成には、右上橙色の「Create IP set」を選択します。

f:id:bftnagoya:20220202173244j:plain

Create IP set画面となったら、まずは“IP set name”に任意のIPセット名を入れます。今回は分かりやすいようにIP_whitelistとしました。
“Region”ですが、こちらではIPセットを登録するリージョンを登録します。ここでは必ずホワイトリストを設定したいWeb ACLと同じリージョンを選択してください。
IPセットとWeb ACLのリージョンが異なっている場合、そのIPセットを使ったルールが作成できない為です。
今回はAsia Pacific (Tokyo) としています。
“IP version”では、指定するIPアドレスの形式を選択します。今回はIPv4とします。

そして“IP addresses”に許可する対象のIPを記載していきます。
IPはCIDR方式で記載でき、また下に向けて羅列していく形で、いくらでも登録することができます。

これらを全て設定し終えたら「Create IP set」を選択します。

f:id:bftnagoya:20220202173254j:plain

IP sets画面に戻り、上にsuccessと表示され、先ほど作ったIPセットが登録できました。
これでホワイトリストに相当するルールを作成する準備が整ったので、次はWeb ACLでルールを作成し、登録していきます。


その2:ホワイトリストとなるルールを作成・WAFに追加する

まずはAWS WAFコンソールの左ペインにある「Web ACLs」を選択し、さらにホワイトリストルールを設定したいWeb ACLを選びます。 その後「Rules」タブを選択し、「Add rules」配下の「Add my own rules and rule groups」を選択します。

f:id:bftnagoya:20220202173310j:plain

Rule type画面となりました。ここでルールを作成していきます。

f:id:bftnagoya:20220202173321j:plain

まずは「IP set」を選択し、IPセットを使用するルールの作成に切り替えます。 そしてRule配下の“Name”で、今回作成するルールの名前を記載します。今回はIP_whitelist_ruleとしました。
次にIP set配下の“IP set”リストボックスから、先ほど作成したIPセット(今回はIP_whitelist)を選択します。
“IP address to use as the originating address”は「Source IP address」とし、“Action”は「Allow」を選びます。
ここまで設定したら、「Add rule」を選択して次の画面に移りましょう。

(ちなみに、“Action”でBlockとした場合は、IPセットにあるIPのアクセスをブロックすることになり、Countの場合はIPセットにあるIPのアクセスがあった場合に検知だけするという動きになります)


その3:ルールの優先度を設定する

上部に“success”と表示され、Set rule priority画面となりました。
この時点で作成したルールの追加は完了されており、ここではルールのプライオリティ(優先度)を決めていきます。

f:id:bftnagoya:20220202173336j:plain

今回設定しているWeb ACLでは、作成したIP_whitelist_rule以外に3つのルールを入れています。
現在の状態では、以下の順にルールが適用され、アクセスが評価されることになります。

  1. AWS-AWSManagedRulesCommonRuleSet
  2. AWS-AWSManagedRulesAmazonIpReputationList
  3. AWS-AWSManagedRulesSQLiRuleSet
  4. IP_whitelist_rule

さて、プライオリティとはルールの評価順でもあり、このままだと先にマネージドルールが先に評価され、そこでブロックされてしまうとIP_whitelist_ruleによる評価がされなくなってしまいます。
それではホワイトリストにはならないため、IP_whitelist_ruleのプライオリティをあげておき、最初に評価されるようにします。
IP_whitelist_rule左側のラジオボタンを選択してから、「Move Up」を選択することで、プライオリティを1段階上げることができます。
IP_whitelist_ruleが一番上に行くまで「Move Up」を選択し、プライオリティを最上にしておきましょう。

f:id:bftnagoya:20220202173346j:plain

この状態であれば、他のルールより先にIP_whitelist_ruleによる評価が行なわれることになります。
また先のRule type画面で“Action”をAllowにしたので、IP_whitelist_ruleの条件に合致する、つまりIPセットにあるIPの通信だった場合には、その通信はIP_whitelist_ruleによる評価が終了した段階で他のルールによる評価を飛び越えてWAFを通過します。
これにより、指定IPの通信が他のルールに引っかかる要素を含んでいたとしても、通信先に通すことができるようになるのです。

IP_whitelist_ruleのプライオリティを最上にしたら、「Save」を選択して設定を保存しましょう。


設定完了

f:id:bftnagoya:20220202173355j:plain

Rulesタブを選択している状態の画面まで戻ってきました。
プライオリティの順番が画像のようになっていれば、この記事にて意図した設定になっています。
念のため、この状態でIPセットに登録したIPによる通信がなんでも許可されるかを確認しておきましょう。
(なお、確認手順は本記事では省略します。あしからず…)


さいごに

今回は「特定のIPの通信を、他のルールで評価せずに通す」ということを念頭にWAFのホワイトリストを作成しました。
これを応用することで、例えばIPセットを許可するIPと許可しないIPの両方を作り、片方をAllow、片方をblockというアクションで設定することで、「特定のIPによる通信しか通さない」という事も可能です。
ただしマネージドルールでないルールをWeb ACLに追加した場合、ひとつにつき1ドル/月の料金がかかるため、そういった場合はWAFではなくEC2のネットワークACLや、API Gatewayのリソースポリシーなど、通信先の制御で絞った方が良さそうです。

というわけで、今回はここまで。
また別の記事でお会いしましょう!