AWS WAFマネージドルールで誤検知した場合の対処法
こんにちは、臼田です。
皆さんWAF使ってますか?
AWS WAFマネージドルールが実装されてから、安価ながらも用途に合わせたWAFのルールを利用できるようになったため、WAFの民主化が進んでいると思います。
しかしながら、マネージドルールは中身のルールがブラックボックスのため、現状では誤検知が発生した場合の対処が自分で定義したWAFよりも対処しづらい欠点があります。
今回はそれをカバーする方法を紹介します。
ログを取得し確認する
まずは誤検知が起きていることを検知し、原因を確認する必用があります。
以前はサンプルログのみしか取得できませんでしたが、今は下記のようにKinesis Firehose経由でフルログを取得することが可能になっていますので、これを利用してログを取得しましょう。
取得したログはS3に格納できるため、Athenaで下記のようにクエリをして確認しましょう。運用中に誤検知に気づく一つの手法は、Athenaでクエリした結果を確認することでしょう。他にはCloudWatchでの監視か、実際のユーザからの通報になると思います。
ログを詳細に確認し、どのような内容のクエリが問題になっているか突き止めましょう。よくある誤検知はselect
等のSQLに利用されるキーワードが引っかかるなどです。(AWS WAFマネージドルールでそのような単純な誤検知を確認したことはありませんが)
誤検知を対処する
誤検知に対処する一番簡単な方法は、検知してしまうパターンを明示的に許可することです。
AWS WAFのルールは上から順に適用され、明示的な許可があればその下の拒否ルールは評価されません。下記のようにマネージドルールがある場合には、その上に新しいルールを作成して適用すれば対処完了です。
私の経験上では誤検知が発生したことはありませんので、今回は明らかに止めるべきクエリを利用して対処してみます。
利用するルールはAWS WAF - Web Exploits Rules by F5
です。OWASP Top 10に基づいてXSSやSQLiなどを止めてくれる優れものです。
下記はやられサーバで有名なDVWAを利用した例です。
WAFがない状態でSQLインジェクションとなる' or 1=1--'
というクエリを送ると、DBにある他の情報を取ることができますが、
F5のルールを利用すると403
となりブロックしてくれていることが確認できます。
本来は正しい動作ですが、これを回避するルールを追加します。
今回はクエリストリングに含まれる文字列がキーになっているので、これを条件に設定します。
WAFのコンディション作成の画面からstring match condition
を作成します。TypeをString match
とし、フィルターを作成します。GETのパラメータをマッチさせる方法はいくつかあり、クエリストリングをそのままマッチさせる方法もありますが、せっかくなので先日実装されたAll query parameters (values only)
を利用します。これは、クエリストリング全体を意識せず、各パラメータの中身のみをマッチ対象とするフィルターになります。Match typeはContains
とし文字列が含まれていれば反応するようにします。GETパラメータのためURL encodeされるため、TransformationではURL decode
を選択します。Valueは許可したい文字列の一部である1=1
とします。本当は、許可しないほうがいいですが。
Add filterして登録されていることが確認できたら、Create
を押してコンディションを作成します。
コンディションを作成したら次はルールです。Create Ruleから作成画面に移りAdd conditionsで先程のコンディションを追加します。パターンに一致したものを許可したいため、does
, ...string match condition
, 先程のコンディション
を選択して作成したコンディションの内容が表示されていることを確認したらCreate
します。
ちなみに、現実的には許可したいURLやクエリパラメータなどを限定する条件も付加したほうが適切な対処になると思います。
あとはこのルールをマネージドルールの上に追加します。ACL画面のRuleタブからEdit web ACL
にて編集画面に移ります。
先程のルールを選択してAdd rule to ACL
にて追加し、左側のOrderの矢印を押して追加したルールをマネージドルールの上に持ってきます。明示的に許可したいのでActionをAllow
としてからUpdateします。
これで設定が完了しました。数秒ほどまって再び同じクエリを投げると、WAFでブロックされずに同じように表示されることが確認できました。
まとめ
AWS WAFで誤検知に対処するルールを作成する方法を紹介しました。マネージドルールはブラックボックスのためどうしても誤検知の不安を拭えませんが、私の経験上誤検知もそんなにあるわけでもなく一定のセキュリティを担保できるため積極的に導入していくべきだと思います。
もし実際に誤検知があった場合には、このような手法で対処が可能ですので是非AWS WAFとマネージドルールの導入を検討してみてください。