はじめに
2019年にリリースされた後、数年を掛けてUpdateを繰り返しとても利用しやすくなったAWS WAF v2に関して運用面をメインとした話となります。
(このため、細かい設定内容等には触れずに話を進めます)
AWS WAF v2 リリース、アップデートの経緯
個人的にインパクトのあるUpdate/リリースをピックアップしました。
- 2019/11 AWS WAF v2 リリース
- 2021/3 カスタム応答のサポートを追加
https://aws.amazon.com/jp/about-aws/whats-new/2021/03/aws-waf-adds-support-custom-responses/ - 2021/4 ボットコントロールを発表
https://aws.amazon.com/jp/about-aws/whats-new/2021/04/announcing-aws-waf-bot-control/ - 2021/12 CloudWatch Log、S3バケットに直接ロギングする機能を追加
https://aws.amazon.com/jp/about-aws/whats-new/2021/12/awf-waf-cloudwatch-log-s3-bucket/ - 2022/6 Captcha 機能がGAに
https://aws.amazon.com/jp/about-aws/whats-new/2022/06/aws-waf-captcha-generally-available/ - 2022/9 ログフィルタリング機能の拡充
https://aws.amazon.com/jp/blogs/news/aws-waf-log-analysis-considerations/
目次
マネージドルールの選定
AWS WAF利用にあたり、どの場所へWAFを適用するかを決めた後に、どのようなルールを適用するか検討が必要となります。
私がこれまでに携わったプロジェクトで多かったのは、CoreRule、IP Reputation、SQL Injection対策及び、アプリケーション実行環境に応じて追加で幾つかのルールを適用するものでした。
また、APIの場合には追加費用が必要となるがBotControlを有効にしておく等です。
IPアドレスのホワイトリストでDev/Stg環境へのアクセスを絞ることは言わずもがなですね。
AWS マネージドルールのルールグループのリスト
https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/aws-managed-rule-groups-list.html
ウェブ ACL のデフォルトアクションの決定
https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/web-acl-default-action.html
WAFの試運用
WAFの設計・方針が決まると、いよいよ実装ですがまずは実際に防御が行われるBlockモードではなく、ロギングされるが防御はされないCountモードで試運用しましょう。
システム・アプリケーションテスト段階からCountモード、Blockモードでテスト出来ることがベストですが、そうではないケースも多々あると考えています。
特にリモートワーク環境ですとIP Reputationルールに引っ掛かってしまい、通信がBlockされる事も多いです。
anonymous-ip-list:HostingProviderIPList等
カスタムレスポンスについて
Countモードでは問題になりませんが、Blockモードにすると403ステータスコードが返却され始めます。
すべての開発者・インフラ担当者が標準設定のステータスコード403がWAF応答の可能性もある事に気づく事は難しいため、切り分けを迅速に行うためにもステータスコード・ヘッダをカスタムしておく事を強くお勧めします。
ログ分析の実施
ログの調査方法は下記のようなケースを想定し、事前に確立しておく必要があります。
- 実際にBlockモードへ移行するとどのアクセスがBlockされる(予定)かを確認
- ユーザからリクエストが上手くいかない報告があった場合のアクション
下記は、簡易的にCloudWatch Logs Insightsで実施する例となります。
より大量のログの場合はS3に保管しAthenaを活用する等が考えられます。
1 2 3 |
fields @timestamp | display @timestamp, httpRequest.uri, action, httpRequest.clientIp, terminatingRuleId | limit 100 |
- httpRequest.uri: URI
- action: BLOCK or ALLOW
- terminatingRuleId: どのルールでterminateされたか
上記クエリは最小限となりますので、あとは実際に表示されるエントリ内のどの項目をdisplayするか、絞り込むため filter するか等でクエリを調整していきます。
より実践的なクエリ、Metric化に関しては下記が参考になると思います。
Amazon CloudWatch Logs による AWS WAF ログの分析
https://aws.amazon.com/jp/blogs/news/analyzing-aws-waf-logs-in-amazon-cloudwatch-logs/
ログ保管上のコスト最適化について
運用が始まると、大量のログがCloudWatch Logs等に生成され始めます。
このため、ログのフィルタリング機能を活用し、必要なログのみを出力する事を設計段階から考慮する必要があります。
Count/Blockされたログのみをロギングする設定として下記のような設定が可能です。
※以前はマネジメントコンソールでは “EXCLUDED_AS_COUNT” のログをフィルタリングすることができない為、CLI などで設定する必要がありましたが、マネジメントコンソールでも “EXCLUDED_AS_COUNT” を設定できるようになりました。
まとめ
CloudWatch Log、S3バケットへの直接ロギング機能を始め、痒いところに手が届くようになったAWS WAF v2
WAFが必須要件のため、導入したいというご用件も沢山ご相談頂いております。
弊社ではAWS WAFを更に便利に、統計情報を見やすく運用するためのCyberNEOという製品のご用意がありますので、ぜひお気軽にご相談ください。
https://www.skyarch.net/profile/info/2019/191216.html
参考URL
Amazon CloudWatch Logs による AWS WAF ログの分析
https://aws.amazon.com/jp/blogs/news/analyzing-aws-waf-logs-in-amazon-cloudwatch-logs/
AWS WAF のログ分析に関する考慮事項
https://aws.amazon.com/jp/blogs/news/aws-waf-log-analysis-considerations/