Google Cloud Armor 문제 해결

다음 안내를 따라 Google Cloud Armor 보안 정책 문제를 해결합니다.

Google Cloud Armor 보안 정책에 구성된 거부 규칙에도 불구하고 트래픽이 허용됨

  1. Google Cloud Armor 보안 정책이 대상 백엔드 서비스에 연결되어 있는지 확인합니다. 예를 들어 다음 명령어는 백엔드 서비스 my-backend에 연결된 모든 데이터를 설명합니다. 반환된 결과에는 이 백엔드 서비스에 연결된 Google Cloud Armor 보안 정책의 이름이 포함되어야 합니다.

    gcloud compute backend-services describe my-backend
    
  2. HTTP(S) 로그를 검토하여 관련 작업과 함께 트래픽과 일치하는 정책과 규칙을 결정합니다. 로깅을 사용하여 로그를 봅니다.

    다음은 관심 있는 필드가 굵게 표시된 허용된 요청의 샘플 로그입니다. 다음 필드를 확인하고 트래픽을 거부하도록 구성한 규칙과 일치하는지 확인합니다.

    • configuredAction은 규칙에 구성된 작업과 일치해야 합니다.
    • outcome은 위 configuredAction과 일치해야 합니다.
    • priority는 규칙의 우선순위 번호와 일치해야 합니다.
    • name은 이 백엔드 서비스에 연결된 Google Cloud Armor 보안 정책의 이름과 일치해야 합니다.
    httpRequest:
     remoteIp: 104.133.0.95
     requestMethod: GET
     requestSize: '801'
     requestUrl: http://74.125.67.38/
     responseSize: '246'
     serverIp: 10.132.0.4
     status: 200
     userAgent: curl/7.35.0
       insertId: ajvis5ev4i60
       internalId:
         projectNumber: '895280006100'
       jsonPayload:
         '@type': type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry
         **enforcedSecurityPolicy:
           configuredAction: ACCEPT
           name: mydev-policy-log-test1
           outcome: ACCEPT
           priority: 2147483647**
         statusDetails: response_sent_by_backend
       logName: projects/mydev-staging/logs/requests
       resource:
         labels:
           backend_service_name: ''
           forwarding_rule_name: mydev-forwarding-rule
           project_id: mydev-staging
           target_proxy_name: mydev-target-http-proxy
           url_map_name: mydev-url-map
           zone: global
         type: http_load_balancer
       severity: INFO
       timestamp: '2017-04-18T18:57:05.845960288Z'
    
  3. 규칙의 계층 구조를 검토하여 올바른 규칙이 일치하는지 확인합니다. 허용 작업이 있는 우선순위가 높은 규칙이 트래픽과 일치할 수 있습니다. gcloud 명령줄 도구의 보안 정책에서 describe 명령어를 사용하여 Google Cloud Armor 보안 정책의 콘텐츠를 확인합니다.

    예를 들어 다음 예시에서는 우선순위가 높은 허용 규칙(우선순위 100)이 1.2.3.4 IP 주소에서 들어오는 트래픽과 일치하여 우선순위가 낮은(우선순위 200) 거부 규칙이 트래픽을 트리거하고 차단하는 것을 방지하는 방법을 보여줍니다.

    gcloud compute security-policies describe my-policy
    
    creationTimestamp: '2017-04-18T14:47:58.045-07:00
    description: ''
    fingerprint: Yu5spBjdoC0=
    id: '2560355463394441057'
    kind: compute#securityPolicy
    name: my-policy
    rules:
    - action: allow
      description: allow high priority rule
      kind: compute#securityPolicyRule
      match:
        srcIpRanges:
        - '1.2.3.4/32'
      preview: false
      priority: 100
    - action: deny
      description: deny lower priority rule
      kind: compute#securityPolicyRule
      match:
        srcIpRanges:
        - '1.2.3.0/24
      preview: false
      priority: 200
    - action: deny
      description: default rule
      kind: compute#securityPolicyRule
      match:
        srcIpRanges:
        - '*'
      preview: false
      priority: 2147483647
      selfLink: http://www.googleapis.com/compute/v1/projects/bigclustertestdev0-devconsole/global/securityPolicies/sp
    

사전 구성된 규칙이 거짓양성 반환

XSS 및 SQLi 감지는 HTTP 요청 헤더와 기타 L7 매개변수의 정적 서명 일치를 기반으로 합니다. 이러한 정규 표현식 패턴에는 거짓양성 경향이 있습니다. 미리보기 모드에서 사전 구성된 규칙을 XSS 및 SQLi 감지에 사용하면 로그에서 거짓양성을 확인할 수 있습니다.

