보안 정책 개요

Google Cloud Armor 보안 정책은 어떤 요청이 부하 분산기에 대한 액세스에 허용 및 거부되는지 제어하여 애플리케이션을 보호합니다. 각 보안 정책은 수신 요청의 IP 주소, IP 범위, 리전 코드, 요청 헤더와 같은 조건에 따라 트래픽을 필터링하는 규칙 집합으로 구성됩니다.

Google Cloud Armor 보안 정책은 외부 HTTP(S) 부하 분산기 뒤에 있는 백엔드 서비스에만 사용할 수 있습니다. 부하 분산기는 프리미엄 등급이나 표준 등급에 있을 수 있습니다.

백엔드 서비스의 백엔드는 인스턴스 그룹, 영역 네트워크 엔드포인트 그룹(영역 NEG) 또는 인터넷 네트워크 엔드포인트 그룹(인터넷 NEG)의 가상 머신(VM) 인스턴스일 수 있습니다. Google Cloud Armor를 사용하여 하이브리드 배포 또는 멀티 클라우드 아키텍처를 보호하는 경우 온프레미스 또는 멀티 환경 배포에서 Traffic Director를 사용할 때 백엔드는 인터넷 NEG 또는 하이브리드 연결 NEG여야 합니다. 또한 Google Cloud Armor는 부하 분산기를 통해 트래픽이 라우팅될 때 서버리스 NEG를 보호합니다. 부하 분산기를 통해 라우팅된 트래픽만 NEG에 도달하도록 하려면 인그레스 제어를 참조하세요.

Google Cloud Armor 보안 정책을 통한 에지 보안

HTTP(S) 부하 분산은 전 세계 Google 접속 지점(PoP)의 Google 네트워크 에지에서 구현됩니다. 프리미엄 등급에서 외부 HTTP(S) 부하 분산기로 전달되는 사용자 트래픽은 사용자와 가장 가까운 PoP로 유입됩니다. 그런 다음 부하는 Google의 전역 네트워크를 통해 사용 가능한 용량이 충분하게 있는 가장 가까운 백엔드로 분산됩니다. 표준 등급에서 사용자 트래픽은 Google 클라우드 리소스를 배포한 리전의 피어링, ISP 또는 전환 네트워크를 통해 Google 네트워크에 유입됩니다.

Google Cloud Armor 보안 정책을 사용 설정하면 들어오는 트래픽의 소스와 최대한 가까운 Google Cloud 에지에서 외부 HTTP(S) 부하 분산기에 대한 액세스를 허용하거나 거부할 수 있습니다. 이를 통해 원치 않는 트래픽이 리소스를 소비하거나 Virtual Private Cloud(VPC) 네트워크에 유입되는 것을 방지할 수 있습니다.

다음 다이어그램에서는 외부 HTTP(S) 부하 분산기, Google 네트워크, Google 데이터 센터의 위치를 보여줍니다.

네트워크 에지에서의 Google Cloud Armor 정책
네트워크 에지에서의 Google Cloud Armor 정책(확대하려면 클릭)

요구사항

Google Cloud Armor 보안 정책의 요구사항은 다음과 같습니다.

  • 부하 분산기는 외부 HTTP(S) 부하 분산기여야 합니다.
  • 백엔드 서비스의 부하 분산 스키마는 EXTERNAL이어야 합니다.
  • 백엔드 서비스의 프로토콜은 HTTP, HTTPS 또는 HTTP/2 중 하나여야 합니다.

Google Cloud Armor 보안 정책 정보

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

Google Cloud Armor 보안 정책 규칙은 일치 조건과 조건이 충족되면 취할 조치로 구성됩니다. 조건은 들어오는 트래픽의 소스 IP 주소가 특정 IP 주소나 CIDR 범위와 일치하는지 여부를 확인하는 것(IP 주소 허용 목록 및 차단 목록 규칙이라고도 함)만큼 단순할 수 있습니다. 또는 Google Cloud Armor 커스텀 규칙 언어 참조를 사용하여 URL 경로, 요청 메서드 또는 요청 헤더 값과 같은 들어오는 트래픽의 다양한 속성과 일치하는 커스텀 조건을 만들 수 있습니다.

들어오는 요청이 보안 정책 규칙의 조건과 일치하면 Google Cloud Armor는 규칙이 허용 규칙인지 또는 거부 규칙인지에 따라 요청을 허용하거나 거부합니다.

