AWS WAFが正規表現と地域条件をサポートしました
ウィスキー、シガー、パイプをこよなく愛する大栗です。
本日AWS WAFが正規表現と地域条件をサポートしましたので試してみます。
正規表現と地域条件
今までAWS WAFがサポートする条件は以下の5種類でした。
- Cross-site scripting
- IP addresses
- Size constraints
- SQL injection
- String matching
今回正規表現とGeo条件がサポートされたことでGeo match
が追加され、String matching
がString 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
をクリックします。
今回は東京リージョンのALBで正規表現のチェックをするため、以下のように設定します。
項目 | 値 | 備考 |
---|---|---|
Name | TestRegex | 任意の値 |
Region | Asia Pacific (Tokyo) | 東京リージョン |
Type | Regex | 正規表現 |
フィルタ条件を設定します。正規表現は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
をクリックして条件を作成します。
正規表現の条件を作成しました。
次にルールを作成します。Create Rule
をクリックします。
以下の内容でルールを設定して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 | 作成した条件 |
このように作成できました。
Web ALCを作成します。
項目 | 値 | 備考 |
---|---|---|
Web ACL name | RegexACL | 任意の名前 |
CloudWatch metric name | RegexACL | 任意の名前 |
Region | Asia Pacific (Tokyo) | 東京リージョン |
AWS resource to associate | alb01 | 事前に作成したALB |
条件は先に作成しているのでCreate conditions
はそのままNext
をクリックします。
Create rules
で先程作成したルールを設定します。
項目 | 値 | 備考 |
---|---|---|
Rules | RegexRule | 作成したルール |
Action | Allow | 条件に合った時に許可する |
Default action | Block all requests... | 通常はブロック |
内容を確認してConfirm and create
をクリックします。
実際にリクエストしてみます。https://target-1.example.com/index.html?a=AWS
のようにAW{1,5}S
の条件に合うクエリストリングであるAWS
と入れると普通にアクセスできます。
しかし、AW{1,5}S
の条件に合わないクエリストリング無しや?a=AWWWWWWS
では403 Forbidden
となりアクセスできません。
地理条件を試す
今度は地理条件を試します。
AWS WAFのメニューにGeo match
が増えています。ここのCreate conditionをクリックします。
以下の内容でAdd location
をクリックしてフィルタ条件を確定して、Create
をクリックして条件を作成します。
項目 | 値 | 備考 |
---|---|---|
Name | TestRegex | 任意の値 |
Region | Asia Pacific (Tokyo) | 東京リージョン |
Location type | Country | Countryのみ |
Location | Japan - JP | 日本 |
地理条件が作成できました。
ルールを設定します。先程作成した正規表現のルールに追加します。作成したルールを選択してEdit rule
をクリックします。
Add condition
をクリックして条件を追加します。
以下の内容を設定してUpdate
をクリックします。
項目 | 値 | 備考 |
---|---|---|
When a request(1) | does | 許可する |
When a request(2) | originate from a geographic location in | 地理条件 |
When a request(3) | geo01 | 作成した条件 |
条件に地理条件が増えています。
実際にアクセスして試します。日本からアクセスすると正常に内容を確認できます。
次に日本以外の場所としてソウルリージョンのEC2からアクセスしてみます。すると403でアクセスできなくなっています。
さいごに
AWS WAFはリクエストの内容は単純一致しかできませんでしたが、正規表現が利用可能になり複雑な条件もチェックができるようになりました。このため、今までのは類似の条件を大量に設定しなければならないなどの面倒がありましたが正規表現でまとめて記述できるようになりますし、複雑な条件ブロックができるようになりAWS WAFのチェックが多岐にわたるようになりました。
また、今まで国別のアクセスアクセス許可をする場合にはCloudFrontが必要でしたが、今回のアップデートでALBに対するアクセスで国別のアクセス許可ができるようになりました。使用するサービスをシンプルにでき不必要な設定が要らなくなりました。
今回の正規表現と地理条件のサポートによりAWS WAFで対応できる条件が大幅に増加したと思われます。