사전 구성된 Google Cloud Armor WAF 규칙 조정

Google Cloud Armor는사전 구성된 WAF 규칙을 제공하며, 각 규칙은 ModSecurity Core Rule Set(CRS)에서 가져온 여러 서명으로 구성됩니다. 각 서명은 규칙 집합의 공격 감지 규칙에 해당합니다. 들어오는 요청은 사전 구성된 규칙에 따라 평가됩니다. 요청이 사전 구성된 WAF 규칙과 연결된 서명과 일치하면 요청과 사전 구성된 WAF 규칙이 일치하는 것으로 간주됩니다. evaluatePreconfiguredWaf() 또는 evaluatePreconfiguredExpr() 표현식이 true 값을 반환하면 일치하는 것입니다.

민감도 수준 선택

각 서명에는 ModSecurity paranoia 수준에 해당하는 민감도 수준이 있습니다. 04 사이의 민감도를 선택할 수 있지만 민감도 수준 0은 기본적으로 사용 설정된 규칙이 없음을 의미합니다.

민감도 수준이 낮을수록 서명의 신뢰도가 높으므로 거짓양성을 생성할 가능성이 낮습니다. 민감도 수준이 높아지면 보안이 향상되지만 거짓양성이 생성될 위험이 증가합니다. WAF 규칙의 민감도 수준을 선택하면 선택한 민감도 수준보다 낮거나 같은 민감도 수준에서 서명을 선택합니다. 다음 예시에서는 민감도 수준 1을 선택하여 사전 구성된 WAF 규칙을 조정합니다.

evaluatePreconfiguredWaf('sqli-v33-stable', {'sensitivity': 1})

규칙 서명 선택 해제

사전 구성된 WAF 규칙이 필요한 이상으로 많은 요청과 일치한다고 결정하거나 규칙이 허용되어야 하는 트래픽을 차단하는 경우에는 노이즈가 많거나 불필요한 서명을 중지하도록 규칙을 조정하면 됩니다. 사전 구성된 특정 WAF 규칙에서 서명을 중지하려면 원치 않는 서명의 ID 목록을 evaluatePreconfiguredWaf() 표현식에 제공합니다.

다음 예시에서는 사전 구성된 sqli-v33-stable(CRS 3.3) WAF 규칙에서 두 개의 CRS 규칙 ID를 제외합니다.

evaluatePreconfiguredWaf('sqli-v33-stable', {'sensitivity': 4, 'opt_out_rule_ids': ['owasp-crs-v030301-id942350-sqli', 'owasp-crs-v030301-id942360-sqli']})

사전 구성된 CRS 규칙 세트에서 서명 ID를 제외하는 경우 구성 오류를 방지하기 위해 서명 ID 버전을 규칙 세트 버전(CRS 3.0 또는 3.3)과 일치시켜야 합니다.

또한 기존 표현식 evaluatePreconfigureExpr()을 사용하여 서명 ID를 사용 중지할 수도 있습니다. 사전 구성된 WAF 규칙 표현식에 대한 자세한 내용은 커스텀 규칙 언어 참조를 참조하세요.

규칙 서명 선택

규칙 서명을 선택 해제하는 대신 사용 중지된 민감도 수준에서 규칙 서명을 선택할 수 있습니다. 지정된 민감도 수준에서 사용할 서명이 선택 해제하려는 규칙보다 적을 경우 규칙 서명을 선택하는 것이 좋습니다. 규칙 서명을 선택하려면 민감도 수준이 0이어야 합니다. 다음 예시에서는 모든 민감도 수준에서 모든 cve-canary 서명을 선택 해제한 후 owasp-crs-v030001-id044228-cveowasp-crs-v030001-id144228-cve를 명시적으로 선택합니다.

evaluatePreconfiguredWaf('cve-canary', {'sensitivity': 0, 'opt_in_rule_ids': ['owasp-crs-v030001-id044228-cve', 'owasp-crs-v030001-id144228-cve']})

검사에서 요청 필드 제외

커스텀 애플리케이션은 사전 구성된 WAF 규칙의 서명과 일치하지만 합법적인 것으로 알려진 요청 필드(예: 헤더, 쿠키, 쿼리 매개변수 또는 URI)의 콘텐츠를 포함할 수 있습니다. 이 경우 요청 필드에 대한 제외 목록을 보안 정책 규칙과 연결하여 검사에서 이러한 요청 필드를 제외함으로써 거짓양성을 줄일 수 있습니다.

