AWS WAF(Web Application Firewall)を触ってみた

佐野

佐野 2015年10月20日

WAFというのは、「Web Application Firewall」というもので、
その名の通り、ウェブサイトを守るための機能です。

公式ブログ:【AWS発表】新サービス: AWS WAF
http://aws.typepad.com/aws_japan/2015/10/waf.html

AWSでも、「WAF」というサービスが開始されたため、
現在色々と試している最中です。

機能としては、以下の3つが上げられます。

  • IPアドレス単位でのアクセス制御
  • SQLインジェクション対策
  • HTTPヘッダに含まれる文字列を条件としたアクセス制御

2015年10月現在、対応しているのは、「CloudFront」のみです。

ともかくまずは、基礎となる「Web ACL」を作成してみましょう。

スクリーンショット 2015-10-19 17.13.28

まずは、おなじみの新規作成画面ですね。要素が何もない場合のみ表示されます。
青い「Get started」で、「Web ACL」作成画面に移行します。

最初は設定画面ではなく、概要説明が表示されますので、
下にスクロールをし、右下の青いボタンに次へ進みます。

スクリーンショット 2015-10-19 17.13.38

Step 1
ここで、「Web ACL」の名称を決めます。
スクリーンショット 2015-10-19 17.13.57

Step 2
ここでいよいよ、ブロック対象の要素の設定が可能です。
スクリーンショット 2015-10-19 17.14.10

各ボタンをクリックしたら、設定画面が開きますが、
そのまま「Web ACL」に書き込まれる形ではなく、
制御対象のIPアドレスやSQLインジェクション等のグループを作成して、
それらを「Rule」としてまとめて、さらに「Web ACL」に割り当てていくという形になります。

Step 3
「Rules」の作成画面です。
「Create Rule」のボタンをクリックすると、「Step 2」で作成した各設定を、
「Rule」にまとめていきます。
スクリーンショット 2015-10-19 17.16.24

その後、「Step 3」画面下にある
「If a request doesn’t match any rules, take the default action」
の項目で、先ほど作成した「Rule」と条件一致したアクセスに対する
デフォルトの動作を決定します。
スクリーンショット 2015-10-19 18.51.30

スクリーンショット 2015-10-19 17.16.24 2

Step 4
確認画面。ここでは何も設定する項目はありません。
スクリーンショット 2015-10-19 17.16.36

特に問題がなければ、右下の青い「Confirm and create」ボタンで、「Web ACL」を作成します。

・・・と、ここでお気付きかもしれませんが、
現在では、WAFはCloudFrontに関連付けて使用します。
しかし、これまでの工程から、どこにもCloudFrontに関連付けを行う部分は、見当たりません。

じつはここが、つまづきポイントでして、CloudFrontの方に、WAFに関連付けるための部分があります

設定する箇所は、CloudFrontのディストリビュージョン新規作成画面の「Distribution Settings」項目、
もしくは、各ディストリビュージョンの「General」タブから
「Edit」ボタンで切り替える「Distribution Settings」にあります。

スクリーンショット 2015-10-20 13.53.47

じつはこの部分は、AWS公式ブログとは食い違いがあり、おそらくは誰もが困惑する箇所だと思われます。
きっと公式ブログの方は、いわゆる「画面は開発中のものです」という事なのでしょうね。

ともかく、実際の動きを確かめるため、左メニューの「Conditions」配下の「IP addresses」で、
動作条件のIPアドレスを登録します。

今回はテストで、弊社IPを入れてみました。

スクリーンショット 2015-10-20 14.07.01

そして、作成したIPアドレスのグループ(今回は弊社IP1個だけですが…)を、
「Rules」に結びつけます。

スクリーンショット 2015-10-20 14.35.09

さらに、「Web ACL」に「Rule」を結びつければ、出来上がりです。

スクリーンショット 2015-10-20 14.37.40

ここで「Default action」が「Block all requests that don’t match any rules」になっていれば、
先ほど登録したIPアドレスが全てブロックされるようになります。

では実際アクセスしてみましょう。

スクリーンショット 2015-10-20 14.21.46

ACLを紐付けたCloudFrontを介してアクセスすると、このようにブロックされます。

「Web ACL」内で、Ruleを結びつける画面にて、
Ruleの増減を行ったり、デフォルトの動作を指定する事ができます。

例えばこの画像の組み合わせの場合は・・・
スクリーンショット 2015-10-20 15.10.24
「sano_test-rule01」に登録されたIPアドレスは「Allow」(許可)し、
それ以外のIPアドレスは「Block」(禁止)します。
要は、「Default action」で指定した動作を土台に、
上記「Rule」に登録された条件を例外指定するという事が可能ということです。
つまりは、「Rule」側が優先されます。

現時点では、対応はCloudFrontのみで、他のAWSサービスには後々対応していくそうです。

最近ではCloudFrontは、POSTメソッドの場合オリジンに直に通す設定が可能なため、
CloudFront越しからでもフォーム投稿が出来るようになっており、導入の敷居は下がっているほうですが、
ただ、オリジンサーバーに直にアクセスされると、
ファイアウォールそのものを迂回されているようなものなので、その辺の対策は必要ですね。
例えば、オリジンサーバーのURLを特定不能にしたり、
オリジンサーバーには、CloudFrontのアクセスしか受け付けないようにするなど・・・

現時点では、WAFそのものがファイアウォールの役割をしているというより、
CloudFrontをファイアウォールとして機能させているといった感じに見えます。
もしこれが、EC2に直に紐付ける事ができるようになると、迂回される事なく、
かつ簡単にブラックリスト・ホワイトリストの設定が可能な気がします。

IPアドレスによる制御の他にも、SQLインジェクションやHTTPヘッダ内の任意の文字列も
検査の対象にする事が可能だそうですが、
SQLインジェクションに関しては、それらしいテキストをフォームに投稿してみても,
特にブロックらしき動作はされず、普通に投稿できてしまったため、
投稿した内容が悪かったのか、まだ開発中なのか、でしょうね。
これは今後の調査課題にしようかと思います。