Google Cloud Armor 보안 정책을 백엔드 서비스 한 개 이상에 연결할 수 있습니다. 백엔드 서비스에는 하나의 보안 정책만 연결할 수 있지만 백엔드 서비스가 모두 동일한 보안 정책과 연결될 필요는 없습니다.

Google Cloud Armor 보안 정책이 백엔드 서비스와 연결된 경우 이 정책을 삭제할 수 없습니다. 연결된 보안 정책이 있는지 여부에 관계없이 백엔드 서비스를 삭제할 수 있습니다.

전달 규칙 여러 개가 보안 정책에 연결된 백엔드 서비스를 가리키는 경우 각 전달 규칙 IP 주소로 들어오는 모든 트래픽에 정책 규칙이 적용됩니다.

다음 이미지에서 Google Cloud Armor 보안 정책 internal-users-policy는 백엔드 서비스 test-network에 연결되어 있습니다.

네트워크 에지에서의 Google Cloud Armor 보안 정책
네트워크 에지에서의 Google Cloud Armor 보안 정책(확대하려면 클릭)

Google Cloud Armor 보안 정책에는 다음과 같은 핵심 기능이 있습니다.

  • 원하는 경우 Google Cloud Armor를 사용하는 부하 분산기와 함께 QUIC 프로토콜을 사용할 수 있습니다.

  • Google Cloud Armor를 다음 네트워크 서비스 등급 중 하나에 있는 외부 HTTP(S) 부하 분산기와 함께 사용할 수 있습니다.

    • 프리미엄 등급
    • 표준 등급
  • GKE 및 기본 인그레스 컨트롤러에서 보안 정책을 사용할 수 있습니다.

규칙 평가 순서

규칙 평가 순서는 가장 낮은 번호에서 가장 높은 숫자까지 규칙 우선순위로 결정됩니다. 가장 낮은 숫자 값이 할당된 규칙은 논리적 우선순위가 가장 높으며 논리적 우선순위가 낮은 규칙보다 먼저 평가됩니다. 최소 숫자 우선순위는 0입니다. 숫자가 증가하면 규칙 우선순위가 감소합니다(1, 2, 3, N+1). 우선순위가 같은 규칙을 두 개 이상 구성할 수 없습니다. 각 규칙 우선순위를 0~2147483646 사이의 숫자로 설정해야 합니다. 우선순위 값 2147483647(INT-MAX라고도 함)은 기본 규칙에 예약되어 있습니다.

우선순위 번호에는 간격이 있을 수 있으므로 나중에 나머지 규칙에 영향을 주지 않고 규칙을 추가하거나 삭제할 수 있습니다. 예를 들어 1, 2, 3, 4, 5, 9, 12, 16은 나중에 6~8, 10~11, 13~15의 규칙을 추가할 수 있는 유효한 일련의 우선순위 번호입니다. 실행 순서를 제외하고 기존 규칙을 변경할 필요는 없습니다.

일반적으로 요청과 일치하는 우선순위가 가장 높은 규칙이 적용됩니다. 하지만 evaluatePreconfiguredExpr() 요청을 사용하는 사전 구성된 규칙에 따라 HTTP POST 요청이 평가되는 경우는 예외입니다. 예외는 다음과 같습니다.

HTTP POST 요청의 경우 Google Cloud Armor는 본문(페이로드) 전에 요청 헤더를 수신합니다. Google Cloud Armor는 먼저 헤더 정보를 수신하므로 헤더와 일치하는 규칙을 평가하지만 본문에서 사전 구성된 규칙과 일치하지 않습니다. 헤더 기반 규칙이 여러 개 있으면 Google Cloud Armor는 예상대로 우선순위에 따라 이러한 규칙을 평가합니다.

Google Cloud Armor는 HTTP POST 본문을 수신한 후 요청 헤더와 본문 모두에 적용되는 규칙을 평가합니다. 결과적으로 요청 헤더를 허용하는 우선순위가 낮은 규칙이 요청 본문을 차단하는 우선순위가 높은 규칙보다 먼저 일치할 수 있습니다. 이러한 경우 요청의 HTTP 헤더 부분이 대상 백엔드 서비스로 전송될 수 있지만 잠재적으로 위험한 콘텐츠가 포함된 POST 본문은 차단됩니다.

예시

