GCP Cloud Armor

Google Cloud Armor Managed Protection

https://cloud.google.com/armor/docs/managed-protection-overview?_ga=2.206207703.-517151124.1624493998&_gac=1.184417108.1635990675.Cj0KCQjw5oiMBhDtARIsAJi0qk3RDAhJky5x_4_dTZjUmm4nIWa84HwtD0N6kdM3SMJjWJShms5ySSkaAqsJEALw_wcB

표준 등급에는 볼륨 및 프로토콜 기반 DDoS 공격에 대한 상시 보호 기능, WAF 규칙 기능 및 OWASP 상위 10개 보호에 대한 사전 정의된 WAF 규칙이 들어가 있음.

HTTP(S) 부하 분산, TCP 프록시 부하 분산, SSL 프록시 부하 분산을 포함하는 모든 프로젝트가 자동으로 표준 등급에 등록됩니다.

 

Google Cloud Armor는 표준 보호와 Managed Protection 플러스의 두 가지 서비스 등급으로 제공됩니다.

  • Google Cloud Armor 표준 등급에는 사용한 만큼만 지불하는 가격 책정 모델, 전 세계적으로 부하가 분산된 인프라에서 볼륨 및 프로토콜 기반 DDoS 공격에 대한 상시 보호 기능, Google Cloud Armor 웹 애플리케이션 방화벽(WAF) 규칙 기능 및 OWASP 상위 10개 보호에 대한 사전 정의된 WAF 규칙이 포함됩니다.

  • Managed Protection 플러스에는 Google Cloud Armor 표준 등급의 모든 기능과 더불어 번들 Google Cloud Armor WAF 규칙(규칙, 정책, HTTP(S) 요청 포함), 타사 명명된 IP 주소 목록Adaptive Protection을 지원합니다. Managed Protection 플러스 구독자는 DDoS 청구 보호 및 DDoS 응답팀 서비스에도 액세스할 수 있습니다.

 

Google Cloud Armor 표준

Managed Protection 플러스

 

Google Cloud Armor 표준

Managed Protection 플러스

결제 방법

사용한 만큼만 지불

월간 구독 + 데이터 처리 수수료(가격 책정 참조)

DDoS 공격 보호

  • HTTP(S) 부하 분산

  • TCP 프록시 부하 분산

  • SSL 프록시 부하 분산

  • HTTP(S) 부하 분산

  • TCP 프록시 부하 분산

  • SSL 프록시 부하 분산

Google Cloud Armor WAF

정책별, 요청별, 규칙별(가격 책정 참조)

플러스 구독 포함

리소스 한도

최대 할당량 한도

최대 할당량 한도

사전 구성된 WAF 규칙

시간 약정

해당 사항 없음

1년

명명된 IP 주소 목록

아니요

Adaptive Protection

알림 전용

DDoS 응답 지원

해당 사항 없음

예(프리미엄 지원 포함)

DDoS 청구 보호

해당 사항 없음

Cloud Armor 세팅

https://cloud.google.com/armor/docs/configure-security-policies

규칙 평가 순서 : 가장 낮은 번호에서 가장 높은 숫자까지 규칙 우선순위로 결정됩니다. 가장 낮은 숫자 값이 할당된 규칙은 논리적 우선순위가 가장 높으며 논리적 우선순위가 낮은 규칙보다 먼저 평가됩니다. 최소 숫자 우선순위는 0입니다. 숫자가 증가하면 규칙 우선순위가 감소합니다(1, 2, 3, N+1). 우선순위가 같은 규칙을 두 개 이상 구성할 수 없습니다. 

우선순위 값 2147483647(INT-MAX라고도 함)은 기본 규칙에 예약되어 있습니다.

먼저 적용된 규칙이 있으면 이후 규칙은 적용이 안됨. 예를 들어 웹취약점때문에 deny 로 설정을 해도 우선순위가 높은 규칙에서 IP로 allow 를 한 것이 있으면 해당 IP에서는 접속이 허용됨.

특정 IP 대역에서만 접근할 수 있도록 설정

src-ip-ranges 에 최대 10개의 IP 대역을 지정할 수 있음. 관리하기 편한 형태로 하는 것이 좋겠음. rule을 업데이트하는 것은 gcloud compute security-policies rules update xxx 형태로 하면 됨.

Cloud Armor 에서 보안정책을 만들어서 로드밸런서의 backend 에 할당을 해주면 됨. web-backend-service-tjmoontest-dev 는 테스팅을 하기 위해서 임시로 만든 것으로 실제 만든 backend service로 지정을 하면 된다.

