[cloud] GCP Cloud Armor 보안 정책 구성 보고서 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki
1. 문서 개요
- 작성자: 이유성
- 작성일: 2025-06-10
- 프로젝트 ID: dev-ongi-3-tier
- 적용 대상 도메인: https://dev.ongi.today
- 목적
- 본 문서는 Spring Boot 기반 백엔드 API 서버 보호를 위한 Cloud Armor 보안 정책 도입 현황과 검증 결과, 그리고 정적 콘텐츠 보호 아키텍처 개선 계획을 기록하여 향후 운영 효율성과 보안 수준 향상에 기여하고자 작성되었습니다.
2. 도입 배경
- 기존 환경 및 이슈
- API 서버가 퍼블릭 서브넷에서 직접 외부 요청을 받는 구조
- .env, /swagger, /auth/login 등 경로에 대한 무차별 요청 탐지
- 특정 국가(IP 대역)에서의 악성 접근 다수 확인됨
- 보안 요구사항
- 국가 기반 접근 제어, 경로 기반 허용/차단, 비인가 요청 차단
- Cloud Load Balancer의 BackendService 단에서 L7 방어 적용
- 목표
- Cloud Armor 정책을 통한 API 서버 보호
- 국가 기반 IP 차단 및 경로 기반 필터링
- 헬스 체크, 인증 경로 등 일부 예외 허용
- 민감 요청 및 비인가 접근에 대한 알림 연계 기반 탐지 체계 구축
3. 기술 선정 기준 및 비교
항목 |
VPC 방화벽 |
Cloud Armor |
WAF(AWS/3rd) |
적용 계층 |
L3 |
L7 |
L7 |
경로 기반 필터링 |
불가능 |
가능 |
가능 |
국가/IP 필터링 |
IP 단위 |
지역 단위 |
가능 |
로깅 및 정책 관리 |
제한적 |
세분화된 룰 관리 가능 |
일부 비용 발생 |
운영 용이성 |
간단 |
GCP 서비스에 내장 |
외부 연동 필요 |
선정 이유: GCP 내 통합, L7 기반 제어, 비용 효율적이며 로깅 및 정책 기반 제어에 강점
4. 도입 기술 개요
- 기술명: Google Cloud Armor
- 정책 이름: dev-armor-policy
- 정책 유형: CLOUD_ARMOR
- 적용 대상: HTTPS Load Balancer의 BackendService(Spring Boot API 서버)
- 구성 방식
- 우선순위 기반 룰 시스템
- origin.region_code 조건을 활용한 국가 차단
- request.path 기반 경로 허용/차단
- 기본 차단(true)을 통한 보안 기본값 설정
5. 정책 규칙 구성
우선순위 |
조건 |
동작 |
설명 |
10 |
origin.region_code != "KR" |
거부(403) |
한국 외 국가 IP 차단 |
100 |
request.path.startsWith("/api") |
허용 |
API 진입점 허용 |
101 |
request.path.startsWith("/auth/login") |
허용 |
로그인 경로 허용 |
102 |
request.path.startsWith("/actuator/health") |
허용 |
헬스 체크 경로 허용 |
1000 |
true |
거부(403) |
기타 경로 전면 차단 |
2147483647 |
* |
허용 |
기본 규칙 (우선순위상 무시됨) |
6. 정책 적용 및 테스트 결과
적용 확인 절차
- BackendService에 보안 정책 연결 여부 확인:
gcloud compute backend-services describe [서비스명] --global
resource.type="http_load_balancer"
jsonPayload.enforcedSecurityPolicy.name="dev-armor-policy"
테스트 시나리오 및 결과 요약
테스트 케이스 |
기대 결과 |
실제 결과 |
/api/.env (Authorization 없음) |
403 Forbidden |
✅ 차단 성공 |
/actuator/health |
200 OK |
⚠️ 404 (URL 라우팅 문제) |
/index.html |
차단 또는 fallback |
⛔ GCS 응답 (Cloud Armor 비적용) |
/api 요청 (해외 IP) |
403 Forbidden |
✅ 차단 성공 |
7. 문제점 및 개선 필요사항
항목 |
이슈 |
개선 방향 |
/actuator/health |
404 응답 → GCS로 라우팅됨 |
backendService로 명시적 라우팅 추가 필요 |
GCS 정적 콘텐츠 |
Cloud Armor 미적용 대상 |
Cloud Run Proxy 또는 Signed URL 구조로 전환 고려 |
로그 일부 누락 |
샘플링 또는 로깅 미설정 가능성 |
각 룰 별 로깅 활성화 설정 필요 |
8. 향후 계획
- /actuator/health 경로의 라우팅 설정 수정
- /swagger, /docs, .env 등 민감 경로 차단 룰 추가
- Preview Rule을 활용해 Authorization 없는 요청 탐지용 룰 구성
- Cloud Logging 기반 Slack/Discord 보안 알림 연동
- GCS 콘텐츠 보호를 위한 Cloud Run Proxy → GCS 또는 Signed URL 구조 설계
9. 참고 명령어 요약
# 정책 생성
gcloud compute security-policies create dev-armor-policy \
--description="Cloud Armor policy for API gateway protection"
# 국가 차단
gcloud compute security-policies rules create 10 \
--security-policy=dev-armor-policy \
--expression='origin.region_code != "KR"' \
--action=deny-403
# /api 허용
gcloud compute security-policies rules create 100 \
--security-policy=dev-armor-policy \
--expression='request.path.startsWith("/api")' \
--action=allow
# 기본 차단
gcloud compute security-policies rules create 1000 \
--security-policy=dev-armor-policy \
--expression='true' \
--action=deny-403