보안 정책 구성

Media CDN은 Google Cloud Armor 보안 정책을 사용하여 원치 않는 트래픽이 서비스에 도달하지 못하도록 합니다. 다음을 기준으로 요청을 허용하거나 거부할 수 있습니다.

  • IPv4 및 IPv6 주소 및 범위(CIDR)
  • 국가 코드(지역)
  • 레이어 7 필터링

이러한 기능을 사용하면 콘텐츠 라이선스 제한이 있는 특정 위치의 사용자로 콘텐츠 다운로드를 제한하고, 회사 IP 주소만 테스트 또는 스테이징 엔드포인트에 액세스하도록 허용하고, 알려진 잘못된 클라이언트 IP 주소 목록을 거부할 수 있습니다.

구성 가능한 이름과 값이 있는 커스텀 헤더를 삽입하여 Google Cloud Armor에서 허용하는 요청을 데코레이션할 수 있습니다.

Google Cloud Armor 보안 정책은 캐시된 콘텐츠와 캐시 부적중을 포함하여 Media CDN에서 제공되는 모든 콘텐츠에 적용됩니다.

Google Cloud Armor 보안 정책은 Media CDN 서비스별로 구성됩니다. 해당 서비스의 IP 주소(또는 호스트 이름)를 대상으로 하는 모든 요청에는 보안 정책이 일관되게 적용됩니다. 서비스마다 서로 다른 보안 정책을 적용할 수 있으며 필요에 따라 서로 다른 지역에 대해 여러 서비스를 만들 수 있습니다.

사용자별 수준에서 콘텐츠를 보다 세밀하게 보호하려면 Google Cloud Armor 정책과 함께 서명된 URL 및 서명된 쿠키를 사용하는 것이 좋습니다.

Media CDN은 다음 값 중 하나로 설정된 경우 레이어 7 헤더 필터링 에지 보안 정책의 규칙 평가 중에 referer 헤더를 고려하지 않습니다.

  • 복수 URL
  • 상대 URL
  • 사용자 정보 또는 프래그먼트 구성요소를 포함하는 유효한 절대 URL

보안 정책 구성

다음 안내에 따라 보안 정책을 구성합니다.

시작하기 전에

Google Cloud Armor 보안 정책을 Media CDN 서비스에 연결하려면 다음을 확인합니다.

  • Google Cloud Armor에 익숙해야 합니다.
  • 정책을 적용할 기존 Media CDN 서비스가 있어야 합니다.
  • 선택사항이지만 권장되는 방법은 차단된 요청을 식별할 수 있도록 Media CDN 서비스에 대한 로깅을 사용 설정하는 것입니다.

또한 Media CDN 서비스에 대한 보안 정책을 승인하고 만들고 연결하려면 다음 Identity and Access Management 권한이 필요합니다.

  • compute.securityPolicies.addAssociation
  • compute.securityPolicies.create
  • compute.securityPolicies.delete
  • compute.securityPolicies.get
  • compute.securityPolicies.list
  • compute.securityPolicies.update
  • compute.securityPolicies.use

Media CDN 서비스에 기존 인증서를 연결해야 하는 사용자에게는 다음 IAM 권한만 필요합니다.

  • compute.securityPolicies.get
  • compute.securityPolicies.list
  • compute.securityPolicies.use

roles/networkservices.edgeCacheUser 역할에는 이러한 모든 권한이 포함됩니다.

보안 정책 만들기

Google Cloud Armor 보안 정책은 여러 규칙으로 구성되며, 각 규칙은 요청과 작업에 대한 일치 기준 집합(표현식)을 정의합니다. 예를 들어 표현식에는 인도에 위치한 클라이언트의 일치 로직이 포함될 수 있으며 관련 작업은 allow입니다. 요청이 규칙과 일치하지 않으면 Google Cloud Armor는 모든 규칙이 시도될 때까지 다음 규칙을 계속 평가합니다.

보안 정책에는 allow 작업이 있는 기본 규칙이 있습니다. 기본 규칙은 이전 규칙과 일치하지 않는 요청을 허용합니다. 앞의 규칙과 일치하는 요청만 allow하고 다른 모든 요청은 거부하려는 경우 deny 규칙으로 변경할 수 있습니다.

