| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- github actions
- 도커
- 트러블슈팅
- 컨테이너
- Database
- 분산시스템
- 마이크로서비스
- PostgreSQL
- dockercompose
- 백엔드
- 마이크로서비스아키텍처
- gradle
- GitHub Packages
- 공통모듈
- java
- Flyway
- springboot
- 인프라
- SpringCloud
- 마이그레이션
- 멀티모듈
- 백엔드면접준비
- docker
- ci/cd
- 아키텍처
- Java 8
- GCP
- MSA
- 자바
- CS
- Today
- Total
NYO_O
GCP 단일 VM 프로비저닝: 서비스 계정(IAM) 최소 권한 원칙 적용 본문
왜 기본 서비스 계정을 사용하지 않는가?
GCP에서 Compute Engine(VM)을 생성하면 기본적으로 'Compute Engine 기본 서비스 계정'이 할당됩니다. 이 계정은 프로젝트에 대한 편집자(Editor) 권한을 가지고 있어, 자칫 애플리케이션에 취약점이 발생해 VM이 탈취될 경우 프로젝트 전체 리소스가 위험해지는 치명적인 보안 맹점을 가집니다.
따라서 프로덕션 환경의 인프라를 구축할 때는 반드시 최소 권한의 원칙(Principle of Least Privilege)을 지켜야 합니다. 이번 글에서는 애플리케이션 구동에 딱 필요한 권한(Secret Manager 읽기, Cloud SQL 연결, Artifact Registry 이미지 다운로드)만 가진 전용 서비스 계정을 만들고, 이를 활용해 안전한 VM을 프로비저닝하는 과정을 정리해 보겠습니다.
환경 변수를 활용한 인프라 설정 효율화
GCP CLI(gcloud)를 사용할 때 매번 프로젝트 ID나 리전 등의 긴 문자열을 타이핑하는 것은 오타를 유발하고 비효율적입니다. 먼저 터미널에 환경 변수를 선언하여 작업의 일관성을 확보합니다.
export PROJECT_ID="toktot"
export REGION="asia-northeast3"
export ZONE="asia-northeast3-a"
export VM_NAME="toktot-prod-vm"
export VM_SA_NAME="toktot-prod-sa"
export VM_SA_EMAIL="${VM_SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com"
export VM_MACHINE_TYPE="e2-small"
export VM_DISK_SIZE="30GB"
export VM_DISK_TYPE="pd-balanced"
export VM_IMAGE_FAMILY="ubuntu-2204-lts"
export VM_IMAGE_PROJECT="ubuntu-os-cloud"
export VM_NETWORK_TAG="toktot-web"
이렇게 설정해 두면 이후 명령어에서 $VM_NAME과 같이 재사용할 수 있어 스크립트 작성과 관리가 훨씬 수월해집니다.
전용 서비스 계정 생성 및 최소 권한(IAM) 부여
이제 VM이 사용할 전용 서비스 계정을 생성합니다.
gcloud iam service-accounts create $VM_SA_NAME \
--project=$PROJECT_ID \
--display-name="Toktot Prod VM Service Account" \
--description="Attached to GCE VM running toktot-server. Used by Secret Manager API, Cloud SQL Auth Proxy, and Artifact Registry pull."
출력 결과:
Created service account [toktot-prod-sa].
계정이 생성되었으니, 단일 VM 아키텍처 구성에 필요한 세 가지 필수 역할(Role)만 정확하게 바인딩해 줍니다.
- Secret Manager 접근 (secretAccessor): 애플리케이션 시크릿 키 조회용
- Cloud SQL 클라이언트 (cloudsql.client): DB 연결을 위한 Auth Proxy 구동용
- Artifact Registry 리더 (artifactregistry.reader): 도커 이미지 Pull 용도
# Secret Manager 권한 부여
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$VM_SA_EMAIL" \
--role="roles/secretmanager.secretAccessor" \
--condition=None
# Cloud SQL 권한 부여
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$VM_SA_EMAIL" \
--role="roles/cloudsql.client" \
--condition=None
# Artifact Registry 권한 부여
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$VM_SA_EMAIL" \
--role="roles/artifactregistry.reader" \
--condition=None
각 명령어를 실행할 때마다 Updated IAM policy for project [toktot]. 메시지와 함께 현재 바인딩된 IAM 정책 목록이 반환되는 것을 확인할 수 있습니다.
보안이 강화된 VM 인스턴스 생성 및 IAP 접속
권한 설정이 완료된 서비스 계정을 부착하여 Ubuntu 22.04 LTS 기반의 인스턴스를 생성합니다. 이때 shielded-secure-boot, shielded-vtpm 등의 플래그를 추가하여 루트킷이나 부트킷으로부터 인스턴스를 보호하는 쉴드(Shielded) VM 옵션을 활성화합니다.
gcloud compute instances create $VM_NAME \
--project=$PROJECT_ID \
--zone=$ZONE \
--machine-type=$VM_MACHINE_TYPE \
--image-family=$VM_IMAGE_FAMILY \
--image-project=$VM_IMAGE_PROJECT \
--boot-disk-size=$VM_DISK_SIZE \
--boot-disk-type=$VM_DISK_TYPE \
--boot-disk-device-name=$VM_NAME \
--service-account=$VM_SA_EMAIL \
--scopes=cloud-platform \
--tags=$VM_NETWORK_TAG \
--metadata=enable-oslogin=TRUE \
--shielded-secure-boot \
--shielded-vtpm \
--shielded-integrity-monitoring
명령어를 실행하면 아래와 같이 인스턴스가 성공적으로 생성됩니다. (디스크 크기와 관련한 경고는 베이스 이미지 크기보다 큰 디스크를 할당했을 때 나오는 정상적인 안내 메시지입니다.)
Created [[https://www.googleapis.com/compute/v1/projects/toktot/zones/asia-northeast3-a/instances/toktot-prod-vm](https://www.googleapis.com/compute/v1/projects/toktot/zones/asia-northeast3-a/instances/toktot-prod-vm)].
WARNING: Some requests generated warnings:
- Disk size: '30 GB' is larger than image size: '10 GB'. You might need to resize the root repartition manually...
NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS
toktot-prod-vm asia-northeast3-a e2-small 10.178.0.2 34.47.89.193 RUNNING
중요 보안 포인트: IAP(Identity-Aware Proxy)를 통한 SSH 접속 인스턴스가 생성된 후, 서버에 접근하기 위해 단순히 22번 포트를 퍼블릭 방화벽으로 여는 것은 매우 위험합니다. 대신 GCP가 제공하는 IAP 터널링을 이용해 접속합니다.
gcloud compute ssh $VM_NAME --zone=$ZONE --tunnel-through-iap
출력 결과:
WARNING:
To increase the performance of the tunnel, consider installing NumPy.
...
Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 6.8.0-1058-gcp x86_64)
System information as of Sat May 23 22:14:56 UTC 2026
...
ddangme121_gmail_com@toktot-prod-vm:~$
성공적으로 VM 내부에 접속되었습니다. --tunnel-through-iap 플래그를 사용하면 별도의 SSH 키 관리나 외부 방화벽 오픈 없이, IAM 인증만으로 안전하게 쉘에 접근할 수 있습니다.
결론
기본 서비스 계정을 무분별하게 사용하는 대신, 애플리케이션의 동작 원리에 맞춰 꼭 필요한 권한만 조합한 전용 서비스 계정(toktot-prod-sa)을 구성했습니다. 이 과정을 통해 인프라 레벨의 보안 가시성을 크게 높일 수 있었습니다.
프로비저닝된 안전한 깡통 우분투(Ubuntu) 서버가 준비되었으니, 다음 글에서는 이 환경 위에서 구동될 런타임 환경 즉, Docker 셋업과 Artifact Registry 인증 연동 과정에 대해 다루어 보겠습니다.
'프로젝트 > 똑똣(TokTot)' 카테고리의 다른 글
| Cloudflare Tunnel을 활용한 단일 VM Zero Trust 아키텍처 전환기 (1) | 2026.05.24 |
|---|---|
| Ubuntu 환경 Docker 셋업 및 GCP Artifact Registry 인증 연동 (0) | 2026.05.24 |
| 단일 VM 환경에서 GCP 로드밸런서(ALB) 대신 Cloudflare를 선택한 이유 (0) | 2026.05.23 |
| [스프링] OSIV란 무엇인가 (0) | 2026.05.23 |