NOTステートメントを使用したAWS WAFルールで特定のIPアドレス範囲以外からのリクエストをBlockする

2022.07.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

みなさん、こんにちは。

AWS事業本部コンサルティング部の芦沢(@ashi_ssan)です。

AWS WAFv2を使っていて、正常なリクエストは許可するがWAFルールで検知したリクエストのみをBlockするいわゆるブラックリスト形式のWAFで、IPアドレス制限をかけてみたくなったことはありませんか?

私はあります。

AWS WAFルールを使ったIPアドレス制限の記事はDevelopersIOにもたくさんあるのですが、Default Action = Blockで設定しているホワイトリスト形式のWebACLでのソリューションを紹介しているものが多く、Default Action = ALLOWで設定しているブラックリスト形式のWebACLではマッチしないなと困ったことがあったため、自分で検証してみました。

それでは本題に入ります。

事前作業

こちらのブログを参考にAWS WAFの検証環境を作成します。

ルールを作成してみる

最初に、WAFへの接続を許可するIPアドレス範囲を指定するためのIP setsを作成します。

AWS WAFコンソールのIP setsから、Create IP setをクリックします。

各項目を記入し、Create IP setをクリックします。

RegionはALBを作成したリージョンを指定し、IP addressesには接続元のIPアドレスのCIDRを記入してください。

続いて、WAFルールを作成します。

準備したWeb ACLのプロパティ画面から、RulesタブのAdd my own rules and rule groupsをクリックします。

Rule Typeはカスタムルールを作成できるRule builderを指定してください。IP setを指定すると否定の条件を指定するNOT Statementが使用できませんでした。

Ruleでは、Nameで任意のルール名(今回はip-restrict-rule)を指定し、TypeはRegular ruleを選択します。

Statementでは、if a request doesn’t match the statement(NOT)を指定し、ルールが検知する条件をStatementに一致しなかった場合とします。

InspectはOriginal from an IP address in、IP setは(先ほど作成したIP set)を指定、IP address〜originating addressにはSouce IP addressを選択します。

ここまで一連のStatement欄の設定で、ルールに対しIP setに指定したアドレス範囲以外からアクセスがあった場合にこのルールのアクションが実行されるという条件が設定されます。

続いて、ActionにBlockを選択します。

これでルールがリクエストを検知した場合、リクエストを遮断(BLOCK)します。

全て指定できたらAdd ruleをクリックします。

Set rule priorityでルールの優先順を設定し、Saveをクリックします。

私の検証環境では既存のルールを設定していないので今回作成したルールのみとなっています。

今回作成したIPアドレス制限ルールは、優先順位が一番高い(画面で言うと他のルールより上になる)ように設定することをおすすめします。(※以下の注記を参照)

※注記:AWS WAFでは優先度の高いルールで許可やブロックが実行されると後続のルールはスキップされます。他のルールが先に評価され、IPアドレス制限ルールにたどり着く前にリクエストが許可されてしまった場合、IPアドレス制限が効かないことになってしまうため、注意しましょう。

設定は以上です。

接続テスト

まずは、IPsetsで設定したIPアドレスで接続してみます。

% curl xxxxxxxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com
<h1>Hello World</h1>

“Hello World”とEC2内に設定したhtmlファイルが読み取れたため、接続に成功しました。

AWS WAFマネジメントコンソールのSampled Requestsを確認すると、アクセス元のIPアドレスからのリクエストが許可(ALLOW)された旨が記録されていました。

続いて、範囲外のIPアドレスから接続してみます。

% curl xxxxxxxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
</body>
</html>

403 Forbiddenとなり、アクセスが遮断されたことがわかります。

Sampled Requestsを確認すると、範囲外のIPアドレスからのリクエストが遮断(BLOCK)された旨が記録されていました。Metrics nameもip-restrict-ruleと表示されており、IPアドレス制限のルールで検知していることがわかります。

検証は以上になります。

最後に

今回は、AWS WAFv2でNOT Statementルールを作成し、指定したIPアドレス範囲以外からのアクセスをブロックしてみました。

このブログがどこかの誰かの役に立てれば幸いです。

以上、AWS事業本部コンサルティング部の芦沢(@ashi_ssan)でした。