다음 예시에서 규칙 1, 2, 3은 IP 헤더 필드와 HTTP 헤더 필드의 순서로 평가됩니다. 그러나 IP 9.9.9.1HTTP POST 본문에서 XSS 공격을 시작하면 규칙 2에 의해 본문만 차단되고 HTTP 헤더는 규칙 3에 의해 백엔드로 전달됩니다.

Rule1
expr: inIPRange(origin.ip, '10.10.10.0/24')
action: deny(403)
priority: 1
Rule2
expr: evaluatePreconfiguredExpr('xss-stable')
action: deny(403)
priority: 2
Rule3
expr: inIPRange(origin.ip, '9.9.9.0/24')
action: allow
priority: 3
Rule-default
action: deny(403)
priority: INT-MAX

다음 예시에서 정책은 XSS 공격에 대한 검사 없이 IP 9.9.9.1을 허용합니다.

Rule1
expr: inIPRange(origin.ip, '10.10.10.0/24')
action: deny(403)
priority: 1
Rule2
expr: inIPRange(origin.ip, '9.9.9.0/24')
action: allow
priority: 2
Rule3
expr: evaluatePreconfiguredExpr('xss-stable')
action: deny(403)
priority: 3
Rule-default
action: allow
priority: INT-MAX

기본 규칙

각 Google Cloud Armor 보안 정책에는 일치하는 우선순위가 높은 규칙이 없거나 정책에 다른 규칙이 없는 경우에 일치하는 기본 규칙이 포함되어 있습니다. 기본 규칙은 자동으로 우선순위 2147483647(INT-MAX)에 할당되며 항상 보안 정책에 있습니다.

기본 규칙을 삭제할 수 없지만 수정할 수는 있습니다. 기본 규칙의 기본 작업은 허용이지만 거부하도록 작업을 변경할 수 있습니다.

디지털 지문

Google Cloud Armor 보안 정책마다 fingerprint 필드가 있습니다. 디지털 지문은 정책에 저장된 콘텐츠의 해시입니다. 새 정책을 만들 때 이 필드 값을 제공하지 마세요. 값을 제공하면 무시됩니다. 그러나 보안 정책을 업데이트하는 경우에는 정책을 내보내거나 설명할 때 가져오는 현재 디지털 지문을 지정해야 합니다(각각 EXPORT 또는 DESCRIBE 사용).

디지털 지문은 다른 사용자의 업데이트가 우선 적용되지 못하게 합니다. 제공한 디지털 지문이 오래된 경우 이는 디지털 지문을 마지막으로 검색한 이후에 보안 정책이 업데이트되었음을 의미합니다. 차이점을 확인하고 최신 지문을 검색하려면 DESCRIBE 명령어를 실행합니다.

규칙 언어 및 시행 엔진

규칙 언어 및 시행 엔진에서는 다음 기능을 제공합니다.

  • 들어오는 요청의 다양한 레이어 3~7 속성과 일치할 수 있는 커스텀 규칙 표현식을 작성하는 기능. Google Cloud Armor에서는 커스텀 일치 조건을 작성할 수 있는 유연한 언어를 제공합니다.

  • 하위 표현식 여러 개를 규칙 하나에 결합하는 기능

  • 들어오는 요청의 리전 코드를 기준으로 요청을 거부하거나 허용하는 기능. 리전 코드는 ISO 3166-1 alpha 2 코드를 기반으로 합니다. 리전 코드가 특정 국가에 해당하는 경우도 있지만 일부는 국가와 관련 지역을 포함합니다. 예를 들어 US 코드에는 미국의 모든 주, 구역 1개, 외곽 지역 6개가 포함되어 있습니다.

규칙 유형

IP 주소 허용 목록 및 차단 목록 규칙

보안 정책 내에서 IP 주소 허용 목록과 차단 목록 규칙을 만들 수 있습니다. 몇 가지 예를 들면 다음과 같습니다.

  • IP 주소/CIDR을 차단 목록에 추가하면 소스 IP 주소나 CIDR 범위가 외부 HTTP(S) 부하 분산기에 액세스하지 못하게 할 수 있습니다.

  • IP 주소/CIDR을 허용 목록에 추가하면 소스 IP 주소나 CIDR 범위가 외부 HTTP(S) 부하 분산기에 액세스하도록 허용할 수 있습니다.

  • 허용 목록 및 차단 목록 규칙에서는 IPv4 주소와 IPv6 주소를 지원합니다.

  • IP 주소 규칙은 개별 소스 IP 주소나 CIDR을 차단 또는 허용할 수 있습니다. IPv4 및 IPv6 소스 주소 모두 지원되지만 IPv6 주소에는 /64 이하의 서브넷 마스크가 있어야 합니다.

  • 거부 규칙은 HTTP 403(승인되지 않음), 404(액세스 거부), 502(잘못된 게이트웨이) 응답을 반환할 수 있습니다.

