AWS WAF(Web Application Firewall)を触ってみた
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」を作成してみましょう。
まずは、おなじみの新規作成画面ですね。要素が何もない場合のみ表示されます。
青い「Get started」で、「Web ACL」作成画面に移行します。
最初は設定画面ではなく、概要説明が表示されますので、
下にスクロールをし、右下の青いボタンに次へ進みます。
Step 2
ここでいよいよ、ブロック対象の要素の設定が可能です。
各ボタンをクリックしたら、設定画面が開きますが、
そのまま「Web ACL」に書き込まれる形ではなく、
制御対象のIPアドレスやSQLインジェクション等のグループを作成して、
それらを「Rule」としてまとめて、さらに「Web ACL」に割り当てていくという形になります。
Step 3
「Rules」の作成画面です。
「Create Rule」のボタンをクリックすると、「Step 2」で作成した各設定を、
「Rule」にまとめていきます。
その後、「Step 3」画面下にある
「If a request doesn’t match any rules, take the default action」
の項目で、先ほど作成した「Rule」と条件一致したアクセスに対する
デフォルトの動作を決定します。
Step 4
確認画面。ここでは何も設定する項目はありません。
特に問題がなければ、右下の青い「Confirm and create」ボタンで、「Web ACL」を作成します。
・・・と、ここでお気付きかもしれませんが、
現在では、WAFはCloudFrontに関連付けて使用します。
しかし、これまでの工程から、どこにもCloudFrontに関連付けを行う部分は、見当たりません。
じつはここが、つまづきポイントでして、CloudFrontの方に、WAFに関連付けるための部分があります。
設定する箇所は、CloudFrontのディストリビュージョン新規作成画面の「Distribution Settings」項目、
もしくは、各ディストリビュージョンの「General」タブから
「Edit」ボタンで切り替える「Distribution Settings」にあります。
じつはこの部分は、AWS公式ブログとは食い違いがあり、おそらくは誰もが困惑する箇所だと思われます。
きっと公式ブログの方は、いわゆる「画面は開発中のものです」という事なのでしょうね。
ともかく、実際の動きを確かめるため、左メニューの「Conditions」配下の「IP addresses」で、
動作条件のIPアドレスを登録します。
今回はテストで、弊社IPを入れてみました。
そして、作成したIPアドレスのグループ(今回は弊社IP1個だけですが…)を、
「Rules」に結びつけます。
さらに、「Web ACL」に「Rule」を結びつければ、出来上がりです。
ここで「Default action」が「Block all requests that don’t match any rules」になっていれば、
先ほど登録したIPアドレスが全てブロックされるようになります。
では実際アクセスしてみましょう。
ACLを紐付けたCloudFrontを介してアクセスすると、このようにブロックされます。
「Web ACL」内で、Ruleを結びつける画面にて、
Ruleの増減を行ったり、デフォルトの動作を指定する事ができます。
例えばこの画像の組み合わせの場合は・・・
「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インジェクションに関しては、それらしいテキストをフォームに投稿してみても,
特にブロックらしき動作はされず、普通に投稿できてしまったため、
投稿した内容が悪かったのか、まだ開発中なのか、でしょうね。
これは今後の調査課題にしようかと思います。