AWS WAF のレートベースルールを試してみた

Posted on

freee の開発チームは、ユーザーに安心して使っていただけるよう様々なセキュリティ対策を行なっています。 SRE チームも例外ではなく、セキュアなインフラを提供できるように日々努力しています。

その一環で、先月リリースされた AWS WAF のレートベースルールを検証しました。このレートベースルールを使えば、DDoS 攻撃やブルートフォース攻撃、パスワードリスト攻撃を自動的に遮断できます。

設定方法は Developers.IO の記事が詳しいので、そちらをご覧ください。

レートベースルールとは

AWS WAF のよくある質問から引用します。

レートベースのルールは、AWS WAF で設定できる新しいタイプのルールです。この機能を使用すると、継続的に更新される最後の 5 分間に、クライアント IP に許可するウェブリクエストの数を指定できます。 IP アドレスが設定された制限を超えた場合、新しいリクエストはリクエストレートが設定されたしきい値を下回るまでブロックされます。

これまで AWS WAF で動的にルールを変更するには、Lambda でアクセスログを分析して閾値を超えたらブラックリストに追加するといった仕組みを自分で作る必要がありました。 AWS WAF のチュートリアルにもそのやり方が紹介されています。

リクエストの制限を超えた IP アドレスのブロック

ただ、このやり方はピタゴラスイッチ感が強くて、AWS に詳しくないエンジニアには学習コストが高すぎます。レートベースルールは、この面倒な仕組みから解放してくれます。

レートベースルールの仕様

レートベースルールの仕様を箇条書きでまとめると次のようになります。

  • 設定できるのは CloudFront と ALB
    • CLB は対象外(レートベースルールに限らず CLB は AWS WAF が使えない)
  • 既存の条件と組み合わせることができる
    • レートベースルール + ユーザーエージェントの一致といったことができる
  • 直前 5 分間のアクセスを評価して閾値(最小値は 2000)を超えたらトリガーされる
    • 閾値が 2000 だとある程度の攻撃を受けることになるので、もっと小さい値を設定できるように改善してほしい
  • ブラックリストに追加された IP アドレスが閾値を下回ったら自動的に解除される
  • ブロックされたクライアントには 403 Forbidden が返される
    • クライアントからは CloudFront / ALB が 403 を返したように見えるので、AWS WAF を使っていることはわからない
    • バックエンドサーバの前段で遮断してくれるので、攻撃を受けたときにサーバ負荷を最小限に抑えられる

Deep Security のようなサーバにインストールするタイプの WAF とは違い、サーバに到達する前に遮断できるのが大きなメリットです(Deep Security は他にも豊富な機能があるので単純には比較できません)。

ブロックされたことを通知する

AWS WAF のメトリクスは CloudWatch に連携されています。ブロックした場合は BlockedRequests というメトリクスに登録されるので、その値を監視して CloudWatch アラームを設定すると良さそうです。

BlockedRequests の CloudWatch アラーム

攻撃を受けていないときは値がないので Treat missing data as good にしておきましょう。

まとめ

AWS WAF は非常に低コストで使えるので、サービスの規模に関わらず、とりあえず入れておくと良さそうです(AWS WAF にはブロックせずにカウントするだけというアクションも選べます)。

また、freee ではセキュリティエンジニアも募集していますので、興味のある方は @manabusakai までお声がけください!