Google Cloud Armor の レートリミットを適用したいので調べる

CloudflareのIPアドレスでブロックすることを避けたい
前段に Cloudflare を挟んでいるので、「クライアント」の識別がIPアドレスだけだとするとレートリミットは設定できない。
いっぱいありそう。
- ALL: リクエストがルールの一致条件を満たすすべてのクライアントの単一キー。
- IP: リクエストがルールの一致条件を満たすクライアントの送信元 IP アドレスごとに一意のキー。
- HTTP_HEADER: 名前が構成された一意の HTTP ヘッダー値ごとに一意のキー。キー値は、ヘッダー値の最初の 128 バイトに切り詰められます。このようなヘッダーが存在しない場合や、外部プロキシ ネットワーク ロードバランサでこのキータイプを使用する場合、キータイプはデフォルトで ALL になります。
- XFF_IP: クライアントのオリジナルの送信元 IP アドレス(X-Forwarded-For HTTP ヘッダーに指定された IP のリストで最初の IP アドレス)ごとに一意のキー。このようなヘッダーが存在しない場合、値が有効な IP アドレスではない場合、または外部プロキシ ネットワーク ロードバランサでこのキータイプを使用する場合、キータイプはデフォルトで IP アドレスになります。
- HTTP_COOKIE: 名前が構成された各 HTTP Cookie 値の一意のキー。キー値は、Cookie 値の最初の 128 バイトに切り詰められます。このような Cookie が存在しない場合や、外部プロキシ ネットワーク ロードバランサでこのキータイプを使用する場合、キータイプはデフォルトで ALL になります。
- HTTP_PATH: HTTP リクエストの URL パス。キー値は、最初の 128 バイトに切り詰められます。
- SNI: HTTPS リクエストの TLS セッションでの Server Name Indication。キー値は、最初の 128 バイトに切り詰められます。HTTP セッションの場合、キーのタイプはデフォルトで ALL になります。
- REGION_CODE: リクエスト送信元の国 / リージョン。
- TLS_JA3_FINGERPRINT: JA3 TLS/SSL フィンガープリント(クライアントが HTTPS、HTTP/2、または HTTP/3 を使用して接続している場合)。利用できない場合、キーのタイプはデフォルトで ALL になります。JA3 の詳細については、ルール言語リファレンスをご覧ください。
- USER_IP: 送信元クライアントの IP アドレス。userIpRequestHeaders で構成されたヘッダーに含まれ、値はアップストリーム プロキシによって入力されます。userIpRequestHeaders 構成がない場合、または IP アドレスを解決できない場合、キーのタイプはデフォルトで IP になります。詳細については、ルール言語リファレンスをご覧ください。
具体的な値の例がほしいですね…。
フォールバックされて IP
になりうるものは却下。CloudflareのIPがご判定されてしまうかのせいがあるため。
ALL ってなに?
原文見てみる:
ALL: A single key for all clients whose requests satisfy the rule match condition.
やはりわからない。
SNI?
TLSレイヤのサーバー名。
SNIはServer Name Indicationの略ですが、SNIが実際に「示す」のは、Webサイトのホスト名またはドメイン名であり、実際にドメインをホストしているWebサーバーの名前とは異なる場合があります。実際、複数のドメインが1つのサーバーでホストされることは一般的です。この場合、それらは仮想ホスト名と呼ばれます。
サーバー名は単にコンピューターの名前です。Webサーバーの場合、この名前は通常、サーバーが1つのドメインのみをホストし、サーバー名がドメイン名と同等でない限り、エンドユーザーには表示されません。
改めて Cloud Armor 側の定義をみてみる。
SNI: HTTPS リクエストの TLS セッションでの Server Name Indication。キー値は、最初の 128 バイトに切り詰められます。HTTP セッションの場合、キーのタイプはデフォルトで ALL になります。
これはつまりリクエスト先のサーバー名ということ?Cloud Armorは Load Balancer に紐づけられるはずなので…ドメイン名によるパスルーティングを使っている場合などに有効そうか。

Cloudflare側のWAFを使うこととにした

```mermaid
architecture-beta
group api(cloud)[API]
service db(database)[Database] in api
service disk1(disk)[Storage] in api
service disk2(disk)[Storage] in api
service server(server)[Server] in api
db:L -- R:server
disk1:T -- B:server
disk2:T -- B:db
```