API Shield のシーケンスカスタムルールは、設定した API Shield の セッション識別子 を使い、ユーザーが行ったリクエストの順序とリクエスト間の時間を追跡し、Cloudflare Rules で利用できるようにします。有効または無効なシーケンスに一致するルールを書けます。
これらのルールは cookie sequence rules に似ていますが、前提条件が異なります。
- API Shield で セッション識別子 を設定する必要があります。
- セッション識別子が必要なため、セッション識別子で個々のユーザーに明確に紐づけられるトラフィック(認証済みトラフィック)でのみ使えます。
- Cloudflare はユーザーステートを Cookie ではなくメモリに保存するため、セッションのシーケンスの有効期間は 10 分です。
- シーケンスシステムを有効にするには、API sequence rule を少なくとも 1 件設定する必要があります。
これらのカスタムルールで作るルールは、API または Cloudflare ダッシュボード で設定できるシーケンスルールと同様で、同じ基盤技術を使います。ただし、記録したシーケンスの上に自由形式のロジックを使え、rulesets が提供する応答オプションすべてにアクセスできるため、柔軟性が高くなります。
これらのシーケンスフィールドは、次で利用できます。
- カスタムルール(
http_request_firewall_customフェーズ) - レート制限ルール(
http_request_ratelimit) - Bulk Redirects(
http_request_redirect) - Request Header Transform Rules(
http_request_late_transform)
| フィールド名 | 説明 | 値の例 |
|---|---|---|
| 現在のリクエストに一致するオペレーションの ID です。Endpoint Management で定義したどのオペレーションにも一致しない場合は、空文字列になります。 |
|
| シーケンス内の直前までのオペレーション ID の配列です。新しい順に並びます。現在のリクエストは含まれません。 |
|
| キーがオペレーション ID、値がそのオペレーションが直近で発生してからのミリ秒数であるマップです。 |
|
-
Cloudflare ダッシュボードで Security rules ページを開きます。
Security rules を開く ↗ -
空のルールを新規作成するには、Create rule > Custom rules を選びます。
-
Rule name に、ルールの内容が分かる名前を入力します。
-
When incoming requests match で、Field のドロップダウンから Sequences で絞り込み、次のいずれかを選びます。
- Current Operation
- Previous Operations
- Elapsed time
-
Value で編集アイコンを選び、Builder を使ってサイドパネルでシーケンスを組み立てます。
-
Select a hostname for this sequence で、ドロップダウンからすべて、または特定のホスト名を選びます。任意で、検索バーから特定のホスト名を検索できます。
-
Methods のドロップダウンから、すべてのメソッド、または特定のリクエストメソッドを選びます。
-
シーケンスに含めたい順に、各エンドポイントのチェックボックスを選びます。
-
完了までの時間を設定します。
-
Save を選びます。
-
Then take action で、Choose action のドロップダウンからルールのアクションを選びます。たとえば Block を選ぶと、指定した条件に一致するリクエストを Cloudflare が拒否します。
-
(任意)Block アクションを選んだ場合は、カスタムレスポンスを設定できます。
-
Place at で、ルールを実行する順序を選びます。
-
ルールを保存してデプロイするには、Deploy を選びます。まだデプロイしない場合は、Save as Draft を選びます。
保存した各エンドポイントには、Endpoint Management の詳細ページで UUID 形式のエンドポイント ID が表示されます。以下の参照(aaaaaaaa、bbbbbbbb、cccccccc)は、エンドポイント ID の先頭 8 文字です。
訪問者は、エンドポイント aaaaaaaa をリクエストしたあと、エンドポイント bbbbbbbb をリクエストするまで 2 秒以上待つ必要があります。
cf.sequence.current_op eq "bbbbbbbb" and
cf.sequence.msec_since_op["aaaaaaaa"] ge 2000訪問者は、エンドポイント aaaaaaaa、次に bbbbbbbb、次に cccccccc を、この順序でリクエストする必要があります。
cf.sequence.current_op eq "cccccccc" and
cf.sequence.previous_ops[0] == "bbbbbbbb" and
cf.sequence.previous_ops[1] == "aaaaaaaa"訪問者は、エンドポイント bbbbbbbb の前にエンドポイント aaaaaaaa をリクエストする必要があります。ただし、エンドポイント aaaaaaaa は直近 10 件のリクエストのどこにあっても構いません。
cf.sequence.current_op eq "bbbbbbbb" and
any(cf.sequence.previous_ops[*] == "aaaaaaaa")訪問者は、エンドポイント bbbbbbbb の前にエンドポイント aaaaaaaa をリクエストするか、エンドポイント bbbbbbbb の前にエンドポイント cccccccc をリクエストする必要があります。
(cf.sequence.current_op eq "bbbbbbbb" and
any(cf.sequence.previous_ops[*] == "aaaaaaaa")) or
(cf.sequence.current_op eq "bbbbbbbb" and
any(cf.sequence.previous_ops[*] == "cccccccc"))