AWS WAFでセキュリティを強化、AWS WAF設定方法を徹底解説

はじめに

どうもこんにちは、会員管理システムSMOOSYの開発・運用を担当している大橋です。アトラスが提供しているサービスのほとんどはAWS(Amazon Web Services)を使っていて、私が運用担当になってからAWSの様々なサービスを触り始めました。アトラスではAWS WAF(Web Application Firewall)を使って自社サービスの安全性を保っています。この運用方法をざっくり言うと、AWS WAFで検知した怪しいアクセスがアラートとしてSlackに通知され、そして我々がそのアラートをキャッチし、適切に対応するという流れです。

これらを1つの記事に記載するとかなり長くなってしまうので、今回はまずAWS WAFおよびその設定方法を徹底解説します。

WAFとは

WAFという言葉にまだ馴染みがない方もいらっしゃるかと思うので、WAFについて簡単に説明します。WAFとはWeb Application Firewallの略で、ウェブアプリケーションの脆弱性を悪用した攻撃からウェブサイトを保護するための仕組みです。ウェブサイトへのリクエストは必ずWAFを通るので、もし悪意のあるリクエストが来たらWAFでブロックします。つまりWAFがあれば、悪意のあるリクエストはウェブサーバに到達しません。このようにフィルタリングすることでウェブアプリケーションを守ります。

AWS WAFの特徴

世界で有名なWAF製品として、Imperva IncapsulaAkamaiなどがありますが、そのほとんどはプランによって料金が決まっています。それらを導入するのは楽ですが、一度導入したら一定の金額を毎月支払うことになります。またIPブロックなど細かい設定はWAFを運用している会社に依頼する必要があるので少し面倒です。

それに比べてAWS WAFでは導入時に自分でルールを設定する必要がありますが、その代わりに料金は自分が設定したルール(後ほど説明します)とリクエスト数を合わせて計算するのでコストの調整がしやすいです。ただし、AWSでサービスの運用をしているのが前提条件になります。AWS以外のレンタルサーバなどにAWS WAFを使うことはできません。

AWSを利用していて、かつそれほどコストのかからないWAFがほしいのであれば、AWS WAFは最適かと思います。

AWS WAFの初期設定

AWS WAFの設定方法についてAWSの公式ドキュメントはありますが、設定画面は現状英語しかないので、ここで画面キャプチャーを見ながら詳しく説明していきます。

1. Web ACLsにアクセス

まずAWSコンソールのサービスから[WAF &  Shield] -> [Go to AWS WAF] -> [Web ACLs] をクリックし、下記の画面に遷移します。

2. [Create web ACL] をクリックし、ACL(Access Control List)を作成

ACLを作成するに当たって、[1. 命名] -> [2. 条件作成] -> [3. ルール作成] -> [4. レビュー&作成] 4つのステップがあります。それぞれの役割を簡単に説明します。

[1. 命名]:

ACLの名前、リージョン、AWSリソースなどを設定します。AWSリソースはリージョンに属しているので、リージョンを指定してからAWSリソースを選択します。

[2. 条件作成]:

どのようなリクエストに対して反応するかを細かく設定します。設定した後に編集することもできます。

[Create condition]をクリックすると新しい条件を作成できます。
また1つの条件の中にフィルターを自由に追加したり削除したりすることも可能です。

[3. ルール作成]:

作成した条件に対してどうアクションするのかを設定します。

[4. レビュー&作成]:

確認したら[Confirm and create]ボタンを押して完了です。設定が完了したら、[Web ACLs]画面に表示されます。

3. 動作確認

前述したように、AWS WAFは設定したACLやルールの数で料金計算されています。無駄なACLやルールを設定していると、その分の料金も取られてしまいます。自分が設定したルールがちゃんと反映されているかをしっかり確認しましょう。ツールを使えば色々なパターンでテストできます。

ここでChromeのプラグインであるAdvanced Request Clientのご登場です。Advanced REST Clientは、HTTPメソッド、URL、ヘッダー、さらにリクエスト本文まで設定できます。これでAWS WAFで設定したルールに反するリクエストを作り、右上の[SEND]ボタンを押して送信したら、後はAWS WAFコンソール側でちゃんとブロックされているかを確認するのみです。

AWSコンソール側でACLをクリックすると、右側にリクエストに関する画面が表示されます。上でグラフ、下でリクエスト一覧を確認できます。ただAWS WAFの画面に反映されるまで5分〜10分のタイムラグがあります。

グラフ:

リクエスト一覧[Sampled requests]:

送信されたテストリクエストが確認できれば、そのルールはちゃんと効いていることになります。

AWS WAFの限界

AWSの仕様で現在時刻から遡って3時間までのリクエスト情報しか保存してくれません。つまり、AWS WAFの画面をずっと見ていないと不正リクエストがあっても気付かず、3時間が経過するとその記録も消えてしまうわけです。これを回避するために、私たちはAWSのCloudWatchとSNS(Simple Notification Service)を用いて通知するように設定しています。設定方法については、次回の記事で紹介します。

まとめ

一般的なWAFサービスは、導入は楽ですが料金がやや高く、自由にカスタマイズできないというイメージです。一方AWS WAFは、導入や設定は全て自分でしなければなりませんが、その代わりに料金も自分でコントロールできます。またWAFの設定をすることでセキュリティ知識の勉強にもなります。AWSを使っているエンジニアならAWS WAFを導入することをお勧めしますよ。