【小ネタ】AWS WAF の設定を if 文に例える

こんにちは、最近 WAF WAF しているインフラストラクチャー部の沼沢です。

WAF(Web Application Firewall) といえば、SQL インジェクションなどの Web アプリケーションへの攻撃をブロックするためのファイアウォールです。

そんな用途とは少し異なり、AWS WAF を使って CloudFront や Application Load Balancer へのアクセス制限をする機会が多いのですが、自分自身、WAF というものにあまり縁が無かったからなのか、AWS WAF の設定が少々ややこしくてわかりにくかったので、自分なりに if 文に例えてみました。

なお、あくまで理解するためだけの例えとなりますので、正確には以下の公式ドキュメント等を参考にしていただければと思います。
ルールの使用 - AWS WAF と AWS Shield アドバンスド
ウェブ ACL の使用 - AWS WAF と AWS Shield アドバンスド

Condition

まずは最小単位の Condition からです。

Condition は if 文の1つの条件と捉える

if (ipaddress == "xxx.xxx.xxx.xxx"){
    // アクセス元の IP Address が "xxx.xxx.xxx.xxx" だったら OK!
    return "Access OK";
}

上記の if 文で言うと、ipaddress == "xxx.xxx.xxx.xxx" が Condition(IP addresses 相当) にあたります。

Rule

Rule は if 文の条件 (Condition) の塊と捉える

if (ipaddress == "xxx.xxx.xxx.xxx" && method == "POST") {
    /* アクセス元の IP Address が "xxx.xxx.xxx.xxx" かつ *
     * HTTP Method が "POST" だったら OK!              */
    return "Access OK";
}

上記の if 文を Rule と仮定するとして、

  • 以下の2つの Condition の塊が Rule
    • ipaddress == "xxx.xxx.xxx.xxx" (IP addresses 相当)
    • hostHeader == "hoge.com" (String matching 相当)

このような、1つ以上の Condition の組み合わせが Rule です。
1つの Rule 内では Condition は全て AND で繋がります
1つでも異なるとその Rule ではマッチしません。

Web ACL

Web ACL は if 文本体と捉える

if (!url.startsWith("/hoge/") && userAgent == "hogehoge") {
    /* URL の Path が "/hoge/" で前方一致 かつ *
     * User-Agent が "hogehoge" だったら OK! */
    return "Access OK";
} else if (ipaddress == "xxx.xxx.xxx.xxx") {
    // アクセス元の IP Address が "xxx.xxx.xxx.xxx" だったら OK!
    return "Access OK";
} else {
    // それ以外は NG!
    return "Access NG";
}

上記の if 文全体を Web ACL と仮定するとして、上から

  • 以下の2つの Condition を含む Rule が 優先順位 1 の Rule (最初の if 文)
    • !url.startsWith("/hoge/") (String matching 相当)
    • userAgent == "hogehoge" (String matching 相当)
    • 上記2つとも一致すれば許可
  • 以下の1つの Condition を含む Rule が 優先順位 2 の Rule (次の else if 文)
    • ipaddress == "xxx.xxx.xxx.xxx" (IP addresses 相当)
    • 上記に一致すれば許可
  • 全ての Rule にマッチしなかった(else ブロックに入った)ものの挙動を定義(Web ACL のデフォルト動作相当)
    • 全ての Rule にマッチしなかったリクエストを拒否

なお、Rule 同士は全て OR で繋がります。 (else if で繋がると考えた方がわかりやすいかも?)
そのため、Rule は優先順位ごとに先勝ちで評価されます

まとめ

今回紹介したように普段使い慣れている(?) if 文に例えてみるとなかなか分かりやすかったので、皆様の参考になれば幸いです。

if 文同様、あまり複雑な条件にすると他の人が解けない難解な条件となり、後々とても後悔することになるので、なるべくシンプルな組み合わせを心がけたいですね。