AWS WAFのルールを設定してみる

AWS WAFについての説明は下記ページで紹介しているので御覧ください。

AWS WAFとは

この記事は具体的にWAFのルールを設定してみよう、という内容です。

今回やること

AWS WAFはAWS CloudFrontまたはElastic Load Balancerで結びつけて利用できます。今回はElastic Load Balancerに結びつける例を紹介していきます。

具体的には特定のUser Agentだけをブロックするようなルールの設定を目的とします。

AWS WAF概要

手順を追って説明する前に概要を説明します。AWS WAFは以下の3要素によってできています。

Condition : IP addresses,SQL injection,String matchingなどから目的を選び、対象の設定をします。

Rule : Conditionをまとめ、対象にとるアクションを設定したりします。

Web ACL : Ruleをまとめたものです。保護対象を決めます。

ConditionがString matchingの場合、どのように検査するかをFilterという項目で決めます。

設定の流れ

サービス→セキュリティ、 アイデンティティ、 コンプライアンスからWAF&Shieldを選択、Go to AWS WAFで始めます。

web ACLの設定

web ACLを設定します。Configure web ACLでoverviewを確認したらNextを選択。

Web ACL nameを適当に設定します(ここではtest-wafとします)。CloudWatch metric nameは自動で埋まります。

Regionも適当に設定し、保護対象のロードバランサーを選択します(ここではtest-hacknote)。Nextで完了。

conditionの設定

iPhoneのみをブロックするconditionを設定していきます。 Nameは適当な名前を入れ、TypeString matchを選択。HTTP Headerの文字列で判別していきます。

Filter settingsの方は上の画像のように設定していきます。以下にそれぞれの意味を載せておきます。createで作成、Nextで完了です。

Part of the request to filter on : [Value to match]で指定した文字列を検索する場所を指定します。

Match type : 検査されるリクエストにおいてどこに表示されるかを選択します。Containsでは任意の場所が指定されます。

Transformation : matching判定をする際に文字列の操作をするかどうかの設定です(大文字をすべて小文字にするなど)。

Value is base64 encoded : [Value to match]の文字列がbase64でエンコードされている場合、表示不可能な文字列を選択してエンコードします。

ruleの設定

検査に引っかかった項目に対してどういうアクションをするのかを設定します。 Nameを適当に設定します。今回は「文字列が一致する場合」なのでdose match at least one of the filters in the string match conditionにし、作成したconditionを選択します。

ルールを選択し、それに対するアクションを選択していきましょう。今回は「リクエストに対し文字列が一致したらブロックし、それ以外は許可」という設定にします。

Review and createで確認し、Confirm and createで完了です。

結果

PCからの接続では以下のようにブロックされずにいきます(WordPressを入れてあります)。

一方iPhoneからの接続は以下のようにブロックされました。

このように、指定したルールに基づきアクセスを弾くことでサーバーに辿り着くことなくブロックすることができます。