요청 필드 제외를 구성할 때 이 필드를 대상과 연결할 수 있는데, 이때 대상은 사전 연결된 WAF 규칙 전체 또는 사전 구성된 WAF 규칙의 서명 목록일 수 있습니다. 필드 연산자와 필드 값을 사용하여 일치검색 또는 부분 일치를 지정할 수 있습니다. 사용 가능한 필드 연산자는 다음과 같습니다.

  • EQUALS: 필드 값이 지정된 값과 같은 경우 연산자가 일치합니다.
  • STARTS_WITH: 필드 값이 지정된 값으로 시작되는 경우 연산자가 일치합니다.
  • ENDS_WITH: 필드 값이 지정된 값으로 끝나는 경우 연산자가 일치합니다.
  • CONTAINS: 필드 값에 지정된 값이 포함되어 있는 경우 연산자가 일치합니다.
  • EQUALS_ANY: 필드 값에 상관없이 연산자가 일치합니다.

다음 섹션에서는 검사에서 제외할 수 있는 요청 필드에 대한 자세한 정보와 예시를 보여줍니다.

요청 헤더

사전 구성된 WAF 규칙 평가 중에 값이 검사에서 제외되는 요청 헤더 이름의 목록입니다.

제외는 원래 요청 헤더 값을 검사하는 대상의 서명에만 적용됩니다. 여기에는 ModSecurity Core Rule Set의 다음 요청 플래그와 연결된 서명이 포함됩니다.

  • REQUEST_HEADERS

지정된 요청 헤더의 값만 검사에서 제외됩니다. 이름은 아직 검사 중입니다.

요청 쿠키

사전 구성된 WAF 규칙 평가 중에 값이 검사에서 제외되는 요청 쿠키 이름의 목록입니다.

제외는 원래 요청 쿠키 값을 검사하는 대상의 서명에만 적용됩니다. 여기에는 ModSecurity Core Rule Set의 다음 요청 플래그와 연결된 서명이 포함됩니다.

  • REQUEST_COOKIES

지정된 요청 쿠키 값만 검사에서 제외됩니다. 이름은 아직 검사 중입니다.

요청 쿼리 매개변수

사전 구성된 WAF 규칙 평가 중에 값이 검사에서 제외되는 요청 쿼리 매개변수 이름의 목록입니다.

제외는 원래 요청 매개변수를 검사하는 대상의 서명에만 적용됩니다. 여기에는 ModSecurity Core Rule Set의 다음 요청 플래그와 연결된 서명이 포함됩니다.

  • ARGS
  • ARGS_GET
  • REQUEST_URI
  • REQUEST_URI_RAW
  • REQUEST_LINE

지정된 쿼리 매개변수의 값만 검사에서 제외되며 쿼리 문자열 또는 POST 본문에 포함될 수 있습니다. 이름은 아직 검사 중입니다.

쿼리 매개변수는 URI 및 요청 행의 일부이므로 이러한 필드는 지정된 쿼리 매개변수를 제외한 후 검사를 위해 다시 조합됩니다. 그러나 전체 요청 본문을 검사하는 서명(예: 요청 플래그 REQUEST_BODY와 연결된 서명)의 경우 쿼리 매개변수 제외가 적용되지 않습니다.

예를 들어 'args'라는 쿼리 매개변수를 제외하더라도 요청의 POST 본문과 'args' 일치 항목의 값에 'args' 매개변수가 있으면 전체 요청 본문을 검사하는 서명에 일치 항목이 표시될 수 있습니다.

요청 URI

사전 구성된 WAF 규칙 평가 중에 검사에서 제외할 쿼리 문자열 데이터를 제외하는 요청 줄의 URI 목록입니다.

제외는 원래 요청 URI를 검사하는 대상의 서명에만 적용됩니다. 여기에는 ModSecurity Core Rule Set의 다음 요청 플래그와 연결된 서명이 포함됩니다.

  • REQUEST_URI
  • REQUEST_URI_RAW
  • REQUEST_LINE
  • REQUEST_FILENAME
  • REQUEST_BASENAME

위의 필드를 제외할 경우 해당 필드는 검사에서 완전히 제외되며 재조합은 수행되지 않습니다.

필드 값

EQUALS_ANY 이외의 필드 연산자를 사용하는 경우 필드 값을 지정해야 합니다.

요청 헤더, 요청 쿠키, 요청 쿼리 매개변수의 경우 필드 값에 허용되는 문자 집합에는 다음 문자가 포함됩니다.

  • !, #, $, %, &, *, +, -, ., ^, _, `, |, ~
  • 알파벳 문자 A~Z(소문자 및 대문자)
  • 0부터 9까지의 숫자

이러한 요청 필드에 제외를 적용할 때는 구성된 필드 값을 요청의 값과 대조하여 비교합니다(변환 후 대소문자를 구분하지 않음). 허용된 문자 집합에 없는 특정 문자를 제외하려는 경우에는 추가 인코딩을 수행하지 않아도 됩니다.

요청 URI의 경우 다음과 같이 URI 값을 필드 형식으로 지정해야 합니다.

  • 스키마는 허용되지만 HTTP 또는 https로만 제한됩니다.
  • 호스트가 허용되며 IP 주소일 수 있습니다.
  • 포트가 허용됩니다.
  • 경로가 허용됩니다.
  • 쿼리는 허용되지 않습니다.
  • 조각은 허용되지 않습니다.

