AWS WAFのマネージドルールを試す

## 初めに
   
こんにちは。CYBIRDエンジニア [Advent Calendar](http://qiita.com/advent-calendar/2017/cybird) 13日目の@daisuke-senmyouです。12日目は@yurika_fukaiさんの[【恐怖】サイバードの企画職の実態](https://qiita.com/yurika_fukai/items/ac64bd3f2f69fa3be282)でした。『Planter』導入後、企画職のメンバーが「トピックブランチをマスターにマージましたー」とか「あーコンフリクトした。少々お待ち下さい。」とかいう会話をしいてるのを聞いて自分の専門外のことも積極的に取り組む姿にいたく感動しておりました。エンジニアも負けてられませんね！

## AWS WAFとこれまでの課題
AWSが提供するWAFです。
従来のアプライアンス製品はもちろん、クラウド型WAFと比較しても格安で導入できる画期的なサービスでしたが、大きな課題がありました。WAFは一定のルールに基いてリクエストを許可するか拒否するか判定しますが、AWS WAFではそのルールのほとんどを自分で定義しなければいけないという点です。
WAFの肝となるのはこのルール（シグネチャ）であり、さらに一度ルールを定義したらそれでおしまいではありません。日々進化する新たな攻撃手法に対して、ルールも日々更新していく必要があります。これを適切に定義し、また更新し続けることは高い専門的知識と大きな運用コストが必要でした。そこで登場したのがAWS WAFの[マネージドルール](https://aws.amazon.com/jp/blogs/news/ready-to-use-managed-rules-now-available-on-aws-waf/)です。AWS re:Invent 2017 で発表された新サービスです。

## マネージドルールの設定手順
すでに[良いレポート](https://dev.classmethod.jp/cloud/aws/aws-reinvent2017-waf-managed-rule-try/)があるので手順は割愛します。ただし今回はWordPressではなく[OWASP TOP10](https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project#tab=Main)に対する防御を試したいと思います。マーケットプレイスで購入するマネージドルールも[Fortinet Managed Rules for AWS WAF - Complete OWASP Top 10](https://aws.amazon.com/marketplace/pp/B0779D3JYV)というものを試します。出品者のFortinet社はセキュリティ関連製品を多数提供している企業です。

|![SnapCrab_NoName_2017-12-5_15-56-56_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/24060/3c39ec5b-bd04-6456-2dff-ed1c5514ce5a.png)|
|:-:|

## 攻撃対象サイト
この手の検証をする際には脆弱性を盛り込んだ自作の検証用サイトを利用することが多いのですが、[OWASP Juice Shop](https://www.owasp.org/index.php/OWASP_Juice_Shop_Project)というのが面白そうだったので使ってみたいと思います。こちらもすでに[良いレポート](https://dev.classmethod.jp/security/owasp-juice-shop/)があります。

|![SnapCrab_NoName_2017-12-5_16-4-17_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/24060/434dd375-9840-2bed-38a0-4e20f247967b.png)|
|:-:|

## 検査ツール
@pakchee さんが[5日目の投稿](https://qiita.com/pakchee/items/d466e592914d5e48a04a#%E8%84%86%E5%BC%B1%E6%80%A7)で紹介している通り、弊社で利用している[VEX](https://www.ubsecure.jp/vex/vex)を使いWAF設定前後の脆弱性の検出を比較していきます。VEXでは様々な脆弱性が検出できるのですが、今回はわかりやすいSQLインジェクションとクロスサイトスクリプティング（XSS）について注目してみます。

## WAFなしの検査結果
|![SnapCrab_NoName_2017-12-5_16-15-23_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/24060/d9b96476-4f5d-b93c-384f-e59ce01b25c2.png)|
|:-:|

「判定数」の部分が検出されたカテゴリごとの脆弱性の件数です。詳細を見ていくと、例えば以下は商品の検索機能でXSSが検出された例です。危険度は上から２番目の"Medium"です。

|![SnapCrab_NoName_2017-12-5_16-25-45_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/24060/42d7d7c9-a628-8385-07fe-644861fe09c9.png)|
|:-:|

これはAPIのレスポンスとしてJSONが表示されていますが、同様のリクエストをフォームに対して行うとダイアログが表示されました。XSSの脆弱性が確認できます。

|![SnapCrab_NoName_2017-12-5_16-53-15_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/24060/18bb2e78-de92-83f1-4d49-24a75f155441.png)|
|:-:|


この他にもSQLインジェクションが３箇所で検出されていました。うち１箇所はログインフォームで、以下の様に入力（パスワードはなんでも良い）すると実際にログインできてしまいました。

|![SnapCrab_NoName_2017-12-5_16-32-28_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/24060/bcf36101-762b-ae9a-dbd3-1924a1e3068a.png)|
|:-:|

## WAFありの検査結果
AWS WAFの管理コンソールでは、WAFで許可もしくは拒否された件数のグラフが表示されます。

|![SnapCrab_NoName_2017-12-5_17-33-18_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/24060/65423f6d-8836-12fc-46e2-77c0270f964d.png)|
|:-:|

こちらはXSSの攻撃をブロックしたというログが表示されています。

![SnapCrab_NoName_2017-12-5_17-24-53_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/24060/cf20ed68-9a66-26f3-5062-64e9b231ffbd.png)

Cloud Watch でもグラフが確認できます。

|![SnapCrab_NoName_2017-12-5_17-25-37_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/24060/9d83f9af-80aa-aa35-3d96-b7ded664c3c6.png)|
|:-:|

VEXでの検査結果です。単純に件数だけの判断はできませんが、全体的に減少しているのが分かります。

|![SnapCrab_NoName_2017-12-5_17-37-46_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/24060/7166235d-4b27-f437-af9e-d584dca4bf52.png)|
|:-:|

SQLインジェクションの検出数が9件から6件に減っています。ログイン画面での検出がなくなりました。先程と同じ入力をしてみるとCloudFrontからのエラーメッセージが表示されました。

|![SnapCrab_NoName_2017-12-5_17-29-48_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/24060/20b9139d-bda3-07c9-9cb7-76330ed5d08c.png)|
|:-:|

XSSも36件から7件に減っています。さらに詳細を見ると先程と脆弱性の内容が変わっており、危険度がMediumから一番下の備考レベルに下がりました。

|![SnapCrab_NoName_2017-12-5_17-36-29_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/24060/2a7f2b6a-3a16-170c-f483-37b241224d8b.png)|
|:-:|

## その他の結果
* 特定条件で表示されていたスタックトレースを含むエラー画面が表示されなくなった。
* 今回の攻撃対象には該当しなかったが、Struts2 の脆弱性に対する攻撃ブロックのログが多数見られた。
* WAFを設定した際、お問合わせの投稿完了メッセージが表示されなくなった（WAFの誤検知か？）。

## 注意点
AWS WAF は CloudFront もしくは ALB に設定することができ、今回は CloudFront に設定しました。CloudFront の性質上、WAF の設定も伝搬に少し時間が掛かります。今回試した際は5分程度掛かったようです。Cloud Watch などで設定が反映されている事を確認してから検証する必要があるのでご注意下さい。

## まとめ
マネージドルールを適用するだけである程度の攻撃は防げることが分かりましたが、はたして防げなかった攻撃もありました。正論を語ると、やはり脆弱性はアプリケーション側で根本的に対応し、WAF はもしもの時のセーフティーネット程度にしておくのが良さそうです。
しかし本格的な WAF の導入に踏み切れずにいるチームには適したサービスではないでしょうか。攻撃の痕跡も可視化されるので、「ほら、こんなに攻撃されているんですよ。もっとセキュリティに力入れましょうよ！」という予算取りの材料にも良いのではないでしょうか。

## 最後に
   
今後やりたいこととしてはCIの中にセキュリティ検査を組み込むというものです。VEXもJenkins連携機能が提供され技術的な条件は揃ってきているのですが、検査で長時間にわたりサーバーに高負荷を掛けてしまったり、検査用のデータが大量に投入されてしまうなどの課題がありなかなか実現できていません。来年こそは！
さて、CYBIRD エンジニア [Advent Calendar](http://qiita.com/advent-calendar/2017/cybird) 明日は、@sakamoto_kojiさんの「Action on Google(Dialogflow)」です。@sakamoto_kojiさんの部署では最近 「なみある？」が「Google アシスタント」に対応してそれに関連する記事のようです。楽しみですね！