話題の記事

AWS WAFが正規表現と地域条件をサポートしました

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

ウィスキー、シガー、パイプをこよなく愛する大栗です。

本日AWS WAFが正規表現と地域条件をサポートしましたので試してみます。

正規表現と地域条件

今までAWS WAFがサポートする条件は以下の5種類でした。

  • Cross-site scripting
  • IP addresses
  • Size constraints
  • SQL injection
  • String matching

今回正規表現とGeo条件がサポートされたことでGeo matchが追加され、String matchingString and regex matchingに変わっています。

  • Cross-site scripting
  • Geo match <- New!
  • IP addresses
  • Size constraints
  • SQL injection
  • String and regex matching <- Modify!

今まで文字列の検索では一致条件しかできず複雑なパターンのマッチができませんでした。正規表現をサポートすることによって様々な条件で文字列をチェックできるようになります。正規表現はPCRE(Perl Compatible Regular Expressions)のほとんどをサポートしています。

また地理条件は、リクエスト元の国や地域を条件として使えるようになります。今までCloudFrontでは既に地域制限(Geo Restriction)が使用できていましたがAWS WAF単体で使用できるようになりました。ALBにAWS WAFを設定する場合に有用と言えます。CloudFrontの地域制限とAWSの地域条件を同時に使用する場合は、先にCloudFrontの地域制限がマッチしてAWS WAFでは判定されないため、AWS WAFの地理条件の使用は止めましょう。

試してみる

事前準備

東京リージョンに、アクセス可能なALBとEC2の構成を準備しておきます。

正規表現を試す

まずは正規表現を試してみます

AWS WAFの画面を確認するとConditionsの最期がString and regex matchingに変わっています。ここでCreate conditionをクリックします。

AWS_WAF___Shield

今回は東京リージョンのALBで正規表現のチェックをするため、以下のように設定します。

項目 備考
Name TestRegex 任意の値
Region Asia Pacific (Tokyo) 東京リージョン
Type Regex 正規表現

AWS_WAF___Shield

フィルタ条件を設定します。正規表現はAW{1,5}Sとしてみました。以下の内容を記述してCreate pattern set and add filterをクリックしてフィルタ条件を確定します。

AW{1,5}Sは以下の5パターンにマッチします。

  • AWS
  • AWWS
  • AWWWS
  • AWWWWS
  • AWWWWWS
項目 備考
Part of the request to filter on Query string
Transformation None Query stringを無変換でチェックする
Regex patterns to match to request Create regex pattern set 正規表現を新規作成
New pattern set name Regex01 任意の名前
Regex AW{1,5}S

Createをクリックして条件を作成します。

AWS_WAF___Shield

正規表現の条件を作成しました。

AWS_WAF___Shield

次にルールを作成します。Create Ruleをクリックします。

AWS_WAF___Shield

以下の内容でルールを設定してCreateをクリックして作成します。

項目 備考
Name RegexRule01 任意の名前
CloudWatch metric name RegexRule01 任意の名前
Rule type Regular rule 通常ルール
Region Asia Pacific (Tokyo) 東京リージョン
When a request(1) does 許可する
When a request(2) match at least one of the filters in the string match condition 文字列条件
When a request(3) TestRegex 作成した条件

AWS_WAF___Shield

このように作成できました。

AWS_WAF___Shield

Web ALCを作成します。

項目 備考
Web ACL name RegexACL 任意の名前
CloudWatch metric name RegexACL 任意の名前
Region Asia Pacific (Tokyo) 東京リージョン
AWS resource to associate alb01 事前に作成したALB

AWS_WAF___Shield

条件は先に作成しているのでCreate conditionsはそのままNextをクリックします。

Create rulesで先程作成したルールを設定します。

項目 備考
Rules RegexRule 作成したルール
Action Allow 条件に合った時に許可する
Default action Block all requests... 通常はブロック

AWS_WAF___Shield

内容を確認してConfirm and createをクリックします。

AWS_WAF___Shield

実際にリクエストしてみます。https://target-1.example.com/index.html?a=AWSのようにAW{1,5}Sの条件に合うクエリストリングであるAWSと入れると普通にアクセスできます。

https___target-1_oguri_classmethod_info_index_html_a_AWS

しかし、AW{1,5}Sの条件に合わないクエリストリング無しや?a=AWWWWWWSでは403 Forbiddenとなりアクセスできません。

403_Forbidden

403_Forbidden

地理条件を試す

今度は地理条件を試します。

AWS WAFのメニューにGeo matchが増えています。ここのCreate conditionをクリックします。

AWS_WAF___Shield

以下の内容でAdd locationをクリックしてフィルタ条件を確定して、Createをクリックして条件を作成します。

項目 備考
Name TestRegex 任意の値
Region Asia Pacific (Tokyo) 東京リージョン
Location type Country Countryのみ
Location Japan - JP 日本

AWS_WAF___Shield

地理条件が作成できました。

AWS_WAF___Shield

ルールを設定します。先程作成した正規表現のルールに追加します。作成したルールを選択してEdit ruleをクリックします。

AWS_WAF___Shield

Add conditionをクリックして条件を追加します。

以下の内容を設定してUpdateをクリックします。

項目 備考
When a request(1) does 許可する
When a request(2) originate from a geographic location in 地理条件
When a request(3) geo01 作成した条件

AWS_WAF___Shield

条件に地理条件が増えています。

AWS_WAF___Shield

実際にアクセスして試します。日本からアクセスすると正常に内容を確認できます。

https___target-1_oguri_classmethod_info_index_html_a_AWS

次に日本以外の場所としてソウルリージョンのEC2からアクセスしてみます。すると403でアクセスできなくなっています。

seoul-ec2

さいごに

AWS WAFはリクエストの内容は単純一致しかできませんでしたが、正規表現が利用可能になり複雑な条件もチェックができるようになりました。このため、今までのは類似の条件を大量に設定しなければならないなどの面倒がありましたが正規表現でまとめて記述できるようになりますし、複雑な条件ブロックができるようになりAWS WAFのチェックが多岐にわたるようになりました。

また、今まで国別のアクセスアクセス許可をする場合にはCloudFrontが必要でしたが、今回のアップデートでALBに対するアクセスで国別のアクセス許可ができるようになりました。使用するサービスをシンプルにでき不必要な設定が要らなくなりました。

今回の正規表現と地理条件のサポートによりAWS WAFで対応できる条件が大幅に増加したと思われます。