AWS WAFを簡単に設定するCloudFormationのテンプレート

AWS運用自動化サービス「Cloud Automator」
この記事は1年以上前に書かれたものです。
内容が古い可能性がありますのでご注意ください。

はじめに

AWS WAFをつかってみたいけど、設定が面倒くさいと思っているそこの貴方に、朗報です。
流すだけで、AWS WAFのいい感じの設定がされるCloudFormationのテンプレートが提供されています。

AWS WAFの概要

AWSでは、WEBアプリケーションファイアウォール機能(AWS WAF)が提供されており、CloudFrontもしくはALBに適応して使用することができます。
通常、手動でAWS WAFを構成する場合、conditionとアクションを組み合わせたRulesをユーザ自身が構成し、Web ACLと呼ばれる適応単位を作っていく必要があります。
AWSから、この構成を自動化し、さらに「AWS WAF セキュリティオートメーション」と呼ばれるCloudFormationテンプレートが提供されています。

AWS WAF セキュリティオートメーションの概要

AWSの公式ページに説明がありますので、こちらをご覧ください。

展開

CloudFormationテンプレートの入手

こちらで2種類が提供されています。

  • aws-waf-security-automations.template
    • CloudFront用のテンプレートです。
  • aws-waf-security-automations-alb.template
    • ALB用のテンプレートです。

なお、テンプレートとは別に、AWS WAFを適応するCloudFrontもしくはALBは、構築する必要があります。

展開手順の概要

こちらに記載があります。
ここではポイントだけ記載します。

Step 1. Launch the Stack

テンプレートを展開する途中で、以下の画面で、使用する機能と、アクセスログの格納S3バケット、機能に必要な閾値を入力します。


機能に必要な閾値は以下のとおりです。

Request Threshold

ログ解析(HTTP Flood Protection) を使用する場合に、1ソースIPアドレスから許容する分間リクエスト数を指定します。

Error Threshold

ログ解析(Scanner & Probe Protection) を使用する場合に指定する、1ソースIPアドレスから許容する分間エラーリクエスト数を指定します。

WAF Block Period

ログ解析(HTTP Flood Protection,Scanner & Probe Protection) を使用する場合に指定する、対象となったIPアドレスからの通信をブロックし続ける時間(分)を指定します。

Step 2. Modify the Whitelist and Blacklist Sets(Optional)

手動でホワイトリスト、ブラックリストを設定したい場合は、
AWS WAFのIP match conditionsのリスト(Whitelist Set/Blacklist Set)に手動登録します。

Step 3. Embed the Honeypot Link in Your Web Application (Optional)

ハニーポット機能を使いたい場合は、エンドポイントURLをコンテンツに埋め込みます。詳細は上記手順を参照してください。

Step 4. Associate the Web ACL with Your Web Application

CloudFrontもしくはALBにAWS WAFを適応します。AWS WAFのコンソールから、WebACLを選択し、RulesタブのAdd Associationで、対象を選択します。

Step 5. Configure Web Access Logging

CloudFrontもしくはALBのアクセスログを、展開時に指定したS3バケットに出力されるよう設定します。

提供される機能とその実装の概要

 SQL インジェクション保護(SQL Injection Protection)

AWS WAFにCross-site scripting match conditionsの設定(SQL injection Detection)が追加されます。設定内で定義されるFilterは以下のとおりです。

  • Body contains SQL injection threat after decoding as HTML tags.
  • Body contains SQL injection threat after decoding as URL.
  • Query string contains SQL injection threat after decoding as HTML tags.
  • Query string contains SQL injection threat after decoding as URL.
  • URI contains SQL injection threat after decoding as HTML tags.
  • URI contains SQL injection threat after decoding as URL.

この設定が、 SQL Injection RuleというRuleで定義され、Web ACL内で拒否設定がされます。

クロスサイトスクリプト保護(Cross-site Scripting Protection)