https://console.cloud.google.com/net-security/securitypolicies/list?project=sample-dev-324106

# create Google Cloud Armor policy gcloud compute security-policies create was-clients-test-policy \ --description "policy for was external users" # default policy gcloud compute security-policies rules update 2147483647 \ --security-policy was-clients-test-policy \ --action "deny-404" gcloud compute security-policies rules create 1000 \ --security-policy was-clients-test-policy \ --description "Hapjeong 3F" --src-ip-ranges 111.111.111.111/32 \ --action "allow" gcloud compute security-policies rules create 1001 \ --security-policy was-clients-test-policy \ --description "Hapjeong 4F" --src-ip-ranges 111.111.111.112/32 \ --action "allow" # update backend service gcloud compute backend-services update web-backend-service-tjmoontest-dev \ --global \ --security-policy was-clients-test-policy

security-policies CLI - https://cloud.google.com/sdk/gcloud/reference/compute/security-policies

비율 기반 제한 규칙

WAF

WAF test 용 rule 따로 만들었음.

# create Google Cloud Armor policy gcloud compute security-policies create tj-clients-test-policy \ --description "policy for was external users" # default policy gcloud compute security-policies rules update 2147483647 \ --security-policy tj-clients-test-policy \ --action "deny-404" gcloud compute security-policies rules create 1000 \ --security-policy tj-clients-test-policy \ --description "Hapjeong 3F" --src-ip-ranges 111.111.111.111/32 \ --action "allow" # update backend service gcloud compute backend-services update web-backend-service-tjmoontest-dev \ --global \ --security-policy tj-clients-test-policy

사전구성된 WAF 규칙

 OWASP 상위 10개 목록 : OWASP Top Ten | OWASP Foundation

https://cloud.google.com/armor/docs/rules-language-reference#preconfigured-rules

사전 구성된 규칙은 사전 구성된 정적 서명, 정규 표현식 또는 둘 다를 사용하여 HTTP 요청 헤더와 쿼리 매개변수를 일치시킵니다. 사용 가능한 사전 구성된 규칙은 OWASP Modsecurity Core Rule Set 버전 3.0.2를 기반으로 합니다. Google Cloud Armor는 이러한 사전 정의된 표현식 집합을 제공합니다.

  • xss-<version>: 교차 사이트 스크립팅 공격으로부터 보호합니다.

  • sqli-<version>: SQL 삽입 공격으로부터 보호합니다.

  • lfi-<version>: 로컬 파일 포함 공격으로부터 보호

  • rfi-<version>: 원격 파일 포함 공격으로부터 보호

  • rce-<version>: 원격 코드 실행 공격으로부터 보호

 

https://cloud.google.com/armor/docs/configure-security-policies#list-preconfig-rules

아래 명령을 이용하면 https://cloud.google.com/armor/docs/rule-tuning 페이지에 있는 리스트가 나옴.

$ gcloud compute security-policies list-preconfigured-expression-sets $ gcloud compute security-policies list-preconfigured-expression-sets | grep stable sqli-stable xss-stable lfi-stable rce-stable rfi-stable sessionfixation-stable scannerdetection-stable protocolattack-stable php-stable methodenforcement-stable

https://cloud.google.com/armor/docs/rule-tuning 페이지를 보면서 실제 서비스를 할 때에는 민감도를 조정해야 함.

사전 구성된 각 규칙에는 ModSecurity paranoia 수준에 해당하는 민감도 수준이 있습니다. 민감도 수준이 낮으면 신뢰도 서명이 높으므로 거짓양성을 생성할 가능성이 낮습니다. 민감도 수준이 높으면 보안이 향상되지만 거짓양성이 생성될 위험이 증가합니다.

FAQs 문서에 민감도 수준에 대한 설명이 있음. PL4, PL3는 잘 알지 못하면 빼는 것이 나을 수 있음.

  • A paranoia level of 1 (PL1) is default PL1은 초보자, 다양한 사이트 및 응용 프로그램을 다루는 설치 및 표준 보안 요구 사항이 있는 설정에 권장

  • Paranoia level 2 (PL2)  보다 완전한 적용 범위를 원하는 중급에서 숙련된 사용자와 높은 보안 요구 사항이 있는 모든 설치에 권장됩니다. PL2는 기존 CRS 2.x 사용자에게도 좋은 선택 이 될 수 있습니다. 

  • Paranoia level 3 (PL3) PL3은 FP(false positives 오탐) 취급 경험이 있는 사용자와 높은 보안 요구 사항이 있는 설치를 대상으로 합니다.

  • Paranoia level 4 (PL4) PL4는 보안 요구 사항이 매우 높은 설비를 보호하는 숙련된 사용자에게 권장됩니다.

 