거짓양성을 발견하면 트래픽 콘텐츠를 ModSecurity CRS 규칙과 비교할 수 있습니다. 규칙이 유효하지 않거나 관련이 없으면 evaluatePreconfiguredExpr 표현식을 사용하여 규칙을 중지하고 exclude ID list 인수에 규칙의 ID를 지정합니다.

로그를 검토하고 모든 거짓양성을 삭제한 후 미리보기 모드를 중지합니다.

미리보기 모드에서 사전 구성된 규칙을 추가하려면 다음 안내를 따르세요.

  1. 미리보기 모드에서 사전 구성된 표현식 집합이 있는 보안 정책을 만듭니다.

    gcloud compute security-policies rules create 1000
       --security-policy my-policy
       --expression "evaluatePreconfiguredExpr('xss-stable')"
       --action deny-403
       --preview
    
  2. urlcookie와 같은 HTTP 요청 필드의 HTTP(S) 로그를 검토합니다. 예를 들어 requestUrlModSecurity CRS 규칙 ID 941180과 긍정적으로 비교합니다.

    httpRequest:
      remoteIp: 104.133.0.95
      requestMethod: GET
      requestSize: '801'
      requestUrl: http://74.125.67.38/foo?document.cookie=1010"
      responseSize: '246'
      serverIp: 10.132.0.4
      status: 200
      userAgent: curl/7.35.0
    insertId: ajvis5ev4i60
    internalId:
      projectNumber: '895280006100'
    jsonPayload:
      '@type': type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry
      enforcedSecurityPolicy:
        configuredAction: ACCEPT
        name: my-policy
        outcome: ACCEPT
        priority: 2147483647
        preconfiguredExprIds: [ 'owasp-crs-v030001-id941180-xss' ]
      statusDetails: response_sent_by_backend
    logName: projects/mydev-staging/logs/requests
    resource:
      labels:
        backend_service_name: ''
        forwarding_rule_name: mydev-forwarding-rule
        project_id: mydev-staging
        target_proxy_name: mydev-target-http-proxy
        url_map_name: mydev-url-map
        zone: global
      type: http_load_balancer
    severity: INFO
    timestamp: '2017-04-18T18:57:05.845960288Z'
    
  3. Google Cloud Armor 보안 정책에서 규칙을 업데이트하여 ModSecurity CRS 규칙 ID 941180을 제외합니다.

    gcloud compute security-policies rules update 1000 \
       --security-policy my-policy \
       --expression "evaluatePreconfiguredExpr('xss-stable', ['owasp-crs-v030001-id941180-xss'])" \
       --action deny-403 \
       --preview
    
  4. 로그를 다시 검토한 후 미리보기 모드를 중지하여 규칙을 구현합니다.

서명이 거부된 클라이언트는 차단되거나 거부되지 않음

Cloud CDN과 함께 Google Cloud Armor를 사용하는 경우 보안 정책은 동적 콘텐츠, 캐시 부적중 또는 CDN 원본 서버를 대상으로 지정된 기타 요청에 대해서만 적용됩니다. 다운스트림 Google Cloud Armor 보안 정책으로 인해 해당 요청이 CDN 원본 서버에 도달하지 못하더라도 캐시 적중은 제공됩니다.

명명된 IP 주소 목록 관련 문제

이 섹션에서는 명명된 IP 주소 목록의 문제 해결에 대한 정보를 제공합니다.

명명된 IP 주소 목록 내 IP 주소

목록의 IP 주소는 항상 Google Cloud Armor의 명명된 IP 주소 목록 가이드에 나열된 제공업체 웹사이트의 IP 주소와 일치합니다. 목록과 관련해 궁금한 점이 있으면 Cloud 지원팀에 문의하세요.

Google Cloud Armor에서 명명된 IP 주소 목록 내 IP 주소가 오래됨

Google Cloud Armor는 목록을 IP 주소 목록 제공업체와 매일 동기화합니다. 따라서 제공업체의 데이터보다 몇 시간 또는 하루가 늦은 오래된 데이터가 있을 수 있습니다. 예상보다 많이 늦은(예: 일주일 초과) 오래된 데이터가 있으면 Cloud 지원팀에 문의하세요.

명명된 IP 주소 목록을 참조하는 보안 정책을 만드는 데 문제가 있음

명명된 IP 목록을 참조하는 보안 정책을 만들려고 했지만 명령어가 실패하면 다음과 같은 오류가 표시됩니다.

gcloud beta compute security-policies rules create 750 \
    --security-policy my \
    --expression "evaluatePreconfiguredExpr('sourceiplist-abc')" \
    --action "allow"
