Google Cloud Armor 보안 정책 구성

다음 안내에 따라 HTTP(S) 부하 분산기로 전송되는 수신 트래픽을 필터링할 수 있도록 Google Cloud Armor 보안 정책을 만듭니다. 보안 정책에 대한 개념 정보는 Google Cloud Armor 보안 정책 개요를 참조하세요.

Google Kubernetes Engine(GKE)에서 Google Cloud Armor를 구성하는 방법은 BackendConfig 매개변수를 통한 인그레스 기능 구성 섹션의 Google Cloud Armor 보안 정책을 참조합니다.

시작하기 전에

보안 정책을 구성하려면 먼저 HTTP(S) 부하 분산 개념을 잘 알고 있어야 합니다.

Google Cloud Armor 보안 정책의 IAM 권한 설정

다음 작업에는 ID 및 액세스 관리(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

보안 관리자 역할과 네트워크 관리자 역할이 있는 사용자는 API 메서드 SecurityPolicies 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

HTTP(S) 부하 분산의 보안 정책 구성

다음은 외부 HTTP(S) 부하 분산기로의 트래픽을 허용하거나 거부하는 규칙을 사용 설정하도록 Google Cloud Armor 보안 정책을 구성하는 대략적인 단계입니다.

  1. Google Cloud Armor 보안 정책을 만듭니다.
  2. IP 주소 목록, 커스텀 표현식 또는 사전 구성된 표현식 세트를 기준으로 보안 규칙을 정책에 추가합니다.
  3. 액세스를 제어하려는 외부 HTTP(S) 부하 분산기의 백엔드 서비스에 보안 정책을 연결합니다.
  4. 필요에 따라 보안 정책을 업데이트합니다.

다음 예시에서는 Google Cloud Armor 보안 정책 두 개를 만들어 서로 다른 백엔드 서비스에 적용합니다.

보안 정책 두 개를 서로 다른 백엔드 서비스에 적용하는 예시
보안 정책 두 개를 서로 다른 백엔드 서비스에 적용하는 예시(확대하려면 클릭)

예시에서 이들은 Google Cloud Armor 보안 정책입니다.

  • mobile-clients-policygames 서비스의 외부 사용자에게 적용됩니다.
  • internal-users-policy는 조직의 test-network팀에 적용됩니다

백엔드 서비스가 gamesgames 서비스에 mobile-clients-policy를 적용하고 해당 백엔드 서비스가 test-network인 테스트팀의 내부 test 서비스에 internal-users-policy를 적용합니다.

백엔드 서비스의 백엔드 인스턴스가 여러 리전에 있는 경우 서비스와 연결된 Google Cloud Armor 보안 정책은 모든 리전의 인스턴스에 적용됩니다. 앞의 예시에서 보안 정책 mobile-clients-policyus-central의 인스턴스 1, 2, 3, 4와 더불어 us-east의 인스턴스 5, 6에 적용됩니다.

예시 만들기

이 안내를 사용하여 이전 섹션에서 설명한 구성 예시를 만듭니다.

Console

외부 사용자의 보안 정책을 구성합니다.

  1. Google Cloud Console에서 네트워크 보안 페이지로 이동합니다.

    네트워크 보안 페이지로 이동

  2. 정책 페이지에서 정책 만들기를 클릭합니다.

  3. 이름 필드에 mobile-clients-policy를 입력합니다.

  4. 설명 필드에 Policy for external users을 입력합니다.

  5. 기본 규칙 작업에서 거부를 선택합니다.

  6. 거부 상태404(찾을 수 없음)를 선택합니다.

  7. 다음 단계를 클릭합니다.

규칙을 추가합니다.

  1. 규칙 추가를 클릭합니다.
  2. 설명 필드에 allow traffic from 192.0.2.0/24을 입력합니다.
  3. 모드기본 모드(IP 주소/범위만)를 선택합니다.
  4. 일치 필드에 192.0.2.0/24를 입력합니다.
  5. 작업허용을 선택합니다.
  6. 우선순위 필드에 1000을 입력합니다.
  7. 완료를 클릭합니다.
  8. 다음 단계를 클릭합니다.

대상에 정책을 적용합니다.

  1. 대상 추가를 클릭합니다.
  2. 대상 목록에서 대상을 선택합니다.
  3. 완료를 클릭합니다.
  4. 정책 만들기를 클릭합니다.

선택적으로 Adaptive Protection을 사용 설정합니다.

  1. Adaptive Protection을 사용 설정하려면 사용 설정 체크박스를 선택합니다.

내부 사용자의 보안 정책을 구성합니다.

  1. 정책 페이지에서 정책 만들기를 클릭합니다.
  2. 이름 필드에 internal-users-policy를 입력합니다.
  3. 설명 필드에 Policy for internal test users을 입력합니다.
  4. 기본 규칙 작업에서 거부를 선택합니다.
  5. 거부 상태502(잘못된 게이트웨이)를 선택합니다.
  6. 다음 단계를 클릭합니다.

규칙을 추가합니다.

  1. 규칙 추가를 클릭합니다.
  2. 설명 필드에 allow traffic from 198.51.100.0/24을 입력합니다.
  3. 모드기본 모드(IP 주소/범위만)를 선택합니다.
  4. 일치 필드에 198.51.100.0/24를 입력합니다.
  5. 작업허용을 선택합니다.
  6. 미리보기 전용사용 설정 체크박스를 선택합니다.
  7. 우선순위 필드에 1000을 입력합니다.
  8. 완료를 클릭합니다.
  9. 다음 단계를 클릭합니다.

대상에 정책을 적용합니다.

  1. 대상 추가를 클릭합니다.
  2. 대상 목록에서 대상을 선택합니다.
  3. 완료를 클릭합니다.
  4. 정책 만들기를 클릭합니다.

gcloud

  1. Google Cloud Armor 보안 정책을 만듭니다.

    gcloud compute security-policies create mobile-clients-policy \
        --description "policy for external users"
    
    gcloud compute security-policies create internal-users-policy \
        --description "policy for internal test users"
    
  2. 트래픽을 거부하려면 기본 규칙을 보안 정책으로 업데이트합니다.

    gcloud compute security-policies rules update 2147483647 \
        --security-policy mobile-clients-policy \
        --action "deny-404"
    
    gcloud compute security-policies rules update 2147483647 \
        --security-policy internal-users-policy \
        --action "deny-502"
    
  3. 보안 정책에 규칙을 추가합니다.

    gcloud compute security-policies rules create 1000 \
        --security-policy mobile-clients-policy \
        --description "allow traffic from 192.0.2.0/24" \
        --src-ip-ranges "192.0.2.0/24" \
        --action "allow"
    
    gcloud compute security-policies rules create 1000 \
        --security-policy internal-users-policy \
        --description "allow traffic from 198.51.100.0/24" \
        --src-ip-ranges "198.51.100.0/24" \
        --action "allow"
    
  4. 백엔드 서비스에 보안 정책을 연결합니다.

    gcloud compute backend-services update games \
        --security-policy mobile-clients-policy
    
    gcloud compute backend-services update test-network \
        --security-policy internal-users-policy
    
  5. 선택적으로 Adaptive Protection을 사용 설정합니다.

    gcloud compute security-policies update mobile-clients-policy \
       --enable-layer7-ddos-defense
    
    gcloud compute security-policies update internal-users-policy \
       --enable-layer7-ddos-defense
    

보안 정책, 규칙, 표현식 만들기

Google Cloud Console, gcloud 명령줄 도구 또는 REST API를 사용하여 Google Cloud Armor 보안 정책, 규칙, 표현식을 만들 수 있습니다.

다음은 샘플 표현식입니다. 표현식에 대한 자세한 내용은 Google Cloud Armor 커스텀 규칙 언어 참조를 확인하세요.

ISO 3166-1 alpha 2 국가 또는 리전 코드를 사용하는 규칙이나 표현식을 만드는 경우 Google Cloud Armor는 각 코드를 독립적으로 처리합니다. Google Cloud Armor 규칙과 표현식은 리전 코드를 명시적으로 사용하여 요청을 허용하거나 거부합니다.

  • 다음 표현식은 IP 주소 1.2.3.4의 요청과 일치하며 사용자 에이전트 헤더의 Godzilla 문자열을 포함합니다.

    inIpRange(origin.ip, '1.2.3.4/32') && has(request.headers['user-agent']) && request.headers['user-agent'].contains('Godzilla')
    
  • 다음 표현식은 특정 값을 가진 쿠키가 있는 요청과 일치합니다.

    has(request.headers['cookie']) && request.headers['cookie'].contains('cookie_name=cookie_value')
    
  • 다음 표현식은 AU 리전의 요청과 일치합니다.

    origin.region_code == 'AU'
    
  • 다음 표현식은 지정된 IP 범위가 아닌 AU 리전의 요청과 일치합니다.

    origin.region_code == "AU" && !inIpRange(origin.ip, '1.2.3.0/24')
    
  • URI가 정규 표현식과 일치하면 다음 표현식은 요청과 일치합니다.

    request.path.matches('/bad_path/')
    
  • 다음 표현식은 Base64로 디코딩된 user-id 헤더 값에 특정 값이 포함되면 요청과 일치합니다.

    has(request.headers['user-id']) && request.headers['user-id'].base64Decode().contains('myValue')
    
  • 다음 표현식은 SQLi 공격에 대해 사전 구성된 표현식 세트 일치를 사용합니다.

    evaluatePreconfiguredExpr('sqli-stable')
    

다음 안내에서는 기존 외부 HTTP(S) 부하 분산기와 백엔드 서비스에 적용할 보안 정책을 만든다고 가정합니다. 필드를 입력하는 방법에 대한 예시는 예시 만들기를 참조하세요.

Console

Google Cloud Armor 보안 정책 및 규칙을 만들고 백엔드 서비스에 보안 정책을 연결합니다.

  1. Google Cloud Console에서 네트워크 보안 페이지로 이동합니다.

    네트워크 보안 페이지로 이동

  2. 정책 페이지에서 정책 만들기를 클릭합니다.

  3. 이름 필드에 정책 이름을 입력합니다.

  4. 원하는 경우 정책 설명을 입력합니다.

  5. 기본 규칙 작업에서 액세스를 허용하는 기본 규칙에 허용을 선택하거나 IP 주소나 IP 주소 범위에 대한 액세스를 금지하는 기본 규칙에 거부를 선택합니다.

    기본 규칙은 다른 규칙이 적용되지 않는 경우에만 적용되는 우선순위가 가장 낮은 규칙입니다.

  6. 거부 규칙을 만드는 경우 거부 상태 메시지를 선택합니다. 액세스 권한이 없는 사용자가 액세스 권한을 얻으려고 하면 Google Cloud Armor에 표시되는 오류 메시지입니다.

  7. 만들 규칙 유형에 관계없이 다음 단계를 클릭합니다.

규칙을 추가합니다.

  1. 규칙 추가를 클릭합니다.
  2. 원하는 경우 규칙 설명을 입력합니다.
  3. 모드를 선택합니다.

    • 기본 모드: IP 주소 또는 범위를 기준으로 트래픽을 허용하거나 거부합니다.
    • 고급 모드: 규칙 표현식을 기준으로 트래픽을 허용하거나 거부합니다.
  4. 일치 필드에서 규칙이 적용되는 조건을 지정합니다.

    • 기본 모드: 규칙에서 일치시킬 IP 주소 또는 IP 범위를 입력합니다.
    • 고급 모드: 들어오는 요청을 평가할 표현식 또는 하위 표현식을 입력합니다. 표현식을 작성하는 방법에 대한 자세한 내용은 커스텀 규칙 언어 참조를 확인하세요.
  5. 작업에서 규칙이 일치하는 경우 허용 또는 거부를 선택하여 트래픽을 허용하거나 거부합니다.

  6. 미리보기 모드를 사용 설정하려면 사용 설정 체크박스를 선택합니다. 미리보기 모드에서 규칙 작동 방식을 볼 수 있지만 규칙이 사용 설정되어 있지 않습니다.

  7. 규칙 우선순위를 입력합니다. 우선순위는 0~2,147,483,646의 양의 정수일 수 있습니다. 평가 순서에 대한 자세한 내용은 규칙 평가 순서를 참조하세요.

  8. 완료를 클릭합니다.

  9. 규칙을 추가하려면 규칙 추가를 클릭하고 이전 단계를 반복합니다. 그렇지 않으면 다음 단계를 클릭합니다.

대상에 정책을 적용합니다.

  1. 대상 추가를 클릭합니다.
  2. 대상 목록에서 대상을 선택합니다.
  3. 더 많은 대상을 추가하려면 대상 추가를 클릭합니다.
  4. 완료를 클릭합니다.
  5. 정책 만들기를 클릭합니다.

gcloud

  1. 새 Google Cloud Armor 보안 정책을 만들려면 gcloud compute security-policies create 명령어를 사용합니다. NAMEDESCRIPTION을 보안 정책의 이름과 설명으로 바꿉니다.

    gcloud compute security-policies create NAME \
       [--file-format=FILE_FORMAT | --description=DESCRIPTION] \
       [--file-name=FILE_NAME]
    

    예를 들면 다음과 같습니다.

    gcloud compute security-policies create my-policy \
        --description "block bad traffic"
    
  2. 보안 정책에 규칙을 추가하려면 gcloud compute security-policies rules create PRIORITY 명령어를 사용합니다. PRIORITY를 정책의 규칙에 할당된 우선순위로 바꿉니다. 규칙 우선순위의 작동 방식에 대한 자세한 내용은 규칙 평가 순서를 참조하세요.

    gcloud compute security-policies rules create PRIORITY  \
       [--security-policy POLICY_NAME] \
       [--description DESCRIPTION] \
        --src-ip-ranges IP_RANGE,... | --expression EXPRESSION \
        --action=[ allow | deny-403 | deny-404 | deny-502 ]  \
       [--preview]
    

    예를 들어 다음 명령어는 IP 주소 범위 192.0.2.0/24 및 198.51.100.0/24에서 트래픽을 차단하는 규칙을 추가합니다. 규칙 우선순위는 1000이며 이 규칙은 my-policy라는 정책의 규칙입니다.

    gcloud compute security-policies rules create 1000 \
        --security-policy my-policy \
        --description "block traffic from 192.0.2.0/24 and 198.51.100.0/24" \
        --src-ip-ranges "192.0.2.0/24","198.51.100.0/24" \
        --action "deny-403"
    

    --preview 플래그를 추가하면 규칙이 정책에 추가되지만 시행되지 않으며 규칙을 트리거하는 트래픽은 로깅만 됩니다.

    gcloud compute security-policies rules create 1000 \
        --security-policy my-policy \
        --description "block traffic from 192.0.2.0/24 and 198.51.100.0/24" \
        --src-ip-ranges "192.0.2.0/24","198.51.100.0/24" \
        --action "deny-403" \
        --preview
    

    --expression 플래그를 사용하여 커스텀 규칙 언어 참조에서 커스텀 조건을 지정합니다. 다음 명령어는 IP 주소 1.2.3.4에서 들어오는 트래픽을 허용하고 user-agent 헤더의 Godzilla 문자열을 포함하는 규칙을 추가합니다.

    gcloud compute security-policies rules create 1000 \
        --security-policy my-policy \
        --expression "inIpRange(origin.ip, '1.2.3.4/32') && has(request.headers['user-agent']) && request.headers['user-agent'].contains('Godzilla')" \
        --action allow \
        --description "Block User-Agent 'Godzilla'"
    

    다음 명령어는 요청 쿠키에 특정 값이 포함되면 요청을 차단하는 규칙을 추가합니다.

    gcloud compute security-policies rules create 1000 \
        --security-policy my-policy \
        --expression "has(request.headers['cookie']) && request.headers['cookie'].contains('cookie_name=cookie_value')" \
        --action "deny-403" \
        --description "Cookie Block"
    

    다음 명령어는 리전 AU의 요청을 차단하는 규칙을 추가합니다.

    gcloud compute security-policies rules create 1000 \
        --security-policy my-policy \
        --expression "origin.region_code == 'AU'" \
        --action "deny-403" \
        --description "AU block"
    

    다음 명령어는 지정된 IP 범위에 없는 AU 리전의 요청을 차단하는 규칙을 추가합니다.

    gcloud compute security-policies rules create 1000 \
        --security-policy my-policy \
        --expression "origin.region_code == 'AU' && !inIpRange(origin.ip, '1.2.3.0/24')" \
        --action "deny-403" \
        --description "country and IP block"
    

    다음 명령어는 정규 표현식과 일치하는 URI가 있는 요청을 차단하는 규칙을 추가합니다.

    gcloud compute security-policies rules create 1000 \
        --security-policy my-policy \
        --expression "request.path.matches('/bad_path/)')" \
        --action "deny-403" \
        --description "regex block"
    

    다음 명령어는 user-id 헤더의 Base64 디코딩 값에 특정 값이 포함된 경우 요청을 차단하는 규칙을 추가합니다.

    gcloud compute security-policies rules create 1000 \
        --security-policy my-policy \
        --expression "has(request.headers['user-id']) && request.headers['user-id'].base64Decode().contains('myValue')" \
        --action "deny-403" \
        --description "country and IP block"
    

    다음 명령어는 사전 구성된 표현식 세트를 사용하여 SQLi 공격을 완화하는 규칙을 추가합니다.

    gcloud compute security-policies rules create 1000 \
        --security-policy my-policy \
        --expression "evaluatePreconfiguredExpr('sqli-stable')" \
        --action "deny-403"
    

    다음 명령어는 명명된 IP 주소 목록의 모든 IP 주소에서 액세스할 수 있도록 허용하는 사전 구성된 표현식을 사용하는 규칙을 추가합니다.

    gcloud compute security-policies rules create 1000 \
        --security-policy my-policy \
        --expression "evaluatePreconfiguredExpr('sourceiplist-fastly')" \
        --action "allow"
    

Adaptive Protection 사용

Adaptive Protection은 보안 정책별 기준에 따라 적용됩니다.

Console

보안 정책에 대해 Adaptive Protection을 활성화하려면 다음 안내를 따르세요.

  1. Google Cloud Console에서 네트워크 보안 페이지로 이동합니다.

    네트워크 보안 페이지로 이동

  2. 정책 페이지에서 보안 정책의 이름을 클릭합니다.

  3. 수정을 클릭합니다.

  4. Adaptive Protection에서 사용 설정을 선택합니다.

  5. 업데이트를 클릭합니다.

보안 정책에 대해 Adaptive Protection을 비활성화하려면 다음 안내를 따르세요.

  1. Google Cloud Console에서 네트워크 보안 페이지로 이동합니다.

    네트워크 보안 페이지로 이동

  2. 정책 페이지에서 보안 정책의 이름을 클릭합니다.

  3. 수정을 클릭합니다.

  4. Adaptive Protection에서 사용 설정을 선택 취소합니다.

  5. 업데이트를 클릭합니다.

gcloud

보안 정책에 대해 Adaptive Protection을 활성화하려면 다음 안내를 따르세요.

gcloud compute security-policies update MY-SECURITY-POLICY \
   --enable-layer7-ddos-defense

보안 정책에 대해 Adaptive Protection을 비활성화하려면 다음 안내를 따르세요.

gcloud compute security-policies update MY-SECURITY-POLICY \
   --no-enable-layer7-ddos-defense

사용 가능한 사전 구성된 규칙 나열

Google Cloud Armor에서 제공하는 ModSecurity 핵심 규칙 세트와 같은 사전 정의된 애플리케이션 보호 규칙과 서명을 보려면 사전 구성된 규칙을 나열합니다. 이러한 사전 구성된 규칙에는 Google Cloud Armor가 들어오는 요청을 평가하는 데 사용하는 여러 내장 서명이 포함되어 있습니다. 커스텀 규칙 언어 참조를 사용하여 이러한 사전 구성된 규칙을 새로운 규칙이나 기존 규칙에 추가합니다.

자세한 내용은 사전 구성된 규칙을 참조하세요.

gcloud

  1. gcloud compute security-policies list-preconfigured-expression-sets 명령어를 실행합니다.

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

    다음 예시에서는 이 명령어의 출력 형식을 보여줍니다.

    EXPRESSION_SET
    expression-set-1
       RULE_ID
       expression-set-1-id-1
       expression-set-1-id-2
    expression-set-2
       alias-1
       RULE_ID
       expression-set-2-id-1
       expression-set-2-id-2
    

    다음 예시에는 이 명령어의 실제 출력 샘플이 포함되어 있습니다. 실제 출력에는 Google Cloud Armor WAF 규칙 조정에 나와 있는 모든 규칙이 포함됩니다.

    gcloud compute security-policies list-preconfigured-expression-sets
    
    EXPRESSION_SET
    sqli-canary
        RULE_ID
        owasp-crs-v030001-id942110-sqli
        owasp-crs-v030001-id942120-sqli
        …
    xss-canary
        RULE_ID
        owasp-crs-v030001-id941110-xss
        owasp-crs-v030001-id941120-xss
    …
    sourceiplist-fastly
    sourceiplist-cloudflare
    sourceiplist-imperva
    

보안 정책 나열

다음 안내에 따라 현재 프로젝트 또는 지정한 프로젝트의 모든 Google Cloud Armor 보안 정책을 나열합니다.

Console

  1. Google Cloud Console에서 네트워크 보안 페이지로 이동합니다.

    네트워크 보안 페이지로 이동

  2. 특정 정책을 보려면 보안 정책 페이지의 정책 목록에서 이름을 클릭합니다.

gcloud

gcloud compute security-policies list

예를 들면 다음과 같습니다.

gcloud compute security-policies list
NAME
my-policy

자세한 내용은 gcloud compute security-policies list를 참조하세요.

보안 정책 업데이트

다음 안내를 따라 Google Cloud Armor 보안 정책을 업데이트합니다. 예를 들어 정책 설명을 수정하거나, 기본 규칙 동작을 수정하거나, 대상 백엔드 서비스를 변경하거나, 새 규칙을 추가할 수 있습니다.

Console

  1. Google Cloud Console에서 네트워크 보안 페이지로 이동합니다.

    네트워크 보안 페이지로 이동

  2. 특정 정책을 업데이트하려면 보안 정책 페이지의 정책 목록에서 업데이트할 정책의 메뉴를 클릭합니다.

    • 기본 규칙 작업의 정책 설명을 업데이트하려면 수정을 선택하고 원하는 대로 변경한 후 업데이트을 클릭합니다.
    • 규칙을 추가하려면 규칙 추가를 선택한 후 보안 정책에 규칙 추가의 안내를 따릅니다.
    • 정책의 대상 백엔드 서비스를 변경하려면 대상에 정책 적용을 선택한 후 대상 추가를 클릭한 다음 대상을 선택한 후 추가를 클릭합니다.

gcloud

보안 정책을 업데이트하려면 다음 gcloud 명령줄 도구 안내를 사용합니다.

보안 정책 내보내기

gcloud 명령줄 도구를 사용하여 Google Cloud Armor 보안 정책을 YAML 또는 JSON 파일로 내보낼 수 있습니다. 정책을 내보내면 소스 제어에서 수정 또는 저장할 수 있는 정책 복사본을 검색할 수 있습니다.

gcloud

  1. 다음 명령어에서 NAME은 보안 정책의 이름입니다. 유효한 파일 형식은 YAML 및 JSON입니다. 파일 형식을 제공하지 않으면 Google Cloud Armor는 기본 YAML을 사용합니다.

    gcloud compute security-policies export NAME \
        --file-name FILE_NAME  \
        --file-format FILE_FORMAT
    

    다음 예시에서는 my-policy 보안 정책을 YAML 형식의 my-file 파일로 내보냅니다.

    gcloud compute security-policies export my-policy \
        --file-name my-file \
        --file-format yaml
     

    다음 예시에서는 내보낸 보안 정책을 보여줍니다.

    description: my description
    fingerprint: PWfLGDWQDLY=
    id: '123'
    name: my-policy
    rules:
    - action: allow
      description: default rule
      match:
          config:
            srcIpRanges:
            - '*'
          versionedExpr: SRC_IPS_V1
        preview: false
        priority: 2147483647
      selfLink: https://www.googleapis.com/compute/v1/projects/my-project/global/securityPolicies/my-policy
      
  2. 내보낸 파일을 텍스트 편집기로 수정한 후 import 명령어를 사용하여 Google Cloud로 다시 가져올 수 있습니다.

보안 정책 가져오기

gcloud 명령줄 도구를 사용하여 YAML 또는 JSON 파일에서 Google Cloud Armor 보안 정책을 가져올 수 있습니다. import 명령어를 사용하여 기존 정책의 규칙을 업데이트할 수 없습니다. 대신 보안 정책의 단일 규칙 업데이트 절차를 사용하여 규칙을 하나씩 업데이트하거나 보안 정책의 여러 규칙을 원자적으로 업데이트 절차를 사용하여 한 번에 업데이트해야 합니다.

gcloud

보안 정책을 가져오려면 gcloud compute security-policies import NAME 명령어를 사용합니다. NAME을 가져오려는 보안 정책의 이름으로 바꿉니다. 파일 형식을 제공하지 않으면 파일 구조에 따라 올바른 형식으로 간주됩니다. 구조가 유효하지 않으면 오류가 표시됩니다.

gcloud compute security-policies import NAME \
    --file-name FILE_NAME  \
   [--file-format FILE_FORMAT]

예를 들어 다음 명령어는 my-file 파일을 가져와 my-policy 정책을 업데이트합니다.

gcloud compute security-policies import my-policy \
    --file-name my-file \
    --file-format json

정책을 가져올 때 정책의 디지털 지문이 오래되면 Google Cloud Armor에 오류가 표시됩니다. 이는 마지막으로 내보낸 이후에 정책이 수정되었음을 의미합니다. 이 문제를 해결하려면 정책에서 describe 명령어를 사용하여 최신 디지털 지문을 가져옵니다. 설명한 정책과 개발자 정책 간의 차이점을 병합한 후 오래된 디지털 지문을 최신 디지털 지문으로 바꿉니다.

보안 정책 삭제

다음 안내를 따라 Google Cloud Armor 보안 정책을 삭제합니다. 삭제하려면 먼저 정책에서 모든 백엔드 서비스를 삭제해야 합니다.

Console

  1. Google Cloud Console에서 네트워크 보안 페이지로 이동합니다.

    네트워크 보안 페이지로 이동

  2. 보안 정책 페이지에서 삭제하려는 보안 정책 이름 옆의 체크박스를 선택합니다.

  3. 페이지 오른쪽 상단에서 삭제를 클릭합니다.

gcloud

gcloud compute security-policies delete NAME을 사용합니다. NAME을 보안 정책 이름으로 바꿉니다.

gcloud compute security-policies delete NAME

백엔드 서비스에 보안 정책 연결

다음 안내를 따라 Google Cloud Armor 보안 정책을 백엔드 서비스에 연결합니다. 보안 정책을 백엔드 서비스 두 개 이상에 연결할 수 있지만 백엔드 서비스에는 보안 정책 하나만 연결될 수 있습니다.

Console

  1. Google Cloud Console에서 네트워크 보안 페이지로 이동합니다.

    네트워크 보안 페이지로 이동

  2. 보안 정책 페이지에서 보안 정책의 이름을 클릭합니다. 정책 세부정보 페이지가 표시됩니다.

  3. 페이지 중간에 있는 대상 탭을 클릭합니다.

  4. 새 대상에 정책 적용을 클릭합니다.

  5. 대상 추가를 클릭합니다.

  6. 대상 목록에서 대상을 선택한 다음 추가를 클릭합니다.

gcloud

gcloud compute backend-services 명령어를 사용합니다.

gcloud compute backend-services update my-backend \
    --security-policy my-policy

백엔드 서비스에서 보안 정책 삭제

다음 안내를 따라 백엔드 서비스에서 Google Cloud Armor 보안 정책을 삭제합니다.

Console

  1. Google Cloud Console에서 네트워크 보안 페이지로 이동합니다.

    네트워크 보안 페이지로 이동

  2. 보안 정책 페이지에서 보안 정책의 이름을 클릭합니다. 정책 세부정보 페이지가 표시됩니다.

  3. 페이지 중간에 있는 대상 탭을 클릭합니다.

  4. 정책을 삭제할 대상 백엔드 서비스를 선택합니다.

  5. 삭제를 클릭합니다.

  6. 대상 삭제 메시지에서 삭제를 클릭합니다.

gcloud

gcloud compute backend-services 명령어를 사용합니다.

gcloud compute backend-services update my-backend \
    --security-policy ""

보안 정책에 규칙 추가

다음 안내를 따라 Google Cloud Armor 보안 정책에 규칙을 추가합니다.

Console

  1. Google Cloud Console에서 네트워크 보안 페이지로 이동합니다.

    네트워크 보안 페이지로 이동

  2. 보안 정책 페이지에서 보안 정책의 이름을 클릭합니다. 정책 세부정보 페이지가 표시됩니다.

  3. 페이지 중간에 있는 규칙 탭을 클릭합니다.

  4. 규칙 추가를 클릭합니다.

  5. 원하는 경우 규칙 설명을 입력합니다.

  6. 모드를 선택합니다.

    • 기본 모드: IP 주소 또는 범위를 기준으로 트래픽을 허용하거나 거부합니다.
    • 고급 모드: 규칙 표현식을 기준으로 트래픽을 허용하거나 거부합니다.
  7. 일치 필드에서 규칙이 적용되는 조건을 지정합니다.

    • 기본 모드: 규칙에서 일치하는 IP 주소 범위를 1개에서 5개까지 입력합니다.
    • 고급 모드: 들어오는 요청을 평가할 표현식 또는 하위 표현식을 입력합니다. 표현식을 작성하고 다음 예시를 읽는 방법에 대한 자세한 내용은 커스텀 규칙 언어 참조를 확인하세요.

      • 다음 표현식은 IP 주소 1.2.3.4의 요청과 일치하며 사용자 에이전트 헤더의 Godzilla 문자열을 포함합니다.

        inIpRange(origin.ip, '1.2.3.4/32') && has(request.headers['user-agent']) && request.headers['user-agent'].contains('Godzilla')
        
      • 다음 표현식은 특정 값을 가진 쿠키가 있는 요청과 일치합니다.

        has(request.headers['cookie']) && request.headers['cookie'].contains('cookie_name=cookie_value')
        
      • 다음 표현식은 AU 리전의 요청과 일치합니다.

        origin.region_code == 'AU'
        
      • 다음 표현식은 지정된 IP 범위가 아닌 AU 리전의 요청과 일치합니다.

        origin.region_code == "AU" && !inIpRange(origin.ip, '1.2.3.0/24')
        
      • URI가 정규 표현식과 일치하면 다음 표현식은 요청과 일치합니다.

        request.path.matches('/bad_path/)')
        
      • 다음 표현식은 Base64로 디코딩된 user-id 헤더 값에 특정 값이 포함되면 요청과 일치합니다.

        has(request.headers['user-id']) && request.headers['user-id'].base64Decode().contains('myValue')
        
      • 다음 표현식은 사전 구성된 표현식 세트를 사용하여 SQLi 공격과 일치시킵니다.

        evaluatePreconfiguredExpr('sqli-stable')
        
  8. 작업허용 또는 거부를 선택합니다.

  9. 거부 규칙을 만드는 경우 거부 상태 메시지를 선택합니다.

  10. 규칙에 대한 미리보기 모드를 사용 설정하려면 사용 설정 체크박스를 선택합니다.

  11. 우선순위 필드에 양의 정수를 입력합니다.

  12. 추가를 클릭합니다.

gcloud

gcloud compute security-policies rules create PRIORITY 명령어를 사용합니다. PRIORITY를 정책에 있는 규칙의 우선순위로 바꿉니다.

gcloud compute security-policies rules create PRIORITY \
    --security-policy POLICY_NAME \
    --description DESCRIPTION \
    --src-ip-ranges IP_RANGES | --expression EXPRESSION \
    --action=[ allow | deny-403 | deny-404 | deny-502 ] \
    --preview

예를 들어 다음 명령어는 IP 주소 범위 192.0.2.0/24 및 198.51.100.0/24에서 트래픽을 차단하는 규칙을 추가합니다. 규칙 우선순위는 1000이며 이 규칙은 my-policy라는 정책의 규칙입니다.

gcloud compute security-policies rules create 1000 \
    --security-policy my-policy \
    --description "block traffic from 192.0.2.0/24 and 198.51.100.0/24" \
    --src-ip-ranges "192.0.2.0/24","198.51.100.0/24" \
    --action "deny-403"

--expression 플래그를 사용하여 커스텀 규칙 언어 참조에서 조건을 지정합니다. 다음 명령어는 IP 주소 1.2.3.4에서 들어오는 트래픽을 허용하고 user-agent 헤더의 Godzilla 문자열을 포함하는 규칙을 추가합니다.

gcloud compute security-policies rules create 1000 \
    --security-policy my-policy \
    --expression "inIpRange(origin.ip, '1.2.3.4/32') && has(request.headers['user-agent']) && request.headers['user-agent'].contains('Godzilla')" \
    --action allow \
    --description "Block User-Agent 'Godzilla'"

다음 명령어는 요청 쿠키에 특정 값이 포함되면 요청을 차단하는 규칙을 추가합니다.

gcloud compute security-policies rules create 1000 \
    --security-policy my-policy \
    --expression "has(request.headers['cookie']) && request.headers['cookie'].contains('80=BLAH')" \
    --action deny-403 \
    --description "Cookie Block"

다음 명령어는 리전 AU의 요청을 차단하는 규칙을 추가합니다.

gcloud compute security-policies rules create 1000 \
    --security-policy my-policy \
    --expression "origin.region_code == 'AU'" \
    --action deny-403 \
    --description "AU block"

다음 명령어는 지정된 IP 범위에 없는 AU 리전의 요청을 차단하는 규칙을 추가합니다.

gcloud compute security-policies rules create 1000 \
    --security-policy my-policy \
    --expression "origin.region_code == "AU" && !inIpRange(origin.ip, '1.2.3.0/24')" \
    --action deny-403 \
    --description "country and IP block"

다음 명령어는 정규 표현식과 일치하는 URI가 있는 요청을 차단하는 규칙을 추가합니다.

gcloud compute security-policies rules create 1000 \
    --security-policy my-policy \
    --expression "request.path.matches('/bad_path/)')" \
    --action deny-502 \
    --description "regex block"

다음 명령어는 user-id 헤더의 Base64 디코딩 값에 특정 값이 포함된 경우 요청을 차단하는 규칙을 추가합니다.

gcloud compute security-policies rules create 1000 \
    --security-policy my-policy \
    --expression "has(request.headers['user-id']) && request.headers['user-id'].base64Decode().contains('myValue')" \
    --action deny-403 \
    --description "country and IP block"

다음 명령어는 사전 구성된 표현식 세트를 사용하여 SQLi 공격을 완화하는 규칙을 추가합니다.

gcloud compute security-policies rules create 1000 \
    --security-policy my-policy \
    --expression "evaluatePreconfiguredExpr('sqli-stable')" \
    --action deny-403

보안 정책의 규칙 나열

다음 안내를 따라 Google Cloud Armor 보안 정책의 규칙을 나열합니다.

Console

  1. Google Cloud Console에서 네트워크 보안 페이지로 이동합니다.

    네트워크 보안 페이지로 이동

  2. 보안 정책 페이지에서 보안 정책의 이름을 클릭합니다. 정책 세부정보 페이지가 표시되고 정책 규칙이 페이지 중간의 규칙 탭에 나열됩니다.

gcloud

다음 gcloud 명령어를 사용하여 보안 정책 하나의 모든 규칙을 정책 설명과 함께 나열합니다.

gcloud compute security-policies describe NAME \

다음 gcloud 명령어를 사용하여 지정된 보안 정책에서 지정된 우선순위로 규칙을 설명합니다.

gcloud compute security-policies rules describe PRIORITY \
    --security-policy POLICY_NAME

예를 들어 다음 명령어는 보안 정책 my-policy에서 우선순위가 1,000인 규칙을 설명합니다.

gcloud compute security-policies rules describe 1000 \
    --security-policy my-policy

결과:

action: deny(403)
description: block traffic from 192.0.2.0/24 and 198.51.100.0/24
kind: compute#securityPolicyRule
match:
  srcIpRanges:
  - '192.0.2.0/24'
  - '198.51.100.0/24'
preview: false
priority: 1000

보안 정책의 단일 규칙 업데이트

다음 안내를 따라 Google Cloud Armor 보안 정책에서 규칙 하나를 업데이트합니다. 여러 규칙을 원자적으로 업데이트하려면 보안 정책의 여러 규칙을 원자적으로 업데이트를 참조하세요.

Console

  1. Google Cloud Console에서 네트워크 보안 페이지로 이동합니다.

    네트워크 보안 페이지로 이동

  2. 보안 정책 페이지에서 보안 정책의 이름을 클릭합니다. 정책 세부정보 페이지가 표시됩니다.

  3. 페이지 중간에 있는 규칙 탭을 클릭합니다.

  4. 업데이트할 규칙 옆에 있는 수정을 클릭합니다. 규칙 수정 페이지가 표시됩니다.

  5. 원하는 대로 변경하고 업데이트를 클릭합니다.

gcloud

지정된 보안 정책에서 지정된 우선순위로 규칙을 업데이트하려면 다음 명령어를 사용합니다. 다음 명령어를 사용하면 한 번에 하나의 보안 정책만 업데이트할 수 있습니다.

gcloud compute security-policies rules update PRIORITY [ \
    --security-policy POLICY_NAME  \
    --description DESCRIPTION  \
    --src-ip-ranges IP_RANGES  | --expression EXPRESSION \
    --action=[ allow | deny-403 | deny-404 | deny-502 ]  \
    --preview
  ]
  

예를 들어 다음 명령어는 IP 주소 범위 192.0.2.0/24에서 들어오는 트래픽을 허용하도록 우선순위가 1111인 규칙을 업데이트합니다.

gcloud compute security-policies rules update 1111 \
    --security-policy my-policy \
    --description "allow traffic from 192.0.2.0/24" \
    --src-ip-ranges "192.0.2.0/24" \
    --action "allow"

이 명령어에 대한 자세한 내용은 gcloud compute security-policies rules update 항목을 참조하세요.

규칙 우선순위를 업데이트하려면 REST API를 사용해야 합니다. 자세한 내용은 securityPolicies.patchRule를 참조하세요.

보안 정책의 여러 규칙을 원자적으로 업데이트

원자 업데이트는 단일 업데이트에서 여러 규칙에 변경사항을 적용합니다. 규칙을 하나씩 업데이트한 경우 이전 규칙과 새 규칙이 단기간 동안 함께 작동할 수 있으므로 의도하지 않은 동작이 발생할 수 있습니다.

여러 규칙을 원자적으로 업데이트하려면 현재 보안 정책을 JSON 또는 YAML 파일로 내보낸 후 수정합니다. 수정된 파일을 사용하여 새 보안 정책을 만든 후 관련 백엔드 서비스의 보안 정책을 전환합니다.

gcloud

  1. 다음 예시와 같이 업데이트할 정책을 내보냅니다.

    gcloud compute security-policies export my-policy \
        --file-name my-file \
        --file-format yaml
    

    내보낸 정책은 다음 예시와 유사합니다.

    description: my description
    fingerprint: PWfLGDWQDLY=
    id: '123'
    name: my-policy
    rules:
    - action: deny(404)
      description: my-rule-1
      match:
        expr:
          expression: evaluatePreconfiguredExpr('xss-stable')
        versionedExpr: SRC_IPS_V1
      preview: false
      priority: 1
    - action: allow
      description: my-rule-2
      match:
        config:
          srcIpRanges:
          - '1.2.3.4'
        versionedExpr: SRC_IPS_V1
      preview: false
      priority: 2
    - action: deny
      description: default rule
      kind: compute#securityPolicyRule
      match:
        config:
          srcIpRanges:
          - '*'
        versionedExpr: SRC_IPS_V1
      preview: false
      priority: 2147483647
    selfLink: https://www.googleapis.com/compute/v1/projects/my-project/global/securityPolicies/my-policy
    
  2. 텍스트 편집기를 사용하여 정책을 수정합니다. 예를 들어 기존 규칙 우선순위를 수정하고 새 규칙을 추가할 수 있습니다.

    description: my description
    fingerprint: PWfLGDWQDLY=
    id: '123'
    name: my-policy
    rules:
    - action: deny(404)
      description: my-rule-1
      match:
        expr:
          expression: evaluatePreconfiguredExpr('xss-stable')
        versionedExpr: SRC_IPS_V1
      preview: false
      priority: 1
    - action: allow
      description: my-new-rule
      match:
        config:
          srcIpRanges:
          - '1.2.3.1'
        versionedExpr: SRC_IPS_V1
      preview: false
      priority: 10
    - action: allow
      description: my-rule-2
      match:
        config:
          srcIpRanges:
          - '1.2.3.4'
        versionedExpr: SRC_IPS_V1
      preview: false
      priority: 11
    - action: deny
      description: default rule
      kind: compute#securityPolicyRule
      match:
        config:
          srcIpRanges:
          - '*'
        versionedExpr: SRC_IPS_V1
      preview: false
      priority: 2147483647
    selfLink: https://www.googleapis.com/compute/v1/projects/my-project/global/securityPolicies/my-policy
    
  3. 다음 예시와 같이 새 Google Cloud Armor 보안 정책을 만들고 수정된 파일 이름과 형식을 지정합니다.

    gcloud compute security-policies create new-policy \
        --description "allow-listed traffic" \
        --file-name modified-policy \
        --file-format yaml
    
  4. 다음 예시와 같이 관련 백엔드 서비스에서 이전 보안 정책을 삭제합니다.

    gcloud compute backend-services update my-backend \
        --security-policy ""
    
  5. 다음 예시와 같이 새 보안 정책을 백엔드 서비스에 추가합니다.

    gcloud compute backend-services update my-backend \
        --security-policy new-policy
    
  6. 이전 정책을 사용하지 않을 경우 삭제합니다.

    gcloud compute security-policies delete my-policy
    

보안 정책에서 규칙 삭제

다음 안내를 따라 Google Cloud Armor 보안 정책에서 규칙을 삭제합니다.

Console

  1. Google Cloud Console에서 네트워크 보안 페이지로 이동합니다.

    네트워크 보안 페이지로 이동

  2. 보안 정책 페이지에서 보안 정책의 이름을 클릭합니다. 정책 세부정보 페이지가 표시됩니다.

  3. 페이지 중간의 규칙 탭에서 삭제할 규칙 옆에 있는 체크박스를 선택합니다.

  4. 삭제를 클릭합니다.

gcloud

지정된 보안 정책에서 지정된 우선순위로 규칙을 삭제하려면 다음 명령어를 사용합니다. 한 번에 보안 정책 하나만 수정할 수 있지만 한 번에 규칙 여러 개를 삭제할 수 있습니다.

gcloud compute security-policies rules delete PRIORITY [...] [
    --security-policy POLICY_NAME \
  ]

예를 들면 다음과 같습니다.

gcloud compute security-policies rules delete 1000 \
    --security-policy my-policy

HTTP(S) 요청 로깅 사용 설정

보안 정책 이름, 일치 규칙 우선순위, 관련 작업, 관련 정보의 Google Cloud Armor 로그는 HTTP(S) 부하 분산 로깅의 일부로 로깅됩니다. 새 백엔드 서비스 로깅은 기본적으로 중지되어 있으므로 Google Cloud Armor의 전체 로깅 정보를 기록하려면 HTTP(S) 부하 분산 로깅을 사용 설정해야 합니다.

HTTP(S) 부하 분산 로깅을 사용하면 거부된 HTTP(S) 요청과 허용된 HTTP(S) 요청을 자세히 볼 수 있습니다. 예를 들어 거부된 요청을 보려면 jsonPayload.enforcedSecurityPolicy.outcome="DENY" 또는 jsonPayload.statusDetails="denied_by_security_policy"와 같은 필터를 사용하면 됩니다.

HTTP(S) 부하 분산 로깅을 사용 설정하려면 HTTP(S) 부하 분산 로깅 및 모니터링을 참조하세요.

로그 보기

Google Cloud Armor 보안 정책 로그는 Google Cloud Console에서만 볼 수 있습니다.

Console

  1. Google Cloud Console에서 네트워크 보안 페이지로 이동합니다.

    네트워크 보안 페이지로 이동

  2. 보안 정책 페이지의 보안 정책 행에서 로그를 보려는 정책의 메뉴를 클릭합니다.

  3. 로그 보기를 선택합니다.

다음 단계