위험 요약
클라우드 환경에서 "읽기 전용" 권한은 안전하다는 인식이 널리 퍼져 있다. 읽기 전용이라면 데이터를 수정하거나 삭제할 수 없으니까 위험이 없다고 생각하기 쉽다. 그러나 읽기 전용이 쓰기 금지만 의미할 뿐, 기밀성 보장을 의미하지는 않는다는 사실을 간과하는 사례가 많다.
2026년 8월 초, 보안 연구자가 Google Cloud Platform(GCP)에서 roles/viewer(기본 뷰어)와 roles/cloudsql.viewer(Cloud SQL 뷰어) 역할이 실제 데이터 유출 경로로 작용할 수 있음을 지적한 기사가 공개되었다. 읽기 전용으로 보이는 역할이 데이터베이스 전체 다운로드를 생성하고, 평문 자격 증명을 노출하며, 구성 정보를 그대로 보여줄 수 있다는 것이다.
Google Cloud 공식 IAM 문서(마지막 업데이트: 2026-07-29)를 확인하면, roles/viewer와 roles/cloudsql.viewer 역할에 cloudsql.*.export 권한이 여전히 포함되어 있는 것으로 확인된다.
영향 범위
이 문제가 영향을 미치는 환경은 다음과 같다.
- GCP 프로젝트 수준에서 roles/viewer 역할을 부여받은 모든 환경: 프로젝트 전체에 기본 뷰어 역할을 부여하면 해당 프로젝트 내 거의 모든 서비스에 대해 .get와 .list 권한이 개방된다.
- roles/cloudsql.viewer 역할을 가진 사용자·서비스 계정·파이프라인: Cloud SQL 인스턴스의 메타데이터를 읽는 것으로 보이지만, 실제로는 전체 데이터베이스를 GCS(Google Cloud Storage) 버킷으로 내보낼 수 있다.
- Cloud SQL(MySQL, PostgreSQL, SQL Server)을 사용하는 GCP 환경: 뷰어 역할이 export 권한을 보유하므로, 적절한 GCS 버킷 권한이 결합될 경우 데이터 유출이 가능하다.
- 평문 자격 증명을 환경 변수나 메타데이터에 저장하는 환경: Cloud Run, Cloud Functions, App Engine, Compute Engine, Cloud Build 등에서 평문으로 저장된 데이터베이스 비밀번호, API 키, 웹훅 시크릿이 뷰어 역할로 노출될 수 있다.
기술적 분석
GCP 읽기 전용 역할의 위험은 크게 두 가지 경로로 나뉜다.
평문 구성 정보 노출
Secret Manager는 secretmanager.versions.access 권한이 필요하므로 뷰어 역할로는 접근할 수 없다. 이는 긍정적인 설계다. 그러나 Secret Manager 외부에 평문으로 저장되고 뷰어 역할이 읽을 수 있는 구성(예: 환경 변수, 메타데이터)에 포함된 자격 증명은 노출될 수 있다.
| 노출 경로 | 포함된 정보 | 읽기 권한 |
|---|---|---|
| Cloud Run / Cloud Functions / App Engine 환경 변수 | 데이터베이스 비밀번호, API 키, 웹훅 시크릿 | *.get |
| Compute Engine 메타데이터 및 시작 스크립트 | 부트스트랩 자격 증명, 초기화 토큰 | compute.instances.get |
| Cloud Build 구성 및 빌드 트리거 | 빌드 변수, 배포 키, 레지스트리 자격 증명 | cloudbuild.builds.get |
| 인프라 구조 구성(IaC) 및 리소스 설명 | 인라인으로 전달된 모든 값 | .get, .list |
이 모든 접근은 쓰기 권한 없이 .get와 .list만으로 가능하다. 역할이 자원을 변경하지 못하더라도, 구성 정보를 읽어 시스템이 어떻게 침해당해야 하는지 파악하는 데 충분하다.
Cloud SQL 데이터베이스 전체 유출
이 부분이 가장 위험하며, 검증 가능한 핵심 문제다.
공격 경로는 다음과 같다.
- 내보내기 실행: roles/cloudsql.viewer 또는 roles/viewer 역할을 가진 주체가 cloudsql.instances.export 권한을 통해 Cloud SQL 인스턴스 전체를 GCS 버킷으로 내보낸다. 데이터베이스 사용자명, 비밀번호, cloudsql.client 연결 역할 모두 필요 없다.
- 전제조건 — GCS 버킷 쓰기 권한: export 작업이 성공하려면 Cloud SQL 인스턴스의 서비스 계정이 대상 GCS 버킷에 대해 storage.objects.create(Storage Object Creator) 권한을 가져야 한다. 즉, 뷰어 역할만으로는 부족하며, 인스턴스 서비스 계정의 버킷 IAM 권한이 결합되어야 export가 완료된다.
- 다운로드 파일 저장: 내보내기가 완료되면 .sql 또는 CSV 형식의 다운로드 파일이 Cloud Storage에 저장된다.
- 파일 다운로드: 프로젝트 수준의 기본 뷰어는 일반적으로 넓은 스토리지 읽기 권한(storage.objects.get 등)도 보유하고 있으므로, GCS에서 다운로드 파일을 다운로드할 수 있다.
이 과정의 결과는 데이터베이스 내부 데이터의 전체 읽기 접근이다. 메타데이터 누출이 아니라, 실제 데이터 유출(crown jewels exfiltration)이다. "뷰어" 역할이라는 라벨과 실제 동작 사이에 격차가 존재한다.
대응 전략
근본적인 위험을 줄이기 위한 조치가 있다.
즉시 수행
- Cloud SQL 내보내기를 사용하는 모든 주체 파악: 사용자, 서비스 계정, CI/CD 파이프라인을 모두 조사한다. gcloud audit log에서 cloudsql.instances.export 이벤트가 발생한 주체를 확인한다.
- export 권한이 필요한 주체에게만 역할 부여: roles/cloudsql.editor 또는 cloudsql.instances.export가 명시 포함된 커스텀 역할을 해당 주체에게만 부여한다. 전체 팀에 Editor 역할을 부여하는 것은 위험을 재도입하므로 피해야 한다.
- GCS 버킷 IAM 조건 설정: Cloud SQL 인스턴스 서비스 계정이 대상 버킷에 storage.objects.create 권한을 가지는 범위를 조건(policy condition)으로 제한한다. 특정 버킷 또는 접두사(prefix)에서만 export가 가능하도록 설정하면, 임의 버킷으로의 다운로드를 차단할 수 있다.
단기 수행
- 평문 자격 증명 파악과 이전: 환경 변수, 메타데이터, 빌드 구성에 평문으로 저장된 자격 증명을 모두 찾아 Secret Manager로 마이그레이션한다. Secret Manager는 뷰어 역할이 접근할 수 없는 소수의 안전한 저장소 중 하나다.
- 내보내기 이벤트 모니터링 설정: Cloud SQL export 이벤트에 대한 Cloud Monitoring 경고를 설정한다. 의심스러운 다운로드 작업이 정상 다운로드 작업으로 바뀌어야 한다.
장기 수행
- 기본 역할 제거: roles/viewer를 프로젝트 또는 조직 수준에서 부여하는 관행을 중단한다. 서비스별 사전 정의 역할이나 커스텀 역할로 교체한다.
- 커스텀 읽기 역할 구축: 의도한 get/list 권한만 부여하고, 데이터 접근을 가능하게 하는 권한은 배제하는 맞춤형 뷰어 역할을 만든다.
- 범위 좁히기: 조직 수준이 아닌 프로젝트 또는 리소스 수준에서 역할을 부여한다. "자기 자산에 대한 가시성"이 실제로 자기 자산만을 의미하도록 한다.
- VPC Service Controls 적용: Cloud SQL과 Cloud Storage 주변에 perimeter를 구성한다. 외부 주체의 데이터 접근을 구조적으로 차단한다.
- 정기 감사: 읽기 역할을 가진 주체와 해당 역할이 조회하고 있는 권한을 정기적으로 검토한다.
클라우드 비교
이 문제는 GCP만의 일이 아니다. AWS의 ReadOnlyAccess는 서비스 전반에 대한 읽기 전용 AWS 관리형 정책이며, Azure에서는 Monitoring Reader 역할이 메트릭 조회 권한을 제공하는 반면 진단 로그 조회는 Log Analytics Reader 또는 Log Analytics Data Reader 역할이 별도로 필요한 등, 각 클라우드 공급자마다 "읽기 전용"으로 명명된 역할의 실제 권한 범위가 복잡하게 나뉜다. 읽기 전용 역할의 실제 권한 범위를 정기적으로 검토하는 것이 중요하다.
읽기 전용(read-only)은 쓰기 금지를 의미할 뿐, 기밀성 보장을 의미하지 않는다. 모든 읽기 역할을 데이터 노출 관점에서 재검토해야 한다.
참고문헌
-
원문: Reader on GCP Is Not as Benign as It Looks
https://medium.com/@SecurityArchitect/reader-on-gcp-is-not-as-benign-as-it-looks-and-google-just-admitted-it-3ca902980ff3 -
Google Cloud IAM 역할과 권한
https://cloud.google.com/iam/docs/roles-permissions -
Google Cloud SQL IAM 역할
https://cloud.google.com/sql/docs/mysql/iam-roles -
Google Cloud Secret Manager 접근 제어
https://cloud.google.com/secret-manager/docs/access-control
본 콘텐츠는 AI 기술로 작성된 분석 리포트를 포함하고 있습니다. 내용 중 사실과 다르거나 보완이 필요한 정보를 발견하셨으면 댓글을 통해 의견을 부탁드립니다. 여러분의 피드백은 더 정확한 보안 정보 공유에 큰 도움이 됩니다.
댓글 (0)
댓글을 작성하려면 로그인이 필요합니다.
로그인아직 댓글이 없습니다.
첫 번째 댓글을 작성해보세요!