【Tips】AWS WAFで複数ConditionをひとつのRuleに設定する際の注意事項

AWS WAF

セキュリティって怖いですね。森永です。

AWS WAF使ってますか?
お手軽にWAFを使いたいという場合にはもってこいのサービスです。
設定の際に少しハマリポイントがありますので、注意事項と解決方法を書いておきます。

ConditionとRule

AWS WAFにはどんなものを検知するかという「Condition」と、検知したものをどうするかという「Rule」という概念があります。
複数のConditionをひとつのRuleに設定出来ます。
例えば、SQLインジェクション用とXSS用のConditionをひとつのRuleに設定と言った感じです。

イメージ図

どちらかのConditionが検知したらブロックする」という設定をしたい際に問題が発生します。
それは、複数ConditionがAND条件となるということです。
上記の例で行くと、SQLiとXSSのCondition両方に引っかかる攻撃を仕掛けなければ防御してくれないということになります。

解決方法

方法としては2つあります。

  • Ruleを2つ作って、1つずつConditionを設定する
  • 全体を拒否して、Conditionに引っかからないものを許可する

前者は簡単です。
RuleはOR条件なので、複数ルールのどれかに当てはまれば、という設定は可能です。 ただ、Ruleひとつ作る毎に1ドル/月かかりますので、Conditionの量によっては地味に痛いです。

後者は、文字だけ見てもよくわからないと思いますので、解説していきます。

解説

まず、高校の論理集合を思い出しましょう。
今回求めているのは、Conditionが「A または B」という条件です。
これはORですね。

\[A \cup B\]

AWS WAFで設定できるのは「A かつ B」です。 これはANDです。

\[A \cap B\]

つまりは、ANDをORにしたいのです。
もうどうすればいいか分かりましたね。

そうみんな大好き「ドモルガンの法則」です。

\[\overline{A \cap B} = \overline{A} \cup \overline{A}\]

ドモルガンの法則でいうと、ANDの全体否定は、ORの部分否定になるわけですから、「Aでない かつ Bでない」を全体否定してあげれば「A または B」になるはずです。

\[\overline{\overline{A} \cap \overline{B}} = \overline{\overline{A}} \cup \overline{\overline{B}} = A \cup B\]

幸いなことに、AWS WAFには「Default Action」というものがありますので、全体の通信を拒否することは可能です。
また、Ruleでは、Conditionにマッチする、マッチしない時どうするという設定が可能です。

つまり、「Condition Aでない かつ Condition Bでない」を許可して、全体(Default Action)を否定することで実現そうです。

実際の設定例

まずは、Conditionの部分否定をします。
「Rules」→「Add Condition」→「When a request」で「does not」を選択することで部分否定を出来ます。
これを全てのConditionで設定します。

AWS_WAF

次に、全体を否定します。
「Web ACLs」の「Add rules to a web ACL」部分で、作成したRuleを選択し、「Allow」にして、「default action」で「Block all requests that don't match any rules」を選択します。

AWS_WAF 2

これで、求めた動作をするようになります。

最後に

軽く仕上げるつもりが大作になってしまいました。
ハマっている人のお役に立てば何よりです。