마짱짱의 지식창고
[GCP] Apigee, Cloud Armor 이용하여 API 보호 본문
Apigee X 의 위협보호정책을 통해 콘텐츠 기반 위협으로부터 API를 보호
https://cloud.google.com/apigee/docs/api-platform/security/content-based-security
또한 GCP의 Cloud Armor(WAF) 제품을 연계하여 L7 LB에 DDoS, OWASP 상위 10가지 위협, IP 및 지역 기반 엑세스 제어를 설정합니다
https://cloud.google.com/armor
해당 흐름에 대한 설명은 아래 링크에서 참고바람
2023.01.17 - [Cloud/GCP] - [GCP] Apigee X 기본개념 및 환경구성
목표
- 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
https://cloud.google.com/apigee/docs/api-platform/fundamentals/shared-flows
https://cloud.google.com/apigee/docs/api-platform/fundamentals/flow-hooks
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
'Cloud > GCP' 카테고리의 다른 글
[GCP] Cloud Code - VS Code 환경 구축 (0) | 2023.02.10 |
---|---|
[GCP] Binary Authorization을 이용하여 신뢰한 이미지만 GKE 배포 (0) | 2023.01.30 |
[GCP] NAT를 이용하여 Apigee Backend Service (0) | 2023.01.17 |
[GCP] Apigee X Environment 및 Group 추가 설정 (0) | 2023.01.17 |
[GCP] Apigee X 기본개념 및 환경구성 (0) | 2023.01.17 |