【AWSの呼吸 陸ノ型】AWS WAF V2での複合条件ルールの実現方法の例

f:id:wingfair:20210331005508p:plain

AWS WAFは手軽にWAFを導入できて便利ですよね。

一方で複合条件の実現方法に悩むことがあったので、その辺のTIPS的なものを書きたいと思います。

基本的なことはすっ飛ばすので、WAFをまだ使ったことなくてよく分からないよ、という方は以下の記事が参考になるかと思います。

前提

さて、今回の話の前提ですが、デフォルトアクションがAllowで、明示的に拒否したいものはBlockルールを入れて拒否したいような場合を想定します。

例えばこんな場合にどうルールを作る?

f:id:wingfair:20210331010623p:plain:w450

接続元のIPアドレスがA、Bの場合は許可したいが、それ以外は拒否したいというような場合を例に挙げてみます。

ルールとしては「AまたはB以外だったら拒否」というような組み方が考えられると思います。

「Rule Visual Editor」では実現できないルールがある

上記のルールをRule Visual Editorで入れようとしても実現できません。

Rule Visual Editorでは先述したようなORをまとめてNOTする複合的な条件はサポートしていないためです。

例えば、下図のようにNOTを指定した場合は単一のIP Setしか指定できません。

f:id:wingfair:20210331012855p:plain:w450
Rule Visual Editor

じゃあIP Setに全部書いちゃえば?

IP SetにAもBも書いちゃえ!というのも一つの手です。 しかし、単一のIP Setに多くのIPアドレスを詰め込むと以下のような管理上の問題が出てくる可能性があります。

  • IPアドレスの数が増えると何のIPアドレスなのか把握しにくくなる
  • IPアドレスを意味のある単位(例えば拠点A、拠点B)などで分割したくなった時に困る
  • 仮に部分的に分割して、ある程度の塊を複合条件用のIP Setに突っ込んだとしても同じIPアドレスを二重管理することになりメンテナンスが大変

また、IPアドレスに加えてリクエストパスに基づく制御がしたい場合も条件がネストするので、Visual Editorでは対応できなくなります。

ではどうするか?

「Rule JSON Editor」を使って、JSONで複合条件を書けば実現できます。

例えば、今回の例だと以下のように書けます。

IPアドレスA,BをそれぞれIP Setで定義しておいて、そのARNをJSON側から指定します。

{
    "Name": "[your-rule-name]",
    "Priority": 0,
    "Action": {
        "Block": {}
    },
    "VisibilityConfig": {
        "SampledRequestsEnabled": true,
        "CloudWatchMetricsEnabled": true,
        "MetricName": "[your-metoric-name"
    },
    "Statement": {
        "NotStatement": {
            "Statement": {
                "OrStatement": {
                    "Statements": [
                        {
                            "IPSetReferenceStatement": {
                                "ARN": "[ARN of IP Set A]"
                            }
                        },
                        {
                            "IPSetReferenceStatement": {
                                "ARN": "[ARN of IP Set B]"
                            }
                        }
                    ]
                }
            }
        }
    }
}

まとめ

  • 例で挙げたような複合条件を実現したい場合は「Rule JSON Editor」が使える
  • 接続元のIPアドレスに基づいて制御する場合、IP Setを意味のある単位で分割しつつ、Rule側でOR/NOT条件を使って指定可能
  • 単一のIP Setに許可したいIPを全部書くやり方もある

以上。