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
は適当な名前を入れ、Type
はString 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からの接続は以下のようにブロックされました。
このように、指定したルールに基づきアクセスを弾くことでサーバーに辿り着くことなくブロックすることができます。