Nedia What's up!

ネディアのエンジニアによるIT技術やサービスの紹介・検証などをお届け!

AWS WAFでアクセス制御

今回は2015年10月にリリースとなったAWS WAFを弄ってみたいと思います。

WAFって何?

WAFとはWeb Application Firewallのことです。

一般的なファイアウォールがIPアドレスやポートに対して制御を行うのに対し、WAFではSQLインジェクション攻撃などの、構築したWEBアプリケーションに対しての攻撃から防御する役割を担っています。

AWS WAFの特徴

AWS WAFは前回紹介したCloudFrontと組み合わせて利用します。逆に言えばCloudFrontが設定されていないとAWS WAFを使用することができません。

AWS WAFで指定できる条件は以下の3つです。

  • IPアドレスが一致した場合の制御
  • 文字列が一致した場合の制御
  • SQLインジェクション対応

また料金の詳細はAWS公式ページをご覧いただきたいのですが、公式ページの料金例では月額26USD(約3,100円)と非常に安価であることがわかります。

実際には上記に加えてCloudFrontの料金も必要になります。

AWS WAFを設定する

では実際にAWS WAFを使ってみましょう。

まずはAWS WAFへアクセスします。

waf01

設定目標

今回は特定のIPアドレスから「test」の文字列が含まれるWebページへのアクセスを遮断できるかを確認したいと思います。

設定の流れ

次画面ではAWS WAFの概要が書かれています。

waf02-1

英語ですが大体以下のような流れが説明されています。

  • 条件(Conditions)を作成
  • ルールを作成(条件を組み合わせ、拒否するのか許可するのか)
  • Web ACLを作成(複数のルールを組み合わせてグループ化する)

この画面で設定する項目はありませんので、右下のNextボタンを押して進みます。

waf02-2

Web ACL名の設定

作成するWeb ACLの名前を設定します。CloudWatch metric nameはCloudWatchを使用してグラフ化する際に必要なメトリックの名前です。

waf03

条件を作成

まずは条件(Conditions)の作成です。

ここではIPアドレス、文字列、SQLインジェクションに対して条件を設定します。

waf05

概略としては以下のような条件です。

IP match conditions アクセス元IPアドレスに対し、指定したIPアドレス(サブネット可)が含まれているか
String match conditions ホスト名やURI、User-Agent等に指定した文字列が含まれているか。
SQL injection match conditions SQLクエリーが含まれるWEBリクエスト中のヘッダーやURI、クエリー等が悪意のある攻撃でないかをチェックする。

IPアドレスの条件設定

まずは一般的なファイアウォールと同様にIPアドレスの条件を作成してみます。

「Create IP match condition」をクリック。

waf04

条件名と対象のIPアドレスを設定します。今回はわかりやすくblacklist01と名づけました。

waf07

CreateをクリックしIPアドレスの条件設定が完了です。

文字列の条件設定

今度はもう一つ文字列の条件を作成してみます。

waf06-1

IPアドレスの条件設定と違った項目が出てきました。
今回は「test」を含むURIを制御したいので以下のような設定をしました。

waf06-2

なお、各項目の概要は以下の通りです。

名称 概要 選択可能な項目
Part of the request to filter on フィルタを行いたいリクエスト Header / HTTP method / Query string / URI
Match type 文字列一致条件 Contains / Exactly matches / Starts with / Ends with / Contains word
Transformation 指定文字列の変換 None / Convert to lowercase / HTML decode Remove whitespace characters / Simplify command line / URL decode
Value is base 64 encoded 指定文字列がbase64でエンコードされているか -
Value to match 指定したい文字列 -

Nextボタンで次のステップへ進みます。

ルールの設定

ここでは先ほど作成した条件一致するか一致しないかのルールの設定を行います。

まずは「Create rule」ボタンをクリックします。

waf08

blacklistblockという名称で、「IPアドレスがblacklist01と一致する場合」で作成します。

waf09-1

更に「Add another condition」をクリックし、「文字列がwafteststring(URIにtestを含む場合)」を追加します。

waf09-2

ルールアクションの設定

作成が完了したルールのアクションを設定します。

ルール内の全ての条件を満たす場合のアクションを「Block」に設定。
どのルールにも該当しない場合のアクションは「Allow all requests that don't match any rules」(許可)に設定します。

waf10-2

次の画面に進み、既に設定されているCloudFrontと関連付けをして完了です。

waf11

動作の検証

前回CloudFrontを設定したバーチャルドメインにWAFのACLを設定しましたので、動作検証を行います。

今回の検証は「特定のIPアドレスから「test」の文字列が含まれるWebページへのアクセスを遮断」です。

ブラックリスト登録したIPアドレスから「test」の文字列のないページへアクセス

これは問題なく表示できました。

waf15

ブラックリストに登録していないIPアドレスから「test」の文字列のあるページへアクセス

次にtestというフォルダを作成して表示できるか確認しました。表示に問題はありませんでした。

waf13

ブラックリスト登録したIPアドレスから「test」の文字列が含まれるWebページへのアクセス

今度は今回の検証目標である条件下での動作確認です。きちんとブロックされました。

waf14

まとめ

というわけで無事目標の設定を達成することができました。

今回はIPアドレスと文字列の組み合わせでしたが、ヘッダー等に含まれる文字列やSQLインジェクションなど紹介できない箇所についても検証したいと思いました。

問題点として、オリジンサーバへ直接アクセスしてしまうとhtmlファイル等が見れてしまい、意図したアクセス制御ができないためDNS等での工夫が必要かなと感じました。

今後もAWS関連の記事をアップしていきます!