마짱짱의 지식창고

[GCP] Apigee, Cloud Armor 이용하여 API 보호 본문

Cloud/GCP

[GCP] Apigee, Cloud Armor 이용하여 API 보호

마짱짱 2023. 1. 17. 16:29
반응형

Apigee X 의 위협보호정책을 통해 콘텐츠 기반 위협으로부터 API를 보호

https://cloud.google.com/apigee/docs/api-platform/security/content-based-security

 

콘텐츠 기반 보안  |  Apigee X  |  Google Cloud

 

cloud.google.com

또한 GCP의 Cloud Armor(WAF) 제품을 연계하여 L7 LB에 DDoS, OWASP 상위 10가지 위협, IP 및 지역 기반 엑세스 제어를 설정합니다

https://cloud.google.com/armor

 

Cloud Armor 네트워크 보안  |  Google Cloud Armor

Google Cloud Armor는 DDoS 및 애플리케이션 공격을 방어하고 다양한 WAF 규칙 집합을 제공하는 네트워크 보안 서비스입니다.

cloud.google.com

 

해당 흐름에 대한 설명은 아래 링크에서 참고바람

2023.01.17 - [Cloud/GCP] - [GCP] Apigee X 기본개념 및 환경구성

 

[GCP] Apigee X 기본개념 및 환경구성

API 관리 플랫폼 OpenAPI Spec 3.0 지원 다양한 과금정책 전체 API 트래픽 수집 및 분석 통합 모니터링 기반 메트릭 지원 Configuration & Code 모두 지원 (Java, JS, Python등 50여개 빌트인 정책 지원) End to end Secu

majjangjjang.tistory.com

 

목표

  • Apigee 위협 방지 정책을 사용하여 악성 JSON 및 XML 페이로드 차단
  • Cloud Armor 정책 만들기
  • 요청 차단 및 허용을 위한 Cloud Armor 규칙 만들기
  • 부하 분산기에 Cloud Armor 정책 적용
  • HTTP 트래픽을 사용하여 Cloud Armor 정책 테스트

작업 1. JsonThreatProtection Flow 만들기

JsonThreatProtection 

지정된 제한을 초과하는 수신 Json 요청을 거부합니다.

정책을 Shared Flow에 배치하고 Shared Flow를 Flow Hook 과 사용하여 정책이 환경에 배포된 모든 Proxy에대한 요청을 보호할 수 있다.

https://cloud.google.com/apigee/docs/api-platform/reference/policies/json-threat-protection-policy

 

JSONThreatProtection 정책  |  Apigee X  |  Google Cloud

projects.locations.connections.runtimeEntitySchemas

cloud.google.com

https://cloud.google.com/apigee/docs/api-platform/fundamentals/shared-flows

 

재사용 가능한 공유 흐름 만들기  |  Apigee X  |  Google Cloud

 

cloud.google.com

https://cloud.google.com/apigee/docs/api-platform/fundamentals/flow-hooks

 

흐름 후크를 사용하여 공유 흐름 연결  |  Apigee X  |  Google Cloud

 

cloud.google.com

반응형

 

 

Develop  - Shared Flows 에 이동하여 'Create New' 클릭

 

Classic 모드로 전환

 

'DEVELOP' 탭 전환 후 '+ Step'클릭

 

JSON Threat Protection 선택 후 이름 'JTP-protect' 설정

JSONThreatProtection 정책에는 들어오는 JSON 요청에 대한 제한을 제공 하는 여러 요소가 포함되어 있습니다. 일반적으로 API의 최대값을 기준으로 이러한 제한을 설정합니다. 이 경우 정책에 대한 기본 구성을 유지하십시오.

이 정책은 요청의 Content-Type 헤더가 application/json 으로 설정되어 들어오는 요청에 JSON 페이로드가 있음을 나타내는 경우에만 실행됩니다 

 

Save 클릭 후 Deploy하기

 

생성한 Shared Flow를 Flow hook 에 연결하기

Admin - Environments - Flow hooks 이동 후 'Pre-proxy' 편

 

생성한 protect-json 선택 후 OK

 

작업 2. Cloud Armor 보안정책 설정

Google Cloud의 웹 애플리케이션 방화벽입니다. 부하 분산기에 단일 Cloud Armor 정책을 지정할 수 있습니다. 이 실습에서는 Cloud Armor 보안 정책을 사용하여 특정 트래픽이 Apigee 런타임 인스턴스에 도달하기 전에 거부하여 API를 보호합니다.

 

참고: Apigee 런타임 인스턴스 IP 주소가 알려질 때까지 부하 분산기를 완전히 구성할 수 없으므로 부하 분산기 구성이 완료될 때까지 비정상 인스턴스가 있는 부하 분산기가 표시될 수 있습니다.

 

 

GCP Project에서 Network Security - Cloud Armor 이동 후 'Create Policy'

 

정책이름: protect-apis