요청 URI에 제외를 적용할 때 구성된 필드 값은 쿼리 문자열을 제외하고 요청 줄의 URI(변환 후 대소문자를 구분하지 않음)와 비교됩니다. 요청 줄의 URI는 상대 또는 절대일 수 있습니다. 요청 URI에 대한 제외를 구성할 때 이를 고려하세요.

예시

첫 번째 예에서는 PRIORITY의 보안 정책 POLICY_1에서 규칙을 업데이트하여 sqli-v33-stable WAF 규칙의 모든 서명에 대한 제외 구성을 추가하고 모든 요청 쿠키를 검사에서 제외합니다.

gcloud compute security-policies rules add-preconfig-waf-exclusion PRIORITY \
    --security-policy POLICY_1 \
    --target-rule-set "sqli-v33-stable" \
    --request-cookie-to-exclude "op=EQUALS_ANY"

두 번째 예에서는 PRIORITY의 보안 정책 POLICY_2에서 규칙을 업데이트하여 xss-v33-stable WAF 규칙의 서명 owasp-crs-v030301-id941140-xssowasp-crs-v030301-id941270-xss에 대한 제외 구성을 추가하고 abc로 시작하거나 xyz로 끝나는 요청 헤더를 검사에서 제외합니다.

gcloud compute security-policies rules add-preconfig-waf-exclusion PRIORITY \
    --security-policy POLICY_2 \
    --target-rule-set "xss-v33-stable" \
    --target-rule-ids "owasp-crs-v030301-id941140-xss" "owasp-crs-v030301-id941270-xss" \
    --request-header-to-exclude "op=STARTS_WITH,val=abc" \
    --request-header-to-exclude "op=ENDS_WITH,val=xyz"

세 번째 예에서는 PRIORITY의 보안 정책 POLICY_3에서 규칙을 업데이트하여 sqli-v33-stable의 규칙 ID owasp-crs-v030301-id942110-sqliowasp-crs-v030301-id942120-sqli에 대한 요청 필드 제외를 모두 제거합니다.

gcloud compute security-policies rules remove-preconfig-waf-exclusion PRIORITY \
    --security-policy POLICY_3 \
    --target-rule-set "sqli-v33-stable" \
    --target-rule-ids "owasp-crs-v030301-id942110-sqli,owasp-crs-v030301-id942120-sqli"

커스텀 Content-Type 헤더 값에 파싱 적용

Google Cloud Armor가 사전 구성된 WAF 규칙에 대해 POST 본문을 평가할 때 Content-Type 헤더는 요청 본문의 데이터 형식을 나타냅니다. 기본적으로 Google Cloud Armor는 POST 본문의 콘텐츠를 사전 구성된 WAF 규칙에 대해 검사 및 일치시킬 수 있는 하나의 문자열로 취급합니다. 그러나 수신 요청에 다른 인코딩이 있는 경우 더 정확한 구문 분석을 구성할 수 있습니다. Google Cloud Armor는 다음 인코딩 유형을 지원합니다.

  • JSON
  • GraphQL

대체 파싱이 적용되는 커스텀 Content-Type 헤더 값 목록을 구성하려면 다음 예시를 사용합니다. 다음 예에서는 보안 정책 POLICY_NAME을 업데이트하여 JSON 파싱을 사용 설정하고 콘텐츠 유형 application/json, application/vnd.api+json, application/vnd.collection+json, application/vnd.hyper+json을 지정합니다.

gcloud compute security-policies update POLICY_NAME \
    --json-parsing STANDARD \
    --json-custom-content-types "application/json,application/vnd.api+json,application/vnd.collection+json,application/vnd.hyper+json"

보안 정책에서 GraphQL을 사용하거나 GraphQL로 인코딩된 콘텐츠를 수신하는 애플리케이션을 보호하는 경우 다음 예시와 같이 STANDARD_WITH_GRAPHQL 인수를 사용하여 다음과 같이 POST 본문 콘텐츠를 GraphQL 콘텐츠로 파싱할 수 있습니다.

gcloud compute security-policies update POLICY_NAME \
    --json-parsing STANDARD_WITH_GRAPHQL

POST 본문 검사는 처음 8KB로 제한됩니다. 자세한 내용은 보안 정책 제한사항을 참조하세요.

  • JSON 콘텐츠가 8KB보다 큰 경우 Google Cloud Armor는 사전 구성된 WAF 규칙으로 검사된 콘텐츠의 초기 사용분 8KB에 JSON 파싱을 적용합니다.

  • JSON 파서가 어떤 결과도 반환하지 않으면 URI 파싱이 시도될 수 있습니다. URI 파서가 이름-값 매개변수를 반환하지 않거나 이름-값 매개변수의 일부만 반환하는 경우 전체 또는 부분 문자열이 검사의 매개변수 이름으로 처리될 수 있습니다.

다음 단계