XSS, SQLi, LFI, RFI, RCE의 사전 구성된 규칙

사전 구성된 규칙을 사용하여 다음 공격을 완화할 수 있습니다.

  • 교차 사이트 스크립팅(XSS)
  • SQL 삽입(SQLi) 공격
  • 로컬 파일 포함(LFI) 공격
  • 원격 파일 포함(RFI) 공격
  • 원격 코드 실행(RCE) 공격

이러한 규칙은 OWASP Modsecurity Core Rule Set 버전 3.0.2를 기반으로 합니다.

명명된 IP 주소 목록의 사전 구성된 규칙

명명된 IP 주소 목록의 사전 구성된 규칙은 다음을 제공합니다.

  • 타사 제공업체의 명명된 IP 주소 목록을 Google Cloud Armor와 통합합니다.

  • 허용되거나 거부된 IP 주소 범위의 유지보수를 간소화합니다.

  • 타사 제공업체 목록을 매일 동기화합니다.

  • 명명된 IP 주소 목록에서는 규칙당 IP 주소 수가 제한되지 않으므로 보안 정책에서 IP 주소와 범위를 구성할 수 있는 용량이 늘어납니다.

미리보기 모드

규칙을 적용하지 않고 규칙 효과를 미리 볼 수 있습니다. 미리보기 모드에서는 작업이 Cloud Monitoring에 기록됩니다. 보안 정책의 개별 규칙을 미리 보거나 정책의 모든 규칙을 미리 볼 수 있습니다.

gcloud 명령줄 도구와 gcloud compute security-policies rules update--preview 플래그를 사용하여 규칙에 미리보기 모드를 사용 설정할 수 있습니다.

미리보기 모드를 중지하려면 현재 문서화되지 않은 --no-preview 플래그를 사용합니다. Cloud Console을 사용할 수도 있습니다.

로깅

Google Cloud Armor 보안 정책 이름, 일치 규칙 우선순위, 관련 작업, 관련 정보는 외부 HTTP(S) 부하 분산기에 대한 HTTP(S) 요청에 로깅됩니다. Google Cloud Armor 로깅 정보를 기록하려면 HTTP(S) 요청에 대한 로깅을 사용 설정해야 합니다.

HTTP(S) 부하 분산 요청 로깅

각 HTTP(S) 요청은 Cloud Logging을 통해 로깅됩니다. 로그는 적용된 보안 정책의 이름, 일치 규칙, 규칙 적용 여부와 같은 세부정보를 제공합니다. 새 백엔드 서비스 리소스의 요청 로깅은 기본적으로 중지되어 있습니다. Google Cloud Armor 요청이 로깅되도록 하려면 HTTP(S) 로깅을 사용 설정해야 합니다.

자세한 내용은 IP 차단 목록/허용 목록 로깅을 참조하세요.

Google Cloud Armor 로그를 보려면 로그 보기를 참조하세요.

제한사항

  • Cloud Storage 백엔드 버킷에는 HTTP(S) 부하 분산에 대한 IP 주소 차단 목록/허용 목록이 지원되지 않습니다.

  • CDN 캐시 부적중에만 보안 정책이 적용됩니다. 보안 정책의 규칙이 요청을 거부하더라도 캐시에서 콘텐츠가 제공됩니다.

WebSocket 연결 처리 방법

외부 HTTP(S) 부하 분산은 기본적으로 WebSocket 프로토콜을 지원합니다. WebSocket 채널은 HTTP(S) 요청에서 시작됩니다. 예를 들어 IP 주소 차단 목록에서 발신 IP 주소를 차단하는 경우 Google Cloud Armor는 WebSocket 채널이 설정되지 않도록 이 채널을 차단할 수 있습니다. 그러나 채널의 후속 트랜잭션은 HTTP 프로토콜을 준수하지 않으며 Google Cloud Armor는 첫 번째 요청 후에 어떠한 메시지도 평가하지 않습니다.

다음 단계