사전 구성된 규칙의 민감도 수준, 설명은 cli 나 명령행에서 조회가 안되고 https://cloud.google.com/armor/docs/rule-tuning 에서 직접 봐야 함.

 

WAF rule 추가

모든 새 규칙을 미리보기 모드로 배포한 후 요청 로그를 검토하여 정책과 규칙이 예상대로 작동하는지 확인하는 것이 좋습니다. 미리보기로 하려면 --preview 를 넣어줌.

waf rule을 미리보기로 확인하는 예제. 기본 정책은 거부로 해놓고 WAF rule에서 거부할 것만 미리보기로 설정하고 IP 기반의 acl 관리하는 경우임.

Google Cloud Armor 로깅

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

 

HTTP(S) 부하 분산 로깅 및 모니터링 :  https://cloud.google.com/load-balancing/docs/https/https-logging-monitoring#logging

테스팅용 부하 부산기의 로깅을 활성화 한다.

 

Cloud Armor 와 관련한 로그정보 : https://cloud.google.com/armor/docs/request-logging

Cloud Armor의 정책 페이지에서 해당 로그에 대한 링크를 제공함. 직접 로그탐색기로 이동하여 확인을 할 수도 있음.

 

거부된 요청을 보려면 jsonPayload.enforcedSecurityPolicy.outcome="DENY" 또는 jsonPayload.statusDetails="denied_by_security_policy"와 같은 필터를 사용하면 됩니다.

 

로드밸런서 로그 중 statusDetailsdenied_by_security_policy 가 들어간 로그만 보는 것임.

 

예를 들어 SQL 삽입 WAF 규칙이 사용 설정된 프로젝트에 이 요청을 전송할 수 있습니다.

로그탐색기에서 json 형태로 나온 로그.

statusDetails: "denied_by_security_policy"

outcome: "DENY"

preconfiguredExprIds

로그레벨을 상세하게 하면 좀 더 자세한 로그를 볼 수 있다.

VERBOSE 로 설정한 로그. enforcedSecurityPolicy 에 추가된 필드가 있다.

규칙 생성 및 검증 중에 또는 문제 해결을 위해서만 상세 로깅을 사용 설정하는 것이 좋습니다. 일반 작업 중에는 상세 로깅을 사용 중지된 상태로 두는 것이 좋습니다.

로그레벨 원래대로 변경(NORMAL)

 

로드밸런서에서 거부당한 로그만 보기. remoteIp는 사무실 Wifi public ip가 아닌 경우임.

https://cloudlogging.app.goo.gl/NxibZmz4WJ3vvQgy5

 

preview 옵션을 주어서 미리보기로 설정한 로그는 enforcedSecurityPolicy 의 outcome 은 ACCEPT 로 나오고 previewSecurityPolicy 의 outcome은 DENY로 나온다.

https://cloud.google.com/armor/docs/security-policy-overview#preview_mode 문서에서는 “ 미리보기 모드에서는 작업이 Cloud Monitoring에 기록됩니다. “ 라고 나와있는데 https://cloud.google.com/armor/docs/monitoring 문서를 참고해도 미리보기 요청을 해서 블락당한 것과 허용한 수치만 나온다. 로그 자체를 보려면 로그 탐색기에서 검색을 해야 한다.

쿼리에서 관련된 로그만 뽑는다.

json 로그

Cloud Armor 기타 기능

L3, L7에서 공격을 막을 수 있는 기능들이 있음. 최대 요청 한도 등을 설정하여 특정 클라이언트에서 GCP의 리소스를 모두 사용하는 것을 막을 수 있음.

https://cloud.google.com/armor/docs/rate-limiting-overview

이 기능까지 테스팅을 하지는 않았음.

기타

개발환경의 로드밸런서는 기본 거부, IP 기반의 acl을 이용, WAF rule을 preview 로 설정하였음.

 

IP ACL 통과 하고 preview에서 WAF rule 걸리는 것 : 개발자 또는 내부 테스팅 작업

현재 보이는것 owasp-crs-v030001-id942432-sqli

 "http://35.244.227.161/_next/image?url=%2Fimage%2Fic-top-ic-top-more%403x.png&w=1920&q=75"

 

IP ACL 상관없이 preview에서 WAF rule 걸리는 것 :

 

IP ACL 도 거부이고 preview에서 WAF rule 걸리는 것 : 외부에서 무작위로 들어오는 것