ERROR: (gcloud.beta.compute.security-policies.rules.create) Could not fetch resource:
 - Invalid value for field 'resource.match.expr': '{  "expression": "evaluatePreconfiguredExpr(\u0027sourceiplist-abc\u0027)"}'. Error parsing Cloud Armor rule matcher expression: sourceiplist-abc is not a valid preconfigured expression set.

특정 제공업체가 지원되는지, IP 주소 목록 이름이 올바르게 입력되었는지 확인합니다. 이 gcloud 명령어를 사용하여 현재 사전 구성된 표현식 집합을 나열하면 이를 확인할 수 있습니다.

gcloud beta compute security-policies list-preconfigured-expression-sets

명명된 IP 주소 허용 목록의 사전 구성된 규칙이 있음에도 불구하고 트래픽이 차단됨

명명된 IP 주소 목록에 있는 IP 주소에서 들어오는 트래픽이 차단되는 경우가 있습니다. 명명된 IP 주소 허용 목록에 있는 IP 주소에서 들어오는 트래픽인지 확인합니다. 그런 다음 트래픽을 차단할 수 있는 우선순위가 더 높은 다른 보안 규칙이 있는지 확인합니다. 문제가 계속되면 Cloud 지원팀에 문의하세요.

먼저 보안 정책이 올바른 백엔드 서비스에 연결되어 있는지 확인합니다.

gcloud compute backend-services describe my-backend-service

그런 다음 보안 정책에 있는 규칙을 확인합니다. 예를 들면 다음과 같습니다.

 gcloud compute security-policies describe my-policy
---
…
name: my-policy
rules:
- action: allow
  description: allow fastly ip addresses
  kind: compute#securityPolicyRule
  match:
    expr:
      expression: evaluatePreconfiguredExpr('sourceiplist-fastly')
  preview: false
  priority: 100
- action: deny(403)
  description: Default rule, higher priority overrides it
  kind: compute#securityPolicyRule
  match:
    config:
      srcIpRanges:
      - '*'
    versionedExpr: SRC_IPS_V1
  preview: false
  priority: 2147483647
- action: deny(404)
  description: deny xyz referer
  kind: compute#securityPolicyRule
  match:
    expr:
      expression: request.headers['Referer'].contains('xyz')
  preview: false
  priority: 50
…

위 보안 정책에는 기본 거부 규칙, Fastly IP 주소에 대한 허용 규칙, 'xyz'가 포함된 리퍼러의 거부 규칙이 포함되어 있습니다. 또한 각각의 우선순위도 나열됩니다.

그런 다음 로그를 검토하여 트래픽 및 관련 작업과 일치하는 규칙을 결정합니다. 로깅에 대한 자세한 내용은 기본 로그 보기를 참조하세요.

다음은 로그 예시입니다.

 httpRequest: {
    referer: "http://www.xyz.com/"
    remoteIp: "23.230.32.10"
    requestMethod: "HEAD"
    requestSize: "79"
    requestUrl: "http://www.abc.com/"
    responseSize: "258"
    status: 404
    userAgent: "Mozilla/5.0"
  }
  …
  jsonPayload: {
    @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry"
    enforcedSecurityPolicy: {
      configuredAction: "DENY"
      name: "my-policy"
      outcome: "DENY"
      priority: 50
    }
    statusDetails: "denied_by_security_policy"
  }
  …

위 로그에서 요청은 23.230.32.10에서 들어옵니다. 여기에는 https://api.fastly.com/public-ip-list에서 볼 수 있듯이 Fastly 공개 IP 주소 목록이 적용됩니다. 하지만 요청은 우선순위가 50으로 지정된 거부 규칙과 일치합니다. 이를 보안 정책의 내용과 비교하면 규칙이 xyz가 포함된 리퍼러의 거부 규칙에 해당합니다. 요청에 http://www.xyz.com/ 리퍼러가 있으므로 보안 규칙이 올바르게 작동하고 있습니다.

Security Command Center 결과 관련 문제

Google Cloud Armor 카드가 Security Command Center에 나타나지 않음

Security Command Center 인터페이스에서 Google Cloud Armor 결과를 사용 설정합니다.

Google Cloud Armor 결과가 Security Command Center에 나타나지 않음

  • Google Cloud Armor에서 찾은 결과가 Security Command Center에 나타나지 않으면 백엔드 서비스에 대한 트래픽이 결과 기준을 충족하지 못할 수 있습니다.
  • 백엔드의 트래픽 볼륨과 관련된 궁금한 점이 있으면 네트워크 보안 정책 리소스의 Cloud Monitoring 대시보드에서 요청 통계를 확인하세요.

결과에 노이즈가 너무 많음

이 문제와 관련하여 도움이 필요하면 Cloud 지원팀에 문의하세요.