目次
1. はじめに
2021年09月23日 PTD にインライン正規表現の提供が開始されました。
これまでは正規表現を利用する際に正規表現のパターンセットを登録してから利用する必要がありました。
今回の変更により単一の正規表現を直接ルールに書き込むことが可能となりました。
https://aws.amazon.com/jp/about-aws/whats-new/2021/09/aws-waf-in-line-regular-expressions/
※ AWS WAF Classic は非対応の機能になります。
2.利用方法
ルール作成画面にて Match type で Matches regular expression を選択します。
Regular expression に正規表現を書き込みます。
実際に作成された内容をJSON形式でも確認すると、RegexMatchStatement が宣言され、正規表現の内容は RegexString に記載されています。
```` { "Name": "test", "Priority": 0, "Action": { "Block": {} }, "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "test" }, "Statement": { "RegexMatchStatement": { "FieldToMatch": { "Body": {} }, "TextTransformations": [ { "Type": "URL_DECODE", "Priority": 0 } ], "RegexString": "test*test|^/test" } } } ````
3. パターンセットとの比較
これまでは正規表現のパターンセットを事前に設定して、それを参照するルールを作成して利用する必要がありました。また、利用できるパターンセット数の制限が厳しいことから節約のために以下のように文字列一致条件を組み合わせてシグネチャを作成することも良いテクニックでした。
例)URI で「 /user/[ユーザーID]/view」 を指定する例
・正規表現を利用しない場合
/user/ で始まる AND /view で終わる
・正規表現を利用する場合
^/user/[a-z0-9]+/view$
公式ドキュメントの内容と実際に確認できた制限をまとめると以下の通りとなりました。
パターンセットの制限
・設定できるパターンセット数は 10 まで
・一つのパターンセット内に定義できる正規表現数 10 まで
・正規表現に利用できる文字数 200 まで
インライン表現の制限
・1つの正規表現に利用できる文字数 512 まで
確認した結果、インライン表現はパターンセットに比べると制限が大きく減りました。
文字列マッチなどを or 条件で利用している場合は確実に正規表現へ移行した方が WCU を節約することができます。
例えば、文字列「spring」「summer」「autumn」「winter」のいずれかの言葉を検知するルールを書きたい場合、正規表現を使わなかった場合は以下の JSON の例だと WCU を 50 消費します。
```` { "Name": "seasons", "Priority": 0, "Action": { "Block": {} }, "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "seasons" }, "Statement": { "OrStatement": { "Statements": [ { "ByteMatchStatement": { "FieldToMatch": { "QueryString": {} }, "PositionalConstraint": "CONTAINS_WORD", "SearchString": "spring", "TextTransformations": [ { "Type": "URL_DECODE", "Priority": 0 } ] } }, { "ByteMatchStatement": { "FieldToMatch": { "QueryString": {} }, "PositionalConstraint": "CONTAINS_WORD", "SearchString": "summer", "TextTransformations": [ { "Type": "URL_DECODE", "Priority": 0 } ] } }, { "ByteMatchStatement": { "FieldToMatch": { "QueryString": {} }, "PositionalConstraint": "CONTAINS_WORD", "SearchString": "autumn", "TextTransformations": [ { "Type": "URL_DECODE", "Priority": 0 } ] } }, { "ByteMatchStatement": { "FieldToMatch": { "QueryString": {} }, "PositionalConstraint": "CONTAINS_WORD", "SearchString": "winter", "TextTransformations": [ { "Type": "URL_DECODE", "Priority": 0 } ] } } ] } } } ````
インライン正規表現を利用すると WCU の消費は 13 となります。
正規表現に記載できる制限の 512 までは対象文字を増やしても WCU が変わることはありません。
```` { "Name": "seasons_regex", "Priority": 6, "Statement": { "RegexMatchStatement": { "RegexString": "spring|summer|autumn|winter", "FieldToMatch": { "QueryString": {} }, "TextTransformations": [ { "Priority": 0, "Type": "URL_DECODE" } ] } }, "Action": { "Block": {} }, "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "seasons_regex" } } ````
極端な例ではありますが、WCU の削減が期待できそうだということをご理解いただければ幸いです。
4.WafCharm での変更点
インライン正規表現による変更は現在のところございません。
ただし上記の通り制限が緩和されることにより、WCU の圧縮が期待でき、より多くのルールを適用できることが見込まれますので、インライン正規表現を利用した今後の WafCharm の更なるパワーアップにご期待ください。
5.おわりに
今後ルールを作成する際は、インライン正規表現を使える状況では、ほとんどの場合最適な選択肢になるのではないかと思える変更でした。既存で文字列マッチを利用している方は WCU の軽減が期待できますので積極的に活用してみてはいかがでしょうか。