다음 예시에서는 HTTP 403으로 오스트레일리아에 지리적으로 배치된 모든 클라이언트를 차단하고 다른 모든 요청을 허용하는 규칙을 만드는 방법을 보여줍니다.

gcloud

CLOUD_ARMOR_EDGE 유형의 새 정책을 만들려면 gcloud compute security-policies create 명령어를 사용합니다.

gcloud compute security-policies create block-australia \
    --type="CLOUD_ARMOR_EDGE" --project="PROJECT_ID"

이렇게 하면 가장 낮은 우선순위(priority: 2147483647)의 기본 허용 규칙을 포함하는 정책이 생성됩니다.

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/securityPolicies/block-australia].

그런 다음 우선순위가 더 높은 규칙을 추가할 수 있습니다.

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

출력은 다음과 같습니다.

Updated [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/securityPolicies/block-australia].

Terraform

resource "google_compute_security_policy" "default" {
  name        = "block-australia"
  type        = "CLOUD_ARMOR_EDGE"
  description = "block AU"

  rule {
    action      = "deny(403)"
    description = "block AU"
    priority    = "1000"
    match {
      expr {
        expression = "origin.region_code == 'AU'"
      }
    }
  }
  rule {
    action   = "allow"
    priority = "2147483647"
    match {
      versioned_expr = "SRC_IPS_V1"
      config {
        src_ip_ranges = ["*"]
      }
    }
    description = "default rule"
  }
}

정책을 검사하면 두 가지 규칙이 표시됩니다. 첫 번째 규칙은 오스트레일리아(origin.region_code == 'AU')에서 발생하는 요청을 차단하고 우선순위가 가장 낮은 두 번째 규칙은 우선순위가 더 높은 규칙(또는 규칙)과 일치하지 않는 모든 트래픽을 허용합니다.

kind: compute#securityPolicy
name: block-australia
rules:
- action: deny(403)
  description: block AU
  kind: compute#securityPolicyRule
  match:
    expr:
      expression: origin.region_code == 'AU'
  preview: false
  priority: 1000
- action: allow
  description: default rule
  kind: compute#securityPolicyRule
  match:
    config:
      srcIpRanges:
      - '*'
    versionedExpr: SRC_IPS_V1
  preview: false
  priority: 2147483647
  ruleNumber: '1'
type: CLOUD_ARMOR_EDGE

보안 정책에 규칙 추가

Google Cloud Armor 보안 정책은 외부에 노출된 애플리케이션이나 서비스를 보호하기 위해 레이어 7 속성과 일치하는 규칙 세트입니다. 각 규칙은 들어오는 트래픽과 관련하여 평가됩니다.

request.headers, request.method, request.path, request.scheme, request.query 속성은 보안 정책의 HTTP 요청에 사용할 수 있습니다. 보안 정책 규칙의 표현식 작성에 대한 자세한 내용은 Google Cloud Armor 커스텀 규칙 언어 참조를 확인하세요.

Google Cloud Armor 보안 정책 규칙은 일치 조건과 조건이 충족되면 취할 조치로 구성됩니다.

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

서비스에 정책 연결

gcloud

기존 Google Cloud Armor 정책을 Media CDN 서비스에 연결하려면 gcloud edge-cache services update 명령어를 사용합니다.

gcloud edge-cache services update MY_SERVICE \
    --edge-security-policy=SECURITY_POLICY

보안 정책의 규칙 업데이트

다음 안내를 따라 Google Cloud Armor 보안 정책에서 규칙 하나를 업데이트합니다. 또는 보안 정책의 여러 규칙을 원자적으로 업데이트할 수 있습니다.

gcloud

gcloud compute security-policies rules update 명령어를 사용합니다.

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"

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

정책 연결 보기

기존 서비스에 연결된 정책을 검토하려면 해당 서비스를 검사(설명)합니다.

gcloud

Media CDN 서비스에 연결된 Google Cloud Armor 정책을 보려면 gcloud edge-cache services describe 명령어를 사용합니다.

gcloud edge-cache services describe MY_SERVICE

