このページでは、スロットルまたはレートベースの禁止アクションを構成して、クライアントごとのレート制限を適用するように Google Cloud Armor ルールを構成する方法について説明します。レート制限を構成する前に、レート制限の概要の情報をよく理解しておいてください。
始める前に
以降のセクションでは、Cloud Armor セキュリティ ポリシーの構成に必要なすべての Identity and Access Management(IAM)のロールと権限について説明します。このドキュメントのユースケースでは、compute.securityPolicies.create
権限のみが必要です。
Cloud Armor セキュリティ ポリシー用の IAM 権限を設定する
次の操作を行うには、Identity and Access Management(IAM)の Compute セキュリティ管理者のロール(roles/compute.securityAdmin
)が必要です。
- Cloud Armor セキュリティ ポリシーの構成、変更、更新、削除
- 次の API メソッドの使用:
SecurityPolicies insert
SecurityPolicies delete
SecurityPolicies patch
SecurityPolicies addRule
SecurityPolicies patchRule
SecurityPolicies removeRule
Compute ネットワーク管理者のロール(roles/compute.networkAdmin
)を付与されたユーザーは、次の操作を実行できます。
- バックエンド サービスに Cloud Armor セキュリティ ポリシーを設定する
- 次の API メソッドの使用:
BackendServices setSecurityPolicy
BackendServices list
(gcloud
のみ)
セキュリティ管理者のロール(roles/iam.securityAdmin
)と Compute ネットワーク管理者のロール(roles/compute.networkAdmin
)を持つユーザーは、SecurityPolicies
API メソッドの get
、list
、getRule
を使用して 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 リクエストのレート制限がある throttle
ルールを優先度 105
で作成します。リクエストがスロットル調整の上限を超えると、ステータス コード 429 Too Many Requests
が返されます。
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 リクエストのレート制限を適用する、優先度 110
の throttle
ルールを作成します。リクエストがスロットル調整の上限を超えると、ステータス コード 429 Too Many Requests
が返されます。
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 評価の詳細については、Cloud Armor 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"
JA4 フィンガープリントと JA3 フィンガープリントに基づくレート制限
JA4 フィンガープリントと JA3 フィンガープリントは、レート制限のキーとして使用できます。次の例では、クライアントの JA4 フィンガープリントに基づいて、/login
パスを含むリクエストと一致する 5 分あたり 20 リクエストのレート制限を設定し、優先度 1000
の throttle
ルールを作成します。スロットル調整の上限を超えるリクエストは拒否されます。
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-ja4-fingerprint
ユーザー IP アドレスに基づくレート制限
アップストリーム プロキシを介してリクエストを受信する場合は、送信元のクライアントの IP アドレスに基づいてレート制限を適用できます。次の例では、送信元クライアントの IP アドレスに基づいて /login
パスを含むリクエストを照合し、5 分あたり 20 リクエストのレート制限を適用して、優先度 1000
の throttle
ルールを作成します。スロットル調整の上限を超えるリクエストは拒否されます。
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_NAME
の throttle
ルールを作成します。このルールの優先度は 105
で、1.2.3.0/24
の IP アドレスから送信されたすべてのリクエストにレート制限が適用されます(HTTP-PATH
と site_id
の各組み合わせのリクエスト数の上限は 60 秒あたり 100)。リクエストがスロットル調整の上限を超えると、ステータス コード 429 Too Many Requests
が返されます。
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 Not Found
を返します。
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 Forbidden
を返します。
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 Too Many Requests
を返します。
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
既存のルールのアクションをレートベースの禁止アクションからスロットル アクションに変更することはできません。