비율 제한 구성

이 페이지에는 제한 또는 비율 기반 차단 작업을 구성하여 클라이언트별 비율 제한을 적용하도록 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) 및 Compute 네트워크 관리자 역할이 있는 사용자는 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개의 비율 제한을 사용하여 우선순위 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개의 비율 제한을 사용하여 우선순위 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 예외 쿠키가 있는 사용자에게 비율 기반 차단을 적용할 수 있습니다. 예를 들어 다음 gcloud CLI 명령어는 유효한 reCAPTCHA 예외 쿠키가 있는 모든 요청에서 고유한 reCAPTCHA 예외 쿠키마다 5분당 요청 20개의 비율 제한을 사용하여 우선순위 115throttle 규칙을 만듭니다. 제한 한도를 초과하는 요청은 reCAPTCHA 평가로 리디렉션됩니다. 예외 쿠키 및 reCAPTCHA 평가에 대한 자세한 내용은 봇 관리 개요를 참조하세요.

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 지문을 비율 제한 키로 사용할 수 있습니다. 다음 예시에서는 우선순위가 1000throttle 규칙을 만듭니다. 이 규칙은 5분당 20개 요청으로 비율이 제한됩니다. 특히 /login 경로를 사용하는 요청에 해당하며, 클라이언트 JA3 디지털 지문을 기반으로 합니다. 제한 한도를 초과하는 요청은 거부됩니다.

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 주소를 기반으로 비율 제한을 적용할 수 있습니다. 다음 예시에서는 우선순위가 1000throttle 규칙을 만듭니다. 이 규칙은 5분당 20개 요청으로 비율이 제한됩니다. 특히 /login 경로를 사용하는 요청에 해당하며, 시작 클라이언트 IP 주소를 기반으로 합니다. 제한 한도를 초과하는 요청은 거부됩니다.

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 쌍의 목록이 필요합니다. 일부 키는 이름을 제공할 필요가 없습니다.

다음 예시에서는 1.2.3.0/24의 IP 주소에서 수신되는 모든 요청에서 각 HTTP-PATHsite_id 조합에 60초마다 100개 요청의 비율 제한을 사용하여 POLICY_NAME 정책의 throttle 규칙을 우선순위 105로 만듭니다. 제한 한도를 초과하는 요청은 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개 한도를 초과하면 300초 동안 US 리전의 요청을 차단합니다. 차단된 요청은 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

다음 단계