서비스의 edgeSecurityPolicy 필드는 연결된 정책을 설명합니다.

name: "MY_SERVICE"
edgeSecurityPolicy: "SECURITY_POLICY

정책 삭제

기존 정책을 삭제하려면 연결된 서비스를 업데이트하고 빈 문자열을 정책으로 전달합니다.

gcloud

gcloud edge-cache services update 명령어를 사용합니다.

gcloud edge-cache services update MY_SERVICE 
--edge-security-policy=""

이제 gcloud edge-cache services describe MY_SERVICE 명령어 출력에서 edgeSecurityPolicy 필드가 생략됩니다.

예시

다음 자세한 사용 사례를 참조하세요.

예시: 차단된 요청 식별

차단된 요청을 로깅하려면 특정 에지 캐시 서비스에 로깅을 사용 설정해야 합니다.

필터링 정책에서 허용되거나 거부된 요청은 Logging에 로깅됩니다. 거부된 요청을 필터링하려면 prod-video-service 구성에 대한 Logging 쿼리는 다음과 같습니다.

resource.type="edge_cache_service"
jsonPayload.statusDetails="denied_by_security_policy"

예시: 응답 코드 맞춤설정

Google Cloud Armor 규칙은 특정 규칙과 연결된 작업으로 특정 상태 코드를 반환하도록 구성할 수 있습니다. 대부분의 경우 HTTP 403(deny-403) 코드를 반환하여 클라이언트가 규칙에 의해 차단되었음을 명확하게 알리는 것이 가장 좋습니다.

지원되는 상태 코드는 다음과 같습니다.

  • HTTP 403(금지됨)
  • HTTP 404(찾을 수 없음)
  • HTTP 502(잘못된 게이트웨이)

다음 예시에서는 반환된 상태 코드를 구성하는 방법을 보여줍니다.

[allow | deny-403 | deny-404 | deny-502] 중 하나를 규칙과 연결된 작업으로 지정하려면 다음 명령어를 실행합니다. 이 예시에서는 HTTP 502를 반환하도록 규칙을 구성합니다.

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

보안 정책의 각 규칙은 서로 다른 상태 코드 응답을 정의할 수 있습니다.

예시: 허용된 IP 주소를 제외하고 국가 외부의 클라이언트 거부

미디어 제공의 일반적인 경우는 콘텐츠 라이선스 또는 결제 메커니즘이 있는 리전 외부에 있는 클라이언트의 연결을 거부하는 것입니다.

예를 들어 인도에 위치한 클라이언트와 콘텐츠 파트너 및 자체 직원을 포함한 허용 목록에 있는 모든 IP 주소(192.0.2.0/24 범위 내)만 허용하고 나머지는 모두 거부할 수 있습니다.

Google Cloud Armor 커스텀 규칙 언어를 사용하면 다음 표현식이 이를 수행할 수 있습니다.

origin.region_code == "IN" || inIpRange(origin.ip, '192.0.2.0/24')

이 표현식은 다른 모든 클라이언트와 일치하도록 구성된 기본 deny 규칙을 사용하는 allow 규칙으로 구성됩니다. 보안 정책에는 항상 기본 규칙이 있습니다. 보통은 이를 명시적으로 허용하지 않는 default deny 트래픽으로 구성합니다. 다른 경우에는 일부 트래픽을 차단하고 다른 모든 트래픽은 default allow도록 선택할 수 있습니다.

보안 정책 출력에서 다음에 유의하세요.

  • 우선순위가 가장 높은(priority: 0) 규칙은 인도 또는 정의된 IP 주소 목록의 트래픽을 허용합니다.
  • 우선순위가 가장 낮은 규칙은 default deny를 나타냅니다. 규칙 엔진은 우선순위가 더 높은 규칙이 true로 평가되지 않는 모든 클라이언트를 거부합니다.
  • 불리언 연산자를 사용하여 여러 규칙을 결합할 수 있습니다.

이 정책은 인도의 클라이언트 트래픽을 허용하고, 정의된 IP 범위의 클라이언트를 허용하며, 다른 모든 트래픽을 거부합니다.

