Fastly Compute セキュリティ系機能 (1) Edge Rate Limiting の利用
この記事は Fastly Compute 一人アドベントカレンダー 2024 13 日目の記事です。
今年 Compute に追加された主な機能のうち、セキュリティ機能の概要について紹介するシリーズの第一回目です。本稿ではレート制限をサービスに簡単に追加できる Edge Rate Limiting について紹介します。
レート制限の実装サンプル
イメージを掴むためにまずコード例から見ていきます。公式のドキュメントでは Rust と Go のコードが記載されていますが、実はレート制限は JavaScript からも呼び出し可能なので、本稿では JavaScript のサンプルを紹介します。
const entry = event.client.address; // カウンタのエントリ(Key)
const delta = 1; // 一回当たりに増減するカウンタの値(通常 1 で良いと思いますが、何か事情があれば変更も可能)
const window = 10; // カウンタの値をチェックする範囲。単位は秒で、1, 10, または 60 のいずれかを指定
const limit = 100; // rps のリミット値
const timeToLive = 5; // カウントがどのくらいの期間ペナルティボックスに追加されるかの指定。単位は分。1分〜60分の間で指定
const blocked = erl.checkRate(entry, delta, window, limit, timeToLive);
let message = `lookupCount=${rc.lookupCount(entry,10)}, lookupRate=${rc.lookupRate(entry,10)}`;
let response;
if (blocked) {
response = new Response(`${entry} was blocked with: ${message}`)
} else {
response = new Response(`${entry} was not blocked with: ${message}`)
}
処理自体に難しい点はなさそうで、レート制限に引っ掛かるかどうかを checkRate()
関数呼び出しで判定しています。このとき、entry
がカウンタのエントリ(Key)を指定可能な引数となっており、公式のドキュメントではこの Key の指定としていくつか代表的な例が示されています。現実的には本稿のサンプルのような IP アドレスだけの指定よりも、もう少し他の条件を加えて Key を設定することも多いかと思うので、その際の Key 指定のイメージの例として挙げられています。
- IP アドレス
- IP アドレス + User Agent
- IP アドレス + カスタム HTTP ヘッダ
- IP アドレス + URL path
Fastly の Edge でのレート制限は POP 毎のカウントとなるため、例えば同じ日本国内でも関東の TYO と関西の ITM で受けたリクエストではそれぞれ別のレート制限のカウンタが利用されることに注意してください。
また、 lookupCount()
や lookupRate()
などのメソッドでカウンタの状態が確認ができるので、カウンタの値の変動幅や状態を見ながらブロックやアラート送出、ログ記録などの処理を追加することなども可能です。
参考資料
Fastly の公式ドキュメントとしては以下のサイトで詳しく解説されています。
また、以下はComptue サービスから Edge Rate Limiting を使った例ではないのですが、VCL で Edge Rate Limiting を使った事例や tips などについては以下のようなページでも紹介されており、基本的な動作理解や原理の部分で参考になる部分も多いかと思います。
まとめ
本稿では Fastly がセキュリティ機能として提供しているレート制限について、Compute サービスでの利用方法を中心に紹介しました。本稿で紹介したレート制限はDDoSやリスト型/総当たり型の攻撃など応用次第で様々な攻撃に対する多層防御の一環として利用が考えられると思いますが、有料の機能にはなるものの、わずか数行のコードをこのようなエッジコンピューティングのレイヤに追加するだけで手軽に防御層を追加できることは今後覚えておいても損はないかと思います。
次回はセキュリティの WAF ソリューションとして提供されている NGWAF を Compute から利用する方法について紹介します。
Discussion