レート制限を構成する

このページでは、スロットルまたはレートベースの禁止アクションを構成して、クライアントごとのレート制限を適用するように Google Cloud Armor ルールを構成する方法について説明します。レート制限を設定する前に、レート制限の概要の情報をよく理解しておいてください。

準備

以降のセクションでは、Google Cloud Armor セキュリティ ポリシーの構成に必要なすべての Identity and Access Management(IAM)のロールと権限について説明します。このドキュメントのユースケースでは、compute.securityPolicies.create 権限のみが必要です。

Google Cloud Armor セキュリティ ポリシーの IAM 権限を設定する

次の操作を行うには、Identity and Access Management(IAM)の Compute セキュリティ管理者のロール(roles/compute.securityAdminが必要です。

  • Google Cloud Armor セキュリティ ポリシーの構成、変更、更新、削除
  • 次の API メソッドの使用:
    • SecurityPolicies insert
    • SecurityPolicies delete
    • SecurityPolicies patch
    • SecurityPolicies addRule
    • SecurityPolicies patchRule
    • SecurityPolicies removeRule

Compute ネットワーク管理者のロール(roles/compute.networkAdminを付与されたユーザーは、次の操作を実行できます。

  • バックエンド サービスの Google Cloud Armor セキュリティ ポリシーの設定
  • 次の API メソッドの使用:
    • BackendServices setSecurityPolicy
    • BackendServices listgcloud のみ)

セキュリティ管理者ロール(roles/iam.securityAdminとネットワーク管理者ロールを持つユーザーは、SecurityPolicies API メソッドの getlist、および getRule を使用して、Google Cloud Armor セキュリティ ポリシーを閲覧できます。

カスタムロールの IAM 権限を設定する

次の表に、IAM のロールの基本的な権限と、関連する API メソッドを示します。

IAM 権限 API メソッド
compute.securityPolicies.create SecurityPolicies insert
compute.securityPolicies.delete SecurityPolicies delete
compute.securityPolicies.get SecurityPolicies get
SecurityPolicies getRule
compute.securityPolicies.list SecurityPolicies list
compute.securityPolicies.use BackendServices setSecurityPolicy
compute.securityPolicies.update SecurityPolicies patch
SecurityPolicies addRule
SecurityPolicies patchRule
SecurityPolicies removeRule
compute.backendServices.setSecurityPolicy BackendServices setSecurityPolicy

レートベースのスロットル調整のルール

Google Cloud CLI では、レートベースのスロットル調整のルールは次の形式になります。

gcloud compute security-policies rules create PRIORITY \
    --security-policy=SECURITY_POLICY \
    {--expression=EXPRESSION | --src-ip-ranges=SRC_IP_RANGE} \
    --action "throttle" \
    --rate-limit-threshold-count=RATE_LIMIT_THRESHOLD_COUNT \
    --rate-limit-threshold-interval-sec=RATE_LIMIT_THRESHOLD_INTERVAL_SEC \
    --conform-action=[allow] \
    --exceed-action=[deny-403|deny-404|deny-429|deny-502|redirect] \
    --exceed-redirect-type=[google-recaptcha|external-302] \
    --exceed-redirect-target=REDIRECT_URL \
    --enforce-on-key=[IP | ALL | HTTP-HEADER | XFF-IP | HTTP-COOKIE | HTTP-PATH | SNI | REGION-CODE] \
    --enforce-on-key-name=[HTTP_HEADER_NAME|HTTP_COOKIE_NAME]

単一キーに基づくレート制限

たとえば、次の gcloud CLI コマンドは、1.2.3.0/24 内の各 IP アドレスに対して 60 秒ごとに 100 リクエストのレート制限を適用する、優先度 105throttle ルールを作成します。リクエストがスロットル調整の上限を超えると、エラーコード 429 が返されます。

gcloud compute security-policies rules create 105 \
    --security-policy SECURITY_POLICY \
    --src-ip-ranges="1.2.3.0/24" \
    --action=throttle \
    --rate-limit-threshold-count=100 \
    --rate-limit-threshold-interval-sec=60 \
    --conform-action=allow \
    --exceed-action=deny-429 \
    --enforce-on-key=IP

たとえば、次の gcloud CLI コマンドは、1.2.3.0/24 内の IP アドレスからのすべてのリクエストにわたって、HTTP ヘッダー User-Agent の一意の値ごとに 60 秒ごとに 10 リクエストのレート制限を適用する、優先度 110throttle ルールを作成します。リクエストがスロットル調整の上限を超えると、エラーコード 429 が返されます。

gcloud compute security-policies rules create 110 \
    --security-policy SECURITY_POLICY \
    --src-ip-ranges="1.2.3.0/24" \
    --action=throttle \
    --rate-limit-threshold-count=10 \
    --rate-limit-threshold-interval-sec=60 \
    --conform-action=allow \
    --exceed-action=deny-429 \
    --enforce-on-key=HTTP-HEADER \
    --enforce-on-key-name='User-Agent'

最後に、有効な reCAPTCHA 除外 Cookie が設定されているユーザーに対して、レートベースの禁止を発行できます。たとえば、次の gcloud CLI コマンドは、有効な reCAPTCHA 除外 Cookie を持つすべてのリクエストに対して、一意の reCAPTCHA 除外 Cookie ごとに 5 分あたり 20 リクエストのレート制限を持つ throttle ルールを、優先度 115 で作成します。スロットル調整の上限を超えるリクエストは、reCAPTCHA 評価にリダイレクトされます。除外 Cookie と reCAPTCHA 評価の詳細については、bot 管理の概要をご覧ください。

gcloud compute security-policies rules create 115 \
    --security-policy SECURITY_POLICY \
    --expression="token.recaptcha_exemption.valid" \
    --action=throttle \
    --rate-limit-threshold-count=20 \
    --rate-limit-threshold-interval-sec=300 \
    --conform-action=allow \
    --exceed-action=redirect \
    --exceed-redirect-type=google-recaptcha \
    --enforce-on-key=HTTP-COOKIE \
    --enforce-on-key-name="recaptcha-ca-e"

JA3 フィンガープリントに基づくレート制限

JA3 フィンガープリントは、レート制限のキーとして使用できます。次の例では、クライアントの JA3 フィンガープリントに基づいて、/login パスがあるリクエストと一致する 5 分あたり 20 リクエストのレート制限がある、優先度 1000throttle ルールを作成します。スロットル調整の上限を超えるリクエストは拒否されます。

gcloud compute security-policies rules create 1000 \
    --security-policy SECURITY_POLICY \
    --expression "request.path.matches('/login')" \
    --action throttle \
    --rate-limit-threshold-count 20 \
    --rate-limit-threshold-interval-sec 300 \
    --conform-action allow \
    --exceed-action deny-429 \
    --enforce-on-key-configs tls-ja3-fingerprint

ユーザー IP アドレスに基づくレート制限

アップストリーム プロキシを介してリクエストを受信する場合は、送信元クライアントの IP アドレスに基づいてレート制限を適用できます。次の例では、送信元クライアントの IP アドレスに基づいて、/login パスがあるリクエストと一致する 5 分あたり 20 リクエストのレート制限がある、優先度 1000throttle ルールを作成します。スロットル調整の上限を超えるリクエストは拒否されます。

gcloud compute security-policies rules create 1000 \
    --security-policy SECURITY_POLICY
    --expression "request.path.matches('/login')"
    --action throttle
    --rate-limit-threshold-count 20
    --rate-limit-threshold-interval-sec 300
    --conform-action allow
    --exceed-action deny-429
    --enforce-on-key-configs user-ip

ユーザーの IP アドレスのサポートの詳細については、ルール言語リファレンスをご覧ください。

複数のキーに基づくレート制限

enforce-on-key-configs フラグを使用して、複数のレート制限キーに基づいてトラフィックをスロットルすることもできます。このフラグは、enforce-on-key フラグと enforce-on-key-name フラグの両方に代わるものです。enforce-on-key-configs フラグを使用する場合、KEY=NAME ペアのカンマ区切りのリストが必要です。ただし、一部のキーの名前は指定する必要はありません。

次の例では、ポリシー POLICY_NAMEthrottle ルールを作成します。このルールの優先度は 105 で、1.2.3.0/24 の IP アドレスから送信されたすべてのリクエストにレート制限が適用されます(HTTP-PATHsite_id の各組み合わせのリクエスト数の上限は 60 秒あたり 100)。リクエストがスロットル調整の上限を超えると、エラーコード 429 が返されます。

gcloud compute security-policies rules create 105 \
    --security-policy=POLICY_NAME \
    --src-ip-ranges="1.2.3.0/24" \
    --action=throttle \
    --rate-limit-threshold-count=100 \
    --rate-limit-threshold-interval-sec=60 \
    --conform-action=allow \
    --exceed-action=deny-429 \
    --enforce-on-key-configs="HTTP-PATH,HTTP-COOKIE=site_id"

レートベースの禁止ルール

gcloud CLI では、レートベースの禁止ルールは次の形式になります。

gcloud compute security-policies rules create PRIORITY \
    --security-policy=SECURITY_POLICY \
    {--expression=EXPRESSION | --src-ip-ranges=SRC_IP_RANGE} \
    --action "rate-based-ban" \
    --rate-limit-threshold-count=RATE_LIMIT_THRESHOLD_COUNT \
    --rate-limit-threshold-interval-sec=RATE_LIMIT_THRESHOLD_INTERVAL_SEC \
    --ban-duration-sec=BAN_DURATION_SEC \
    --ban-threshold-count=BAN_THRESHOLD_COUNT \
    --ban-threshold-interval-sec=BAN_THRESHOLD_INTERVAL_SEC \
    --conform-action=[allow] \
    --exceed-action=[deny-403|deny-404|deny-429|deny-502|redirect] \
    --exceed-redirect-type=[google-recaptcha|external-302] \
    --exceed-redirect-target=REDIRECT_URL \
    --enforce-on-key=[IP | ALL | HTTP-HEADER | XFF-IP | HTTP-COOKIE | HTTP-PATH | SNI | REGION-CODE] \
    --enforce-on-key-name=[HTTP_HEADER_NAME|HTTP_COOKIE_NAME]

たとえば、次の gcloud CLI コマンドでは、リクエストが値 tuna のヘッダー fish と一致する IP アドレスごとに、優先度 100 でレートベースの禁止ルールを作成し、そのレートが 120 秒あたり 50 リクエストの上限を超えた場合に、300 秒間禁止します。禁止されたリクエストは、エラーコード 404 を返します。

gcloud compute security-policies rules create 100 \
    --security-policy=sec-policy \
    --expression="request.headers['fish'] == 'tuna'" \
    --action=rate-based-ban \
    --rate-limit-threshold-count=50 \
    --rate-limit-threshold-interval-sec=120 \
    --ban-duration-sec=300 \
    --conform-action=allow \
    --exceed-action=deny-404 \
    --enforce-on-key=IP

たとえば、次の gcloud CLI コマンドでは、優先度 101 でレートベースの禁止ルールが作成され、リージョン コードが US と一致するすべてのリクエストが 60 秒あたり 10 リクエストに制限されます。また、このルールでは、レートが 600 秒あたり 1,000 リクエストの上限を超えると、US リージョンからのリクエストが 300 秒間禁止されます。禁止されたリクエストは、エラーコード 403 を返します。

gcloud compute security-policies rules create 101 \
    --security-policy sec-policy \
    --expression "origin.region_code == 'US'" \
    --action rate-based-ban \
    --rate-limit-threshold-count 10 \
    --rate-limit-threshold-interval-sec 60 \
    --ban-duration-sec 300 \
    --ban-threshold-count 1000 \
    --ban-threshold-interval-sec 600 \
    --conform-action allow \
    --exceed-action deny-403 \
    --enforce-on-key ALL

たとえば、次の gcloud CLI コマンドでは、優先度 102 でレートベースの禁止ルールを作成し、任意の送信元 IP アドレス範囲からのすべてのリクエストを 60 秒あたり 20 件に制限します。また、このルールでは、リクエストのレートが 400 秒あたり 500 リクエストの上限を超えると、任意の送信元 IP アドレス範囲からのリクエストが 600 秒間禁止されます。禁止されたリクエストは、エラーコード 429 を返します。

gcloud compute security-policies rules create 102 \
    --security-policy sec-policy \
    --src-ip-ranges="*" \
    --action rate-based-ban \
    --rate-limit-threshold-count 20 \
    --rate-limit-threshold-interval-sec 60 \
    --ban-duration-sec 600 \
    --ban-threshold-count 500 \
    --ban-threshold-interval-sec 400 \
    --conform-action allow \
    --exceed-action deny-429 \
    --enforce-on-key ALL

スロットル ルールをレートベースの禁止ルールに変更する

次のコマンドを使用して、既存のルールのアクションをスロットル アクションからレートベースの禁止アクションに変更できます。

gcloud compute security-policies rules update 105 \
--action=rate-based-ban \
--security-policy=sec-policy \
--ban-duration-sec=600

既存のルールのアクションをレートベースの禁止アクションからスロットル アクションに変更することはできません。

次のステップ