정책 세부정보를 확인하면 다음과 유사한 결과가 출력됩니다.

kind: compute#securityPolicy
name: allow-india-only
type: "CLOUD_ARMOR_EDGE"
rules:
- action: allow
  description: ''
  kind: compute#securityPolicyRule
  match:
    expr:
      expression: origin.region_code == "IN" || inIpRange(origin.ip, '192.0.2.0/24')
  preview: false
  priority: 0
- action: deny(403)
  description: Default rule, higher priority overrides it
  kind: compute#securityPolicyRule
  match:
    config:
      srcIpRanges:
      - '*'
    versionedExpr: SRC_IPS_V1
  preview: false
  priority: 2147483647

{region_code} 헤더 변수를 사용하여 커스텀 응답 헤더를 설정할 수도 있습니다. 이 헤더는 JavaScript를 사용하여 검사하고 클라이언트에 반영할 수 있습니다.

예시: IP 주소 및 IP 범위로 악성 클라이언트 차단

Google Cloud Armor 커스텀 규칙 언어를 사용하면 다음 표현식이 이를 수행할 수 있습니다.

inIpRange(origin.ip, '192.0.2.2/32') || inIpRange(origin.ip, '192.0.2.170/32')

IPv4의 경우 /8 마스크, IPv6의 경우 /32까지 IP 범위를 차단할 수 있습니다. 스트리밍 플랫폼의 일반적인 사례는 프록시 또는 VPN 제공업체의 이그레스 IP 범위를 차단하여 콘텐츠 라이선스 우회를 최소화하는 것입니다.

inIpRange(origin.ip, '192.0.2.0/24') || inIpRange(origin.ip, '198.51.100.0/24') || inIpRange(origin.ip, '203.0.113.0/24') || inIpRange(origin.ip, '2001:DB8::B33F:2002/64')

IPv4 및 IPv6 주소 범위가 모두 지원됩니다.

예시: 고정된 지역 목록만 허용

국가 코드 목록이 있으면 불리언 OR 연산자 ||를 사용하여 일치 조건을 결합할 수 있습니다.

Google Cloud Armor 커스텀 규칙 언어를 사용하는 경우 다음 표현식을 사용하면 오스트레일리아 또는 뉴질랜드 출신으로 식별된 사용자를 식별할 수 있습니다.

origin.region_code == "AU" || origin.region_code == "NZ"

지정된 지역 중 하나가 아니더라도 origin.ip 또는 inIpRange(origin.ip, '...') 표현식과 결합하여 테스터, 파트너, 회사 IP 범위를 허용할 수 있습니다.

커스텀 표현식이 있는 각 규칙의 문서화된 하위 표현식 수가 있습니다. 더 많은 하위 표현식을 결합해야 하는 경우 단일 정책 내에 여러 규칙을 정의합니다.

예시: 특정 국가 집합의 클라이언트 차단

흔하지 않은 예시로는 특정 국가 집합의 클라이언트를 차단하고 다른 모든 국가의 요청을 허용하는 경우가 있습니다.

이렇게 하려면 국가와 리전을 확인할 수 없는 모든 클라이언트를 차단한 다음 다른 모든 요청에 대해 기본 허용 규칙을 적용하는 정책을 만듭니다.

다음 예시는 캐나다의 클라이언트와 위치를 알 수 없지만 다른 모든 트래픽을 허용하는 모든 클라이언트를 차단하는 정책을 설명합니다.

  kind: compute#securityPolicy
  name: block-canada
  type: "CLOUD_ARMOR_EDGE"
  rules:
  - action: deny(403)
    description: ''
    kind: compute#securityPolicyRule
    match:
      expr:
        expression: origin.region_code == "CA" || origin.region_code == "ZZ"
    preview: false
    priority: 0
  - action: allow
    description: Default rule, higher priority overrides it
    kind: compute#securityPolicyRule
    match:
      config:
        srcIpRanges:
        - '*'
      versionedExpr: SRC_IPS_V1
    preview: false
    priority: 2147483647

예시: 특정 헤더가 있는 캐시된 콘텐츠에 대한 요청 거부

