このページでは、スロットルまたはレートベースの禁止アクションを構成して、クライアントごとのレート制限を適用するように 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 list
(gcloud
のみ)
セキュリティ管理者ロール(roles/iam.securityAdmin
)とネットワーク管理者ロールを持つユーザーは、SecurityPolicies
API メソッドの get
、list
、および 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 リクエストのレート制限を適用する、優先度 105
の throttle
ルールを作成します。リクエストがスロットル調整の上限を超えると、エラーコード 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 リクエストのレート制限を適用する、優先度 110
の throttle
ルールを作成します。リクエストがスロットル調整の上限を超えると、エラーコード 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 リクエストのレート制限がある、優先度 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-ja3-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
が返されます。
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