기본적으로 Deny시 403 설정 후 next step

 

 

Advanced mode 활성화 후 US에서 들어온 트래픽만 허용하도록 설정한다.

origin.region_code == 'US'

 

 

추가로 region_code의 규칙은 ISO 3166-2 를 따른다.

https://en.wikipedia.org/wiki/ISO_3166-2

Add Rule을 눌러 SQL Injection Attact 도 차단하는 설정을 한다.

Match 코드부분

evaluatePreconfiguredExpr('sqli-stable', ['owasp-crs-v030001-id942251-sqli', 'owasp-crs-v030001-id942420-sqli', 'owasp-crs-v030001-id942431-sqli', 'owasp-crs-v030001-id942460-sqli', 'owasp-crs-v030001-id942421-sqli', 'owasp-crs-v030001-id942432-sqli'])

이 표현식은 사전 구성된 Cloud Armor 규칙 을 지정합니다 . 미리 구성된 규칙은 오픈 소스 산업 표준 서명을 사용하여 악의적인 요청을 탐지합니다. 해제할 서명 이름을 제공하여 특정 서명을 비활성화할 수 있습니다.

이 경우 민감도 수준 3 및 4의 서명이 해제됩니다. 편집증 수준 이라고도 하는 서명의 민감도 수준 은 오탐지 수가 더 많은 대신 더 높은 보안 수준을 절충하도록 지정합니다.

수준 1은 오탐이 거의 발생하지 않는 기본 보안 수준입니다. 수준 2는 지능적이고 난독화된 공격에 대한 추가 보호 기능을 추가합니다. 수준 3 및 4의 서명은 보다 공격적이며 오탐을 유발할 가능성이 훨씬 더 높습니다. 예를 들어 간단한 JSON 페이로드가 포함된 POST 요청은 수준 3 또는 4 서명으로 플래그가 지정될 수 있습니다.

 

이렇게 설정하고 Create Policy 버튼을 클릭하여 정책생성을 완료한다.

 

현재까지 한 설정으로 순서를 말하자면

1. SQL Injection Attack 패턴이 감지되면 Deny

2. US 에서 들어오는 트래픽 이면 Allow

3. 그외 다른지역의 트래픽 Deny

 

생성한 Cloud Armor을 L7 LB에 붙인다.

작업 3. US에 위치한 VM에서 API 호출 테스트

### 단순 호출시 
curl -i -k "https://eval.example.com/hello-world"

### result
HTTP/2 200
x-powered-by: Apigee
access-control-allow-origin: *
x-frame-options: ALLOW-FROM RESOURCE-URL
x-xss-protection: 1
x-content-type-options: nosniff
content-type: text/plain; charset=utf-8
content-length: 13
etag: W/"d-CD90h6x0eIVqiTkn8InWaeagV3Q"
date: Tue, 17 Jan 2023 07:15:36 GMT
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
x-request-id: 7febc2e6-bcb5-4e21-928d-a30dbafd708a
via: 1.1 google, 1.1 google

Hello, Guest!
### Shared flow에 설정된 JsonThreatProtection 정책에 지정된 ObjectEntryNameLength 제한을 초과
curl -i -k -X POST "https://eval.example.com/hello-world" -H "Content-Type: application/json" -d '{ "ThisIsAReallyLongElementNameIMeanReallyReallyReallyLong": 42 }'

### result
HTTP/2 500
content-type: application/json
x-request-id: d0122db6-84ea-457c-99e1-61f36b692193
content-length: 235
date: Tue, 17 Jan 2023 07:16:57 GMT
via: 1.1 google
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000

{"fault":{"faultstring":"JSONThreatProtection[JTP-Protect]: Execution failed. reason: JSONThreatProtection[JTP-Protect]: Exceeded object entry name length at line 1","detail":{"errorcode":"steps.jsonthreatprotection.ExecutionFailed"}}}

 

### SQL Injtection Attack 으로 공격시
curl -i -k "https://eval.example.com/hello-world?item=name'%20OR%20'a'='a"

### Result
HTTP/2 403
content-length: 134
content-type: text/html; charset=UTF-8
date: Tue, 17 Jan 2023 07:20:17 GMT
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000

<!doctype html><meta charset="utf-8"><meta name=viewport content="width=device-width, initial-scale=1"><title>403</title>403 Forbidden

작업 4. US가 아닌 VM에서 API 호출 테스트

### API 호출
curl -i -k "https://eval.example.com/hello-world"

### Result
HTTP/2 403
content-length: 134
content-type: text/html; charset=UTF-8
date: Tue, 17 Jan 2023 07:22:01 GMT
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000

<!doctype html><meta charset="utf-8"><meta name=viewport content="width=device-width, initial-scale=1"><title>403</title>403 Forbidden

 

출처

GCP SkillBoost - Protecting APIs with Apigee X and Cloud Armor

https://partner.cloudskillsboost.google/focuses/20321?parent=catalog

반응형