ちょっと話題の記事

AWS WAF を急に導入することになったときに参考にした資料まとめ

調べる時間がなくて、まとまっているものが欲しかったので作りました。
2022.04.09

急ぎのご依頼で AWS WAF の導入を支援をする機会がありました。本当に急な話だったので準備する時間もなく必要な設定の資料を都度見繕っていたので、また急に依頼されたときに備えて今回の対応で必要だった資料をまとめます。

AWS WAF を急に設定することになったあなたへ向けの記事です。

応急処置として以下の構成に AWS WAF を急遽導入することになったときのお話です。

状況と対応内容

Webサイトに不正なアクセスを受けていることがわかり、AWS WAF を導入して急場を凌ぎたい。

  • WordPress が起動している(Webサイトを提供しているサービス)
  • 不正なアクセスはCloudFront経由と、Classic Load Blancerから直接の2パターン確認されている

Classic Load Blancer には AWS WAF を設定することはできないため、CloudFront からのアクセスのみに限定し、CloudFront に AWS WAF を設定する方針にしました。

セキュリティグループの設定見直し

AWS WAF を CloudFront に設定する予定ですので CloudFront 経由のアクセスに限定させたいです。2022年2月のアップデートで CloudFront の IP レンジのリストをセキュリティグループのソースに指定できるようになりました。CloudFront の IPレンジは AWS がメンテナンスしてくれるので使い勝手がよいですね。

今回の対応では CLB のセキュリティグループの設定を変更し、CloudFront からのアクセス限定しました。

AWS WAF の設定

CloudFront 配下の Class Load Blancer だったため CloudFront に AWS WAF を設定します。この先は作業時、お客様へ案内、参考にしたリンクをまとめて紹介します。

ルール設定

AWS マネージドルールは AWS がメンテナンスしている一般的なアプリケーションの脆弱性保護するルールが数種類提供されています。保護対象のシステムに応じたルールを選定します。各ルールの詳細は以下のドキュメントをご確認ください。

AWS Managed Rules rule groups list - AWS WAF, AWS Firewall Manager, and AWS Shield Advanced

今回は WordPress を保護するために暫定で以下のマネージドルールを設定しました。

  • Core rule set
  • Known bad inputs
  • SQL database
  • Linux operations system
  • PHP application
  • WordPress

Web ACL のキャパシティについて

ルールごとにコストみたいなもの(WCUs: Web ACL rule capacity Units)を持っています。全ルールを追加するとコストオーバーになり設定できません。通常設定する場合は1500 WCUs 以内に納まるようにルールを選定する必要があります。

上限を引き上げることもできますが、今すぐに上限が緩和されるというわけではありません。詳細は以下のリンクをご参照ください。

レートベースルールの設定

一定期間の間に同一 IP アドレスから一定数のアクセスがあった場合にアクセスを拒否するルールはマネージドルールとは別ものです。詳細は以下のリンクを参照ください。

コスト削減のため WebACL を複数のリソースで共有することもあります。注意点はレートベースのルール単位でレートミットが合算されます。リクエスト先のリソースや、パスごとに分けて判別はしてくれないため、単一のレートベースルールを複数リソースで WebACL を共有する場合は とくに以下ののリンクをご確認ください。

今回はご要望にあったため、マネージドルール + レートベースルールを設定しました。

ログの保存

WAF のアクセスログはデフォルトでは保存されないため S3 バケットか、CloudWatch Logs へ保存する設定を入れましょう。詳細は以下のリンクを参照ください。リアルタイムにログの確認が必要でなければ S3 バケットに保存でよろしいかと思います。

アクセスログのフィルタリング

正常なアクセスのログは保存する必要がないときは以下のリンクを参考にフィルタリングの設定を入れます。

  • CloudFrontや、ALB、Webサーバー(Nginx, Apatchなど)のログから確認できるので不要と判断したとき
  • 正常なアクセスログ(Allow)はログ保存コストを抑えるために不要と判断したときなど

また、ログをフィルタリングした上でマネージドルールを設定している場合は追加の設定を以下のリンクを参考に入れましょう。すべてのCOUNT相当のログが取り切れていない可能性があります。

上記の設定は AWS CLI から追加するのですが、結果はマネジメントコンソールからも確認できます。COUNT/BLOCKのログのみ保存したいフィルタ設定の最終形は以下のキャプチャを参考にしてください。

設定時の失敗例

ログフィルタリングの設定がうまくできなかったときの事例です。

マネージルールの許可/ブロックの切り替え方法

カウントモードで導入してからブロックモードに切り替えるのが一般的な導入方法です。

運用について

非常によくまとまっておりますので以下のリンクをご確認ください。

S3 バケットに保存した WAF のアクセスログは Athena を使って分析することが多いです。設定方法や、クエリのサンプルも載っておりますので以下のリンクをご参照ください。

Tips

グローバルIPのホワイトリスト

自社からのアクセスがCOUNT/BLOCKされてしまうときや、特定のグローバル IP アドレスからの接続は通したいといったときは IP のホワイトリストを作成して簡単に対応できます。ポイントはルールの優先度を他のルール(マネージドルールとか)より高くする必要があります。

HostingProviderIPListでAWSのIPがブロックされる

マネージドルールの Anonymous IP List の HostingProviderIPList ルールは AWS で利用されている IP もCOUNT/BLOCKされます。保護対象のシステムが意図的に AWS 上のシステムからメンテナンスなどでアクセスするようなことがあれば特定のグローバル IP は除外することができます。

その他

「なにかCOUNTのログ残らないかな、そわそわ」というときは以下のリンクを参考に悪そうなリクエストを発生させてみてください。

さいごに AWS WAF の基本的な知識は以下のリンクをご確認いただければ学べるかと思います。

おわりに

Classic Load Blancer の存在で察するかと思いますが、古くから稼働している Web サイトでした。今回の対応はあくまでも応急処置です。今後、恒久対応は別途対応予定です。

本件のお客様は「AWS WAF というサービスは知っているけど使ったことはない」という状態からはじまりました。同様のケースは本記事リンクを参考にしていただければ概ね欲しい情報が手に入るのではないかと思いまとめました。

今回は連絡いただいてから急ぎ導入支援することになりましたが、DevelopersIO の記事を案内すれば設定は終わりました。素晴らしい情報発信の数々にいつも感謝です。