AWSの話題を中心に、日々の業務やプログラミングの徒然を綴るエンジニアブログです。

HANDS LAB

HANDS LAB ENGINEERS BLOG

ハンズラボエンジニアブログ

AWS WAFの導入


戦闘員の吉田です。

(eb後半ネタ、必ず書くので少々お待ちください。。。)

先日、JAWSーUGのイベントで Security-JAWS というイベントが開催されました。
Security-JAWS 【第1回】2016年5月17日(火)
最終的に、参加待ちが100名近くなったと話を聞きました。
それだけ皆さんセキュリティに対して関心を持っているのだということですね。

そんなセキュリティ関連のサービスが、2015年10月にリリースされました
【AWS発表】新サービス: AWS WAF

そう、AWSが提供するマネージドWAF、AWS WAFです。

aws-waf

AWSがとうとうWAFを出した!と、一時盛り上がったものの、WAFを使った、使っている、AWS WAFに関連した記事というのは実はあまり見かけません。

ハンズラボのコーポレートサイトにはAWS WAFが導入されています。

コーポレートサイトにWAFを導入する際に経験した内容について書いていきたいと思います。

AWS WAFについて

まず、AWS WAFについて簡単に確認します。

WAF(Web Application Firewall)

aws-black-belt-tech-2015-aws-waf-10-638
AWS Black Belt Tech シリーズ 2015 – AWS WAF
このWAFの機能をCloudFront上で利用できるのが、AWS WAFです。
AWS WAFはアプリケーションの防御のために以下の5種類を用意しています。

  • IP match conditions
  • String match conditions
  • Size constraint conditions
  • Cross-site scripting match conditions
  • SQL injection match conditions

これらのルールを指定することでWAFを機能させることができます。

AWS WAFでは

  • condition
  • rule
  • ACL

の3つの塊から構成されています。
具体的には、各防御ルールの詳細をconditionに定義し、そのルールが定義されたconditionをruleにまとめ、まとめられたRuleをACLにひも付けます。

イメージ図

waf

ACLではこのRuleを評価して、Ruleに記載した条件マッチしたリクエストにを拒否/許可/cloudWatchでカウントする、と言った設定が可能です。

注意点

AWS WAFではクロスサイト・スクリプティング(XSS)やSQLインジェクション等の防御を細かいルールを設定すること無く実施することが出来ます。

ここが、AWS WAFを利用する際の最大の注意点です。

AWS WAF では、condition中で設定する、「URI」や「Body」などの特定の値について、オプションで指定した処理(URL encodeなど)を実施したうえで「SQLインジェクション」や「クロスサイトスクリプティング」と判断されるようなコードが含まれていないかをチェックします。
その上で、Allow や Block といったアクションを設定することができます。

この、脅威の判定については、AWSが内部で実装している仕様に基づくのですが、執筆時(2016/05現在)で、公開されている情報はありません。

また、この内部ルールに関しては、他の機能同様に、今後の機能追加や改善によりまして適用個所や適用方法など変更される可能性があるそうです。

これが非常にクセモノで、そのリクエストの何がダメで弾かれたのかよくわからないのです・・・

ブロックされた情報はWAFコンソール内のRulesで確認が可能ですが、IPやHTTPのヘッダー情報が確認できるのみで、リクエストのどこがダメなのかといったログは出力されません。

WAFのログはCloudFrontログに統合されて出力されますが、クライアントIPや対象 URI、403 レスポンスが返されたことは確認できますますが、具体的にどういった理由で WAF がブロックしたなどの情報は確認できません(2016/05現在)

マネージドでAWSに任せる事が出来るのは非常に魅力的なのですが、実際に運用しようとするとなかなか難しい問題も多く残っています。

ハンズラボブログを例に上げると、更新や新規エントリーは問題ないのに、一部の記事のみWAFにより弾かれ更新出来ないといった問題が発生しました。
いろいろとためしてみると、記事内に styleタブ を使用した結果XSSと認識されて弾かれていた・・・といった事がありました。

しかし、IPのブロッキングが手軽に出来るのはかなりいいと思います。

IPブラックリスト

AWS Solutions Architect ブログで紹介されているように、Lambdaを用いたWAF のIPレピュテーション設定自動化を導入することで、IPブラックリストを最新の状態で利用することが出来ます。
IPブロッキングが手軽に利用できる。というだけでも利用する価値は有るのではないかと思います。

総括

AWS WAFはAWSが提供するマネージドWAFということで、手軽に利用することができますが、マネージドであるがゆえ、実際に使用する場合運用上かなり困ることも多々起こると思います。
しかし、DOS対策をしてくれることやIPのブロッキングを手軽に利用できる点で、AWS WAFに全て任せて防御する。のではなく、多段に防御する。
WAFで弾けるものを弾き、バックで別の防御策を講じる。といった使い方であれば有用なツールだと思います。

ハンズラボのサイトクラスなら良いのですが、ちょっと大きなサービスで利用するにはまだまだWAFのアップデートを待ったほうが良いかと思います。