AWS再入門2022 AWS WAF編
こんにちは、芦沢です。
当エントリは弊社コンサルティング部による『AWS 再入門ブログリレー 2022』の 18日目のエントリです。
このブログリレーの企画は、普段 AWS サービスについて最新のネタ・深い/細かいテーマを主に書き連ねてきたメンバーの手によって、 今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようというコンセプトが含まれています。
AWSをこれから学ぼう!という方にとっては文字通りの入門記事として、またすでにAWSを活用されている方にとってもAWSサービスの再発見や2022年のサービスアップデートのキャッチアップの場となればと考えておりますので、ぜひ最後までお付合い頂ければ幸いです。
では、さっそくいってみましょう。18日目のテーマは『AWS WAF』です。
はじめに
本エントリでは、以下の項目について取り上げます。
- AWS WAF(v2)について
- 各種リソースについての解説
- 利用開始までの道のり
- 利用料金
以下のような項目については、触れません。
- 一般的なWAFについて
- AWS WAFv1・v2の違い
このあたりについて気になる方は、以下エントリを参考にしてください。
本エントリはAWS WAF v2を前提に内容を記載しています。AWS WAF Classic(v1)では対応していない部分が含まれていますので、ご承知おきください。
AWS WAFとは?
AWS WAFとはAWSが提供するWAF(Web Application Firewall)です。
以下のAWSサービスに対するHTTP(S)リクエストを監視することができます。
- Amazon CloudFront
- Amazon API Gateway
- Application Load Balancer
- AWS AppSync
AWS WAF公式サイトより、AWS WAFを使用するメリットは以下です。
- ウェブ攻撃に対する俊敏な保護
- 簡単なデプロイとメンテナンス
- マネージドルールにより時間を節約する
- ボットの監視、ブロック、リミット制限が簡単に
- 向上したウェブトラフィック可視性
- アプリケーションの開発方法に統合されたセキュリティ
上記とは別に、AWS WAFはAWSマネージドサービスであることから、サーバレスで使用できる信頼性やスケーラビリティに優れたWAFであることも使用するメリットですね。
各種リソースについての解説
本章では、AWS WAFを構成する各種リソースについて説明します。
Web Acl
Web Aclは、AWS WAFを利用を始める際に最初に作成することになるリソースです。
Web Aclに関連付けされたAWSサービスが保護対象となり、Web Aclの配下に作成したルールやルールグループが保護対象リソースのアクセス制御の評価基準となります。
Web Aclを作成するときに、考慮する必要がある項目として代表して以下の4つを挙げました。
- リソースタイプ
- デフォルトアクション
- サンプルリクエスト
- ログ出力設定
- WCU(WebAclキャパシティーユニット)
それぞれ説明していきます。
リソースタイプ
リソースタイプはWeb Aclで保護対象として関連付けするAWSサービスの種類を定義します。
以下の2種類存在します。
- CloudFront distributions
- Regional resources
簡単にいうと、CloudFront用のWeb Aclなのか、リージョナルリソース(CloudFront以外)用のWeb Aclなのか、をここで定義しています。
Regional resourcesを選んだ場合はWeb Aclを配置するリージョンも指定する必要があり、指定したリージョン以外のAWSサービスを保護することはできません。
CloudFront distributionsを選んだ場合は、リージョン指定は不要です1。全リージョンのCloudFront distributionを保護対象に指定することができます。
デフォルトアクション
デフォルトアクションは後述するルールにより評価されなかったアクセスをどのように処理するか、を指定します。
以下、2種類から選択できます。
- ALLOW
- BLOCK
どちらを選ぶべきかはWAFの設計思想に準拠します。
- ALLOWを選択する場合は、基本的に保護リソースに対するアクセスはすべて許可されていて、ルールで定義された条件に合致するアクセスのみを遮断します。いわゆる
ブラックリスト
のWAFが必要な場合はこちらを選びます。 - BLOCKを選択する場合は、基本的に保護リソースに対するアクセスはすべて遮断されていて、ルールで定義された条件に合致するアクセスのみを許可します。いわゆる
ホワイトリスト
のWAFが必要な場合はこちらを選びます。
サンプルリクエスト
サンプルリクエストとは、過去3時間以内の保護対象リソースに対するリクエストをAWSマネジメントコンソール上に表示させる機能です。
このようにリクエスト履歴が確認できます。
本オプションの利用料金は無料なので、問題がなければ有効にしておきましょう。
ログ出力設定
WebAclのログは以下のAWSサービスへ送信することができます。
- CloudWatch Logs
- S3
- Kinesis Firehose
以前はログをCloudWatchLogs、S3へ出力するためにKinesis Firehoseを経由する必要がありましたが、2021年11月のアップデートで直接出力することができるようになりました。
保存したログはそのままだと読みづらいので、CloudWatch Logs InsightやAmazon Athenaを利用して、ログ分析を行なって確認することをオススメします。
また、原則ログは全て保存する方針で問題ないと考えますが、保存するログサイズに制約がある場合は、出力するログをフィルタして保存するログを限定することもできます。
ブロックされたログのみ、カウントされたログのみ、などのフィルタ方法があります。
ログをフィルタした場合は分析する際、取りこぼさないように気をつけましょう。
WCU(WebAclキャパシティーユニット)
AWS WAFは、ルールやルールグループ、Web Aclを実行する際に必要なOSリソースを計算し制御しますが、WCUはその制限を表しています。
処理能力をあまり必要としない単純なルールであればWCUは少なく、処理能力がより必要な複雑なルールであればWCUは多いです。
例えば、以下のようなルールであれば、このようなWCUになります。
- 特定のIPセットからの通信を許可するルール = 1WCU
- ウェブアプリケーションに一般的に適用可能なルールが含まれているAWSマネージドルール
Core rule set
= 700WCU
デフォルトのWCUの制限は、1500WCU(WebAcl毎に)ですが、AWSマネジメントコンソールのServices Quotas
からAWSへWCUの引き上げを申請することで上限緩和することが可能です。
WCUの上限引き上げについては以下ブログが参考になります。
以上、WebAclについてでした。
ルール
AWS WAFにおけるルールとは、Web Aclがアクセスを評価する基準を意味します。
ルールを使用すると、次のような基準に基づいて HTTP (S) ウェブリクエストを検査し、処理する方法を定義します
- クロスサイトスクリプティング(XSS)のような悪意のある可能性が高いスクリプト。
- リクエストの発生元の IP アドレスまたはアドレス範囲。
- リクエスト送信元の国または地理的場所。
- クエリ文字列など、リクエストの指定した部分の長さ。
ルールには優先順位が存在し、Web Aclはリクエストに対し優先順位が上位のルールから評価します。
ルールアクション
ルールにはルールアクションという、ルールで定義した条件と一致した場合にリクエストをどのように処理するか、を指定するパラメータがあります。
ルールアクションには以下の4つがあります。
- カウント(COUNT)
- リクエストをカウントしますが、リクエストを許可するかブロックするかは決定しません。
- 許可(ALLOW)
- リクエストを許可します。
- ブロック(BLOCK)
- リクエストをブロックします。
- CAPTCHA
- リクエストに対して CAPTCHA チェックを実行します。
カウント、許可、ブロックについては記載の通りですが、CAPTCHAについては以下アップデートブログがわかりやすくまとまっています。
ルールアクションにはそれぞれ基本的な振る舞いが設定されています。
- 終了アクション(terminating actions)
- このアクションが評価された場合、以降の優先順位が下位の評価を停止します。
- 非終了アクション(non-terminating actions)
- このアクションが評価されても、以降の評価を続けます。
各アクションがどの終了アクションに対応しているかは、以下表をご確認ください。
アクション名 | 終了アクション | 備考 |
---|---|---|
COUNT | non-terminating actions | |
ALLOW | terminating actions | |
BLOCK | terminating actions | |
CAPTCHA | non-terminating actions or terminating actions |
CAPTCHAトークンの有無で終了アクションが変化します |
また、必要に応じて各ルールのアクションにカスタムアクションを設定することも可能です。
例えば、カウント時にカスタムヘッダを挿入する、のようなものです。
以上、ルールについてでした。
ルールグループ
ルールグループとはWeb Aclに追加できる再利用可能なルールのセットです。
ルールグループには以下の2種類存在します。
- マネージドルールグループ
- 独自ルールグループ
それぞれ説明します。
マネージドルールグループ
マネージドルールグループは、AWSが作成・管理するルールグループや、AWS Marketplaceで販売する事業者が作成・管理するルールグループのコレクションです。
AWS提供のマネージドルールグループは一部を除き無料で使用できるルールグループです。(AWS WAFの通常利用料金は必要です)
AWS Marketplaceで販売されているマネージドルールグループは、Marketplace経由でサブスクリプションを購入し、利用することができます(AWS WAFの通常利用料金と別でサブスクリプション購入が必要です)
マネージドルールグループの特徴は以下の2点です。
- 自動更新
- AWSマネージルールグループは、それぞれの管理者によって定期的に自動更新されます。自動更新されないように明示的にバージョンを指定することも可能です。
- マネージドルールグループ内のルールに対するアクセス制限
- 利用者はマネージドルールグループ内のルールの詳細を確認することはできません。
例として、AWS提供のマネージドルールグループの一例を挙げます。
- Core rule set (CRS)
- OWASP Top 10 などの多くの高リスクで一般的に発生する脆弱性を含む、Webアプリケーションに一般的に適用可能なルールが含まれています
- Known bad inputs
- 無効であることが分かっている、脆弱性の悪用や発見に関連するリクエストパターンをブロックするルールが含まれています
- Admin protection
- 公開された管理ページへの外部からのアクセスをブロックするためのルールが含まれています
参考までに、AWS提供のマネージドルールグループ一覧のリンクを貼っておきます。
独自ルールグループ
ユーザー独自で作成するルールグループです。
作成したルールグループにはWeb Aclと同様にルールを追加できます。
グループの作成時には、変更不可のWCUの最大容量を指定する必要があります。
以上、ルールグループについてでした。
利用開始までの道のり
アクセスのブロックを伴うルールを設定する場合、AWS WAFを利用開始するためにいくつかのステップを踏む必要があります。
その解説を本章では実施します。
以下のステップでWAF利用を開始します。
- 1 AWS WAFリソースを構築する
- 2 カウントモードで運用する
- 3 ブロックモードへの切り替え
1. AWS WAFリソースを構築する
まず、WebAcl、ルールグループ、ルール、などのリソースを作成し、WAFのトラフィックログを出力する設定を完了させてください。
作成する際に、Web AclのデフォルトアクションはAllow、ルールやルールグループのアクションはCountに設定してください。
以下ブログではAWS WAFをCloudFormationテンプレートで作成している例を紹介しています。参考にしてみてください。
2. カウントモードで運用する
作成したWeb Aclへ保護対象のリソースを関連付けします。
この際、Web Aclやルールの設定がリクエストをブロックする設定になっていると、正常なリクエストをブロックしてしまうWAFの誤検知
が発生する可能性があります。
まずはリクエストをブロックしない状態(=カウントモード)で運用を開始します。
カウントモードでは、リクエストのブロックは発生しませんが、ブロックされるリクエストがあった場合、ログにカウントされたと記録されます。
運用を開始して数営業日経った後に、ログを分析し、カウントされているリクエストがないか確認してください。S3にログを出力した場合のログ分析方法は以下リンクで解説されています。
カウントされているリクエストがあったら、ルールを修正もしくは追加し誤検知する正常のアクセスがなくなるように調整してください。
3. ブロックモードへの切り替え
正常なアクセスがすべてカウントされないようになったら、ブロックモードへ切り替えます。
必要に応じてWeb Aclのデフォルトアクションや、ルール、ルールグループのアクションをBlockへ変更してください。
切り替え後、正常アクセスが誤検知されなければWAFの導入は完了します。
利用料金
続いて、AWS WAFの利用料金について説明します。
AWS WAFの利用料金は、以下の式で表現できます。
WebAclの数(WebAcl1つあたり5.00USD/月) + ルールの利用料金(ルール1つあたり1.00USD/月) + リクエスト数(100万アクセスあたり0.60USD)
WebAcl:1つ、ルール:5つ、リクエスト数:200万
の場合、11.20USDが利用料金として請求される見込みです。とても安いですね。
(1 * 5.00USD) + (5 * 1.00USD) + (2 * 0.60USD) = 11.20USD
最後に
以上、『AWS再入門ブログリレー2022』の18日目のエントリ『AWS WAF』編でした。
次回(3/1(火))の大前さんの「Global Accelerator」もお楽しみください!
- IAMのような一般的なグローバルリソースと同じく、us-east-1(N.Virginia)にリソースが作成されます。 ↩