에지 보안 정책은 정책이 연결된 모든 Media CDN 서비스를 타겟팅하는 모든 요청에 적용됩니다. 이 정책 시행은 캐시 조회 전에 수행됩니다. 에지 보안 정책에서 허용되지 않는 요청은 구성된 상태 코드와 함께 거부됩니다.

다음 표현식은 user-agent 헤더에 user1 문자열이 포함된 IP 주소 1.2.3.4의 요청과 일치합니다.

inIpRange(origin.ip, '1.2.3.4/32') && request.headers['user-agent'].contains('user1')

다음 명령어는 필터링 규칙 105를 Media CDN 서비스에 연결된 에지 보안 정책 my-edge-policy에 추가합니다.

gcloud compute security-policies rules create 105 \
    --security-policy my-edge-policy \
    --expression = "inIpRange(origin.ip, '1.2.3.4/32') && request.headers['user-agent'].contains('charlie')" \
    --action= deny-403 \
    --description="block requests from IP addresses in which the user-agent header contains the string charlie"
    

시정 조치 로깅

요청 로그는 적용된 보안 정책과 요청이 허용(ALLOW)되었는지 거부(DENY)되었는지 여부에 대한 세부정보를 제공합니다.

로깅을 사용 설정하려면 서비스에서 logConfig.enabletrue로 설정되었는지 확인합니다. 로그가 사용 설정되지 않은 서비스는 보안 정책 이벤트를 로깅하지 않습니다.

클라이언트가 미국 외부에 있고 미국 외부에서 발생한 요청을 거부하는 deny-non-us-clients라는 보안 정책이 시행되는 경우 거부된 요청에 대한 로그 항목은 다음과 같습니다.

enforcedSecurityPolicy:
  name: deny-non-us-clients
  outcome: DENY

Google Cloud Armor 정책이 연결되지 않은 서비스에는 enforcedSecurityPolicy.name 값으로 no_policy가 포함되고 outcomeALLOW입니다. 예를 들어 정책이 연결되지 않은 서비스에 대한 요청 로그 항목의 값은 다음과 같습니다.

enforcedSecurityPolicy:
  name: no_policy
  outcome: ALLOW

GeoIP 분류 이해

Media CDN은 Google의 내부 IP 분류 데이터 소스를 사용하여 IP 주소에서 위치(리전, 국가, 지방, 도시)를 가져옵니다. 여러 제공업체에서 마이그레이션하거나 여러 제공업체 간에 트래픽을 분할하는 경우 소수의 IP 주소가 다른 위치와 연결될 수 있습니다.

  • Google Cloud Armor는 ISO 3166-1 alpha 2 리전 코드를 사용하여 클라이언트를 지리적 위치에 연결합니다.
  • 예를 들어 미국은 US, 오스트레일리아는 AU입니다.
  • 경우에 따라 리전이 국가에 해당하지만 항상 그런 것은 아닙니다. 예를 들어 US 코드는 미국의 모든 주, 구역 1개, 외곽 지역 6개를 포함합니다.
  • 자세한 내용은 유니코드 기술 표준의 unicode_region_subtag를 참조하세요.
  • 위치를 가져올 수 없는 클라이언트의 경우 origin.region_codeZZ로 설정됩니다.

Media CDN 엔드포인트(routing.routeRules[].headerActions[].responseHeadersToAdd[] 사용)의 응답 헤더에 지리적 데이터를 추가하거나 Cloud 함수에 제공된 지역 데이터를 반영하여 초기 통합 및 테스트 중에 geoIP 데이터 소스 간의 차이점을 검증할 수 있습니다.

또한 Media CDN 요청 로그에는 기존 데이터 소스에 대해 유효성을 검사할 수 있는 clientRegion 및 기타 클라이언트 관련 데이터가 포함됩니다.

다음 단계

  • 서명된 요청을 사용하여 사용자별로 콘텐츠를 승인하는 방법을 알아봅니다.
  • Google Cloud Armor 규칙 참조를 검토하여 IP 및 지리적 일치 규칙을 표현하고 결합하는 방법을 알아봅니다.
  • 요청 로그를 쿼리하고 차단된 요청을 확인하는 방법은 로깅 문서를 참조하세요.