NOTステートメントを使用したAWS WAFルールで特定のIPアドレス範囲以外からのリクエストをBlockする
みなさん、こんにちは。
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)でした。