서비스를 운영하다 보면 내부 시스템을 외부에 노출시켜야 하는 상황이 생긴다. 특히 클라이언트사 담당자들이 접근하는 운영/통계용 대시보드는 접근 권한을 세밀하게 제어해야 할 필요가 있는데, GCP 환경에서 Google Cloud Armor를 활용한 IP 기반 접근 제어를 구현하게 되었다.
이 글은 Cloud Armor를 활용하여 특정 IP만 접근 가능하도록 구성하고, 허용되지 않은 IP는 커스텀 에러 페이지로 유도하는 구성 방법을 상세히 정리한 실전 가이드이다.
왜 Cloud Armor를 도입했는가
Cloud Armor를 도입한 이유는 명확하다. 운영 중인 VM이 퍼블릭하게 노출되어 있고, 이 서비스에 접근 가능한 IP를 고객사 내부망으로 제한하고자 했기 때문이다.
GCP의 VM 방화벽 기능으로도 IP를 제어할 수 있지만, 다음과 같은 이유로 Cloud Armor를 선택했다:
- VM 수준이 아닌 LB(Load Balancer) 수준에서 제어 가능
- 커스텀 에러 페이지 리디렉션 구성 가능
- 향후 WAF, DDoS 대응까지 고려한 확장성 보유
1. Cloud Armor 생성
목적: 특정 IP만 허용하고, 허용되지 않은 IP의 요청을 차단하여 403 에러를 반환하도록 설정
단계별 설정
- GCP 콘솔 → 네트워크 보안 → Cloud Armor 이동
- "보안 정책(Security Policy) 생성" 클릭
- 정책 이름 설정: 예) dev-access-policy
- 정책 규칙 추가:
- 허용할 IP 추가 → ALLOW 설정
- 차단할 모든 IP 추가 → DENY (403) 설정
- 정책 저장 후 Load Balancer의 백엔드 서비스에 적용
- 예: dev-web-loadbalancer-backend
결과: 지정된 IP 이외의 접근은 모두 403 Forbidden 반환
2. Load Balancer 선택 & 설정
목적: Cloud Armor가 적용된 Load Balancer에서 차단된 요청이 발생하면, 특정 에러 페이지로 리디렉션
단계별 설정
- GCP 콘솔 → 네트워크 서비스 → Load Balancing 이동
- 기존 Load Balancer 선택 (예: dev-loadbalancer)
- 백엔드 서비스(Backend Service) 확인
- dev-web-loadbalancer-backend가 Cloud Armor와 연결되어 있는지 확인
- 라우팅 규칙 수정:
- 예: dev.example.com 도메인 확인
- Cloud Armor 정책 적용 확인
결과: 허용된 IP는 정상 접속, 차단된 IP는 403 Forbidden 발생
3. Cloud Storage에 403 에러 페이지 추가 후 공개 설정
목적: 차단된 사용자가 403 Forbidden 페이지를 보도록 설정
단계별 설정
- GCP 콘솔 → Cloud Storage 이동
- 새 버킷 생성 (예: dev-error-page-bucket)
- 403.html 파일 업로드 (커스텀 메시지 작성)
- 파일 공개 설정:
- allUsers에게 READER 권한 부여
결과: Public URL 을 통해 접근 가능
4. Load Balancer에 백엔드 버킷 추가 후 dev 환경에 적용
목적: Cloud Armor에서 403 응답이 발생하면, Cloud Storage의 403 페이지로 리디렉트
1) 백엔드 버킷 추가
- GCP 콘솔 → Load Balancing 이동
- "백엔드 구성" 탭 클릭
- "새 백엔드 버킷 생성"
- 이름: dev-error-page-bucket-backend
- Cloud Storage 버킷 선택: dev-error-page-bucket
- Cloud CDN 여부 설정 (선택)
- 저장 및 배포
결과: Load Balancer가 정적 페이지를 서빙할 수 있음
2) dev 환경에 403 경로 추가
- Load Balancer → 라우팅 규칙 편집
- 호스트 및 경로 규칙 추가:
- 호스트: error-dev.example.com
- 경로: /403.html
- 백엔드: dev-error-page-bucket-backend
- 저장 및 배포
3) 정책에 403 커스텀 오류 페이지 적용
defaultCustomErrorResponsePolicy:
errorResponseRules:
- matchResponseCodes:
- 403
path: '/403.html'
errorService: https://www.googleapis.com/compute/v1/projects/my-gcp-project/global/backendBuckets/dev-error-page-bucket-backend
결과: Cloud Armor가 차단한 요청은 /403.html 페이지로 자동 리디렉트됨
VM 방화벽과의 차이점
처음엔 단순히 VM 방화벽으로도 IP를 제한할 수 있지 않을까 생각했지만, 운영 VM에 직접 방화벽을 적용하면 배포 시 마다 규칙을 변경해야 하고, 커스텀 에러 페이지를 구성할 수 없다는 점이 문제였다.
Cloud Armor는 LB 앞단에서 트래픽을 차단하기 때문에 서비스 자체에 부담을 주지 않으며, UX를 고려한 안내 페이지 제공까지 가능하다. 여기에 DDoS 대응과 WAF 설정까지 고려할 수 있는 구조라, 확장성과 보안성을 모두 만족시킬 수 있는 선택이었다.
DDoS 방어 | ✅ Google Edge Network에서 차단 | ❌ VM까지 트래픽이 도달 후 차단 |
IP Spoofing 대응 | ✅ 네트워크 계층에서 차단 | ❌ VM 내부에서만 적용됨 |
SQL Injection / XSS 방어 | ✅ WAF 기능 제공 | ❌ 수동 설정 필요 |
L7 공격 방어 | ✅ 웹 애플리케이션 공격 차단 가능 | ❌ L4 레벨에서만 차단 |
마무리
이번 구성은 단순한 접근 제한을 넘어서, 사용자에게 명확한 안내 메시지를 제공하고 내부망 IP만 접근할 수 있도록 구성하는 실전형 아키텍처이다.
Cloud Armor를 통해 IP 기반 접근 제어를 구현하고, 커스텀 에러 페이지로 사용자 경험까지 챙기는 설정이 필요한 상황이라면, 이 글이 충분히 도움이 될 것이다.
'Cloud' 카테고리의 다른 글
Teams 휴가 시스템 구축 - Microsoft 365 (Automate 자동화, Power Apps 연동) (1) | 2025.07.10 |
---|---|
[GCP] Bastion Host VM 서버 구축 (Proxy, OS Login) (0) | 2025.04.27 |
Certbot 으로 Let’s encrypted 무료 https SSL 적용 - AWS Node.js (1) | 2024.08.03 |