目次
1. はじめに
2021年4月1日 JST にてボットコントロール機能と同時にラベル機能がリリースされています。
https://www.wafcharm.com/jp/blog/aws-waf-bot-control-release-ja/
上記ブログでラベル機能についても説明しましたが、今回は WafCharm のカスタマイズ対応でのラベル機能利用例とマネージドルールでの利用例を具体例を交えて解説していきます。
2.ラベル機能とは
ラベル機能とはルールにマッチした場合にアクセスに対してラベルを付与できる機能です。
さらに、後続のルールでそのアクセスに付与されたラベルの有無を判定するルールが作成できることが特徴です。
複合条件であれば or や and を利用することで表現することは可能でしたが、同じ条件を複数のルールに付与する場合などは、逐一同一の条件を複数のルールに書き込まねばいかず、複雑な条件の場合は WCU を大量に消費している状態でした。
ラベル機能を用いることにより、特定の条件にマッチしたことをラベルで共有できることになり、後続のルールでラベルを使って条件式化することで、上の問題を解消することが可能になりました。
具体例として、例えば管理画面である /admin.php に対するアクセスのうち、日本以外からのアクセスは拒否するルール構成を下記に示します。最初のルールで、日本以外からのアクセスがあった場合に、そのリクエストに “foreign” ラベルを付与します。このルールは Count モードで動かすため、ラベルのみ付与して、後続のルールにリクエストを回します。次のルールでは、 /admin.php かつ “foreign” の条件がマッチした際に Block します。
3. WafCharm でのカスタマイズ例
WafCharm で依頼を受けることの多いカスタマイズについては、過去に以下のブログで解説させていただきました。この中でも特定のルールからの除外でラベル機能を利用しています。
https://www.wafcharm.com/jp/blog/wafcharm-aws-customize-samples-ja/
ユーザーからの問い合わせフォームを設定している場合、比較的自由な入力欄であるがために、誤検知が多発する場合があります。そのようなケースでは特定の URI で特定の ルールを動作させないための対応(除外)を選択することがあります。「/test/contact」が除外対象の問い合わせフォームのパスだとしてラベルを使った例を見てみましょう。
以下のルール構成のうちルールA〜Cに「/test/contact で始まる」を除外したいとします。
・(BLOCK) ルールA
・(BLOCK) ルールB
・(BLOCK) ルールC
ラベルを利用しない場合は以下のように個別に条件を追加することになります。
・(BLOCK) ルールA and 「not /test/contact で始まる」
・(BLOCK) ルールB and 「not /test/contact で始まる」
・(BLOCK) ルールC and 「not /test/contact で始まる」
文字列一致ステートメントを利用するため、各ルールの WCU が単純に2(合計6)増えることになります。
※文字変換を利用するとさらに増えます。
ラベルを利用する場合は以下のようになります。
・(COUNT) ラベルルール1 「/test/contact で始まる」
・(BLOCK) ルールA and not ラベルルール1
・(BLOCK) ルールB and not ラベルルール1
・(BLOCK) ルールC and not ラベルルール1
ラベルルールは文字列一致ステートメントを利用して、 WCU が2増えます。
「 not ラベルルール1」はラベル一致ステートメントを利用して WCU が1増えます。
つまりWCU の増加は合計5になります。
とても単純な例なので WCU の差分はあまり感じられないかもしれませんが、除外条件を複雑にすればするほど利用する WCU の差が大きくなります。また「/test/contact で始まる」という条件を書き換えたいという状況では、書き換える対象のリソースが1つに絞られるというのも管理する上で非常に便利です。
4.マネージドルールからのラベルでの除外
マネージドルールにラベルが付与されている場合、そのラベルを利用して後続ルールにて除外することができます。
マネージドルールの場合は個別のルールを編集することができないため、先ほどとは逆にマネージドルールの特定のルールをCOUNTに変更して、後続のラベルルールをBLOCKにする必要があります。
・マネージドルール
・ルールA
・ルールB
ルールAから「/test/contact で始まる」を除外する場合
・マネージドルール
・ルールA(COUNT)
・ルールB
・ルールAのラベルにマッチするルール and 「/test/contact で始まる」以外
具体的にAWS のマネージドルールを利用して設定してみます。
マネージドルールを選択し、Labelsを表示します。
※ Labels に値がない場合はラベルマッチステートメントを利用できません。
ルールのedit画面から対象のルールをCOUNTに変更します。
COUNTにしたルールのラベルを検知するルールをand 条件で作成します。
条件2に除外条件を付与します。
対象のマネージドルールの後続に配置します。
マネージドルール側のルールでマッチした場合はCOUNTで通過するものの、後続のラベルマッチルールによって「/test/contact で始まる」以外のラベルを持ったルールは検知することになります。
※補足情報
マネージドルール全体からの除外で問題ない場合は、スコープダウンステートメントを活用しましょう。
AWS マネージメントコンソールでの操作例
マネージドルールを選択し、edit画面を開き、条件を入力する。
5.おわりに
自作のルールの場合はラベルルールを利用して WCU と管理コストを削減することができます。またマネージドルールの場合はラベルルールを利用することで、特定のルールの除外カスタマイズが可能になります。癖はありますが、マネージドルールで除外カスタマイズを実施するには必須の機能となります。この記事を通してご活用いただければと思います。