AWS WAFにCross-site scripting match conditionsの設定(XSS Detection Detection)が追加されます。設定内で定義されるFilterは以下のとおりです。

  • Body contains a cross-site scripting threat after decoding as HTML tags.
  • Body contains a cross-site scripting threat after decoding as URL.
  • Query string contains a cross-site scripting threat after decoding as HTML tags.
  • Query string contains a cross-site scripting threat after decoding as URL.
  • URI contains a cross-site scripting threat after decoding as HTML tags.
  • URI contains a cross-site scripting threat after decoding as URL.

この設定が、 XSS RuleというRuleで定義され、Web ACL内で拒否設定がされます。

ログ解析(HTTP Flood Protection,Scanner & Probe Protection)

HTTPフラッド攻撃に対する保護とスキャン、Scanner & Probe保護機能が提供されます。
CloudFrontあるいはALBのログを出力するS3バケットに、Call Log Parserというイベントが追加されます。
バケット内にログが出力されると、LambdaWAFLogParserFunctionという名前がついたLambda関数が起動し、ログを解析しLambda関数の環境変数として
定義されている(Request Threshold/Error Threshold)閾値をもとに、閾値を超えるリクエストを送信したIPアドレスを、AWS WAFのIP match conditionsのリスト( Auto Block Set)に追加します。
このリストは、Auto Block RuleというRuleで定義され、Web ACL内で拒否設定がされますので、当該IPアドレスからの通信はブロック(403 Forbidden)されます。
また、一定期間(WAF Block Period)として定義した時間を超えると、リストからIPアドレスが削除されます。
これらの閾値は、前述のとおり、CloudFormationテンプレートの展開時に指定可能となっています。
なお、今年の6月にリクエストレートによるルールが作成できる機能が標準で提供されるようになりましたので、HTTPフラッド攻撃対策としては、そちらを使ったほうがよいかもしれません。

IP リスト解析(Reputation List Protection)

以下の3つのレピューテーション情報を1時間に1回チェックし、リストされているIPアドレスを、 AWS WAFのIP match conditionsのリスト(IP Reputation Lists Set #1,#2)に追加する
Lambda関数(LambdaWAFReputationListsParserFuncti)が構成されます。
このリストは、WAF IP Reputation Lists Rule #1,#2というRuleで定義され、Web ACL内で拒否設定がされますので、当該IPアドレスからの通信はブロック(403 Forbidden)されます。

ハニーポット(Bad Bot Protection)

API GatewayとLambdaを組み合わせて実装されます。API Gatewayで提供されるURL(エンドポイント)を、WEBサイトのページ内に不可視の状態で埋め込み、そのURLにアクセスしたきた送信元IPアドレスが、
Lambda関数(LambdaWAFBadBotParserFunction)によって、AWS WAFのIP match conditionsのリスト(IP Bad Bot Set)に追加されます。
このリストは、Bad Bot RuleというRuleで定義され、Web ACL内で拒否設定がされますので、当該IPアドレスからの通信はブロック(403 Forbidden)されます。
また、一定期間(WAF Block Period)として定義した時間を超えると、リストからIPアドレスが削除されます

手動 IP リスト

AWS WAFのIP match conditionsのリストが2つ作成されます。(Whitelist Set/Blacklist Set)
AWS WAFの評価を回避したい場合は、当該送信元IPアドレスを、Whitelist Setに手動登録することで実現可能です。
また、AWS WAFによって通信を拒否したい場合は、Blacklist Setに当該送信元IPアドレスを、Whitelist Setに手動登録することで実現可能です。

まとめ

AWS WAF セキュリティオートメーションとして提供されているCloudFormationテンプレートを使用することで、AWS WAFの設定を自動的に構成することができます。
構成時に、必要な機能のみ選択できるのも便利ですし、基本的な機能に加え、レピュテーションデータベースをもとにしたブロックも簡単に実現できる点も利点かと思います。

近日中に、「『an・an』でセキュリティ男子特集が組まれること」 になるらしいので、このテンプレートでAWS WAFを構成しまくりセキュリティ男子と呼ばれたいと思います。
ではでは。

AWS運用自動化サービス「Cloud Automator」