제한된 Google Cloud 환경에서 애플리케이션 개발

Google 문서는 제품 또는 기능을 준비하고 실행하는 데 도움이 되도록 작성되는 경우가 많지만 조직이 보안 제약조건을 적용하면 일부 문서가 제대로 작동하지 않을 수 있습니다. 예를 들어 회사는 Cloud Foundation Toolkit, Google Cloud 보안 청사진의 일부 보안 제약조건을 구현하거나 자체적으로 만들 수 있습니다.

이 도움말은 보안 제약조건을 사용하는 조직에서 볼 수 있는 애플리케이션 배포 오류 문제를 해결하는 데 도움이 됩니다.

보안 제약조건 문제 해결

IT 운영팀 또는 보안팀에서 조직 정책을 통해 보안 제약조건을 사용 설정할 수 있습니다. 이러한 제약조건은 조직의 리소스를 사용할 수 있는 방법을 제한합니다.

오류를 반환하는 API 요청을 실행하면 API 응답은 해당 오류가 정책 위반으로 인한 것인지 알려줍니다. 응답은 위반되는 제약조건을 설명해야 합니다. 다음 문제 해결 단계를 통해 위반 여부를 판단하고 파악할 수 있습니다.

  1. API 응답 오류 메시지를 검토합니다. 배포가 어떤 보안 제약조건을 위반하는지 파악할 수 있나요?

    다음 예시에서는 sql.restrictPublicIp 제약조건이 문제임을 보여줍니다.

    Organization Policy check failure
    The external IP of this instance violates the constraints/sql.restrictPublicIp enforced
    
  2. 정책 위반을 이해하는 경우 제약조건 내에서 작동하도록 리소스 배포 구성을 업데이트합니다.

    외부 공개 IP 주소를 제한하는 위의 예시에서 내부 비공개 IP 주소를 사용하도록 Cloud SQL 인스턴스를 구성합니다.

  3. 제약조건이 적용되는 이유나 무엇을 해야 할지 잘 모르겠다면 보안팀과 협력하여 조직의 계층 구조에서 정책이 적용되는 위치와 권장 해결 방법을 알아보세요.

    Terraform 템플릿과 같은 배포 템플릿이 조직에 공유되었는지 확인합니다. 이러한 템플릿은 Google Cloud 인프라가 구성된 방법을 자세히 설명하고 애플리케이션의 배포를 제한해야 합니다.

일반적인 보안 제약조건 문제

Google Cloud에 애플리케이션을 배포할 때 다음 예시와 같은 오류가 발생할 수 있습니다.

ERROR: (gcloud.alpha.sql.instances.create) HTTPError 400: Invalid request:
Organization Policy check failure: the external IP of this instance violates the
constraints/sql.restrictPublicIp enforced at the 123456789 project.

이 예시에서는 외부 공개 IP 주소를 사용하도록 Cloud SQL 인스턴스를 구성할 수 없습니다. 사용자 환경에 적용되는 정책에서 보안 제약조건이 적용되고 있습니다.

애플리케이션을 개발할 때 다음과 같은 일반적인 보안 제약조건을 사용 설정하고 API 오류 응답에서 자세히 확인할 수 있습니다.

Compute Engine

제약조건 이름 구현 이유 추천 해결 방법
constraints/compute.disableNestedVirtualization KVM 호환 하이퍼바이저를 VM 내에 설치하지 못하도록 합니다. 이러한 동작은 적절한 패치 적용 및 관리 없이 보안 위험을 초래할 수 있습니다. 하드웨어 가속 중첩 가상화를 사용하지 않도록 VM을 구성합니다.

기본적으로 Intel Haswell 이상의 CPU 플랫폼에서 실행되는 모든 Compute Engine VM에 이 기능이 사용 설정됩니다.
constraints/compute.requireShieldedVm 보안 부팅, vTPM, 무결성 모니터링 옵션이 사용 설정된 상태로 보안 디스크 이미지를 사용하려면 새 VM 인스턴스가 필요합니다. 이러한 옵션은 VM이 조작되거나 데이터가 액세스 또는 수정되는 것을 방지합니다. VM을 만들 때 보안 VM을 사용 설정하지 마세요.

GKE 클러스터를 만들려면 보안 GKE 노드를 사용 설정해야 합니다.

Dataflow는 현재 보안 VM 작업자를 지원하지 않습니다.
constraints/compute.disableSerialPortAccess VM과 상호작용하거나 공격을 형성하는 데 사용할 수 있는 진단 출력을 보려면 보안 벡터를 삭제합니다. VM을 만들 때 직렬 포트 액세스를 사용 설정하지 마세요.
constraints/compute.disableGuestAttributesAccess 악성 앱에서 악용될 수 있는 기본 호스트 및 플랫폼에 대한 정보 양을 최소화합니다. Compute Engine VM의 게스트 속성을 읽기 위해 Compute Engine API를 사용하지 마세요.
constraints/compute.vmExternalIpAccess 애플리케이션이 외부 IP 주소로 실행되고 인터넷에서 액세스할 수 없도록 합니다. VM의 외부 IP 액세스를 사용 중지합니다. 내부 비공개 IP 주소만 사용할 수 있습니다.

GKE는 공개 IP 주소 없이 비공개 클러스터를 사용할 수 있습니다.

Dataprep과 Dataflow는 현재 비공개 IP 주소를 지원하지 않습니다.

가상 네트워크 및 IP 주소

제약조건 이름 구현 이유 추천 해결 방법
constraints/compute.skipDefaultNetworkCreation 회사 관리 Virtual Private Cloud(VPC)만 만들 수 있고 네트워크 트래픽 또는 필터링 규칙이 적용되었는지 확인합니다. 조직의 기존 VPC에 애플리케이션을 연결합니다. 자동 생성된 기본 VPC는 새 프로젝트에 배포되지 않습니다.
constraints/compute.restrictXpnProjectLienRemoval 다른 프로젝트의 리소스가 해당 프로젝트의 네트워크 서비스를 사용하는 경우 공유 VPC가 실수로 삭제되지 않도록 합니다. 공유 VPC를 삭제하지 마세요. 삭제할 올바른 리소스를 타겟팅하고 있는지 확인하세요.
constraints/sql.restrictPublicIp Cloud SQL 인스턴스가 외부 IP 주소로 실행되고 인터넷에서 액세스할 수 없도록 합니다. 외부 공개 IP 주소를 사용하도록 Cloud SQL 인스턴스를 구성하지 마세요.

대신 내부 비공개 IP 주소를 사용하도록 Cloud SQL 인스턴스를 구성하세요.

ID 및 인증

제약조건 이름 구현 이유 추천 해결 방법
constraints/iam.disableServiceAccountKeyCreation 서비스 계정 키가 노출되면 보안 위험이 발생할 수 있으므로 내보내지 못하게 합니다. 서비스 계정이 아닌 다른 인증 형식을 사용합니다.
constraints/storage.uniformBucketLevelAccess Identity and Access Management(IAM)만 사용할 수 있도록 허용하여 스토리지 버킷에 잘못되거나 일관성 없는 권한이 적용될 위험을 최소화합니다. 균일한 버킷 수준 액세스를 사용 설정하여 Cloud Storage 버킷을 보호합니다.
constraints/iam.allowedPolicyMemberDomains Google Cloud 리소스 액세스를 승인된 도메인으로만 제한합니다. 승인된 도메인 중 하나에서 계정을 사용합니다. 이 제약조건에 대해 알려진 문제가 추가로 있습니다.

API 응답 오류 예시

Cloud SQL로 외부 공개 IP 주소를 제한하는 앞의 예시에서는 정책 위반으로 인해 API가 오류를 반환합니다. 다음 자세한 예시에서는 요청을 실패하게 하는 제약조건을 알려주는 API 응답을 보여줍니다. 자체 API 응답을 검토하여 애플리케이션 배포가 실패한 이유를 파악합니다.

gcloud 명령줄 도구를 사용한 Cloud SQL 실패:

$ gcloud alpha sql instances create mysql-node --project my-sql-project

ERROR: (gcloud.alpha.sql.instances.create) HTTPError 400: Invalid request:
Organization Policy check failure: the external IP of this instance violates the
constraints/sql.restrictPublicIp enforced at the 123456789 project.

Terraform을 사용한 Cloud SQL 실패:

$ terraform apply plan.out

[...]
module.mysql-db.google_sql_database_instance.default: Creating...

Error: Error, failed to create instance backend01-db-1c81e0e3: googleapi:
Error 400: Invalid request: Organization Policy check failure: the external IP
of this instance violates the constraints/sql.restrictPublicIp enforced at the
123456789 project., invalid

프로젝트에 적용된 조직 정책 나열

프로젝트는 폴더 또는 조직 수준에서 정책을 상속받을 수 있습니다. 액세스 역할에 따라 위반된 제약조건이 적용되는 위치를 확인하기 위해 계층 구조의 더 높은 수준에서 시행되는 정책을 보지 못할 수 있습니다.

프로젝트에 적용된 정책 또는 예외를 확인하려면 gcloud alpha resource-manager org-policies list 명령어를 사용하고 --project 매개변수로 프로젝트 ID를 지정합니다.

gcloud alpha resource-manager org-policies list --project <project-id>

적용되는 정책에 대한 자세한 내용을 보려면 gcloud alpha resource-manager org-policies describe 명령어를 사용하세요. 설명할 정책의 이름과 --project 매개변수가 있는 프로젝트 ID를 제공합니다.

gcloud alpha resource-manager org-policies describe <policy-name> --project <project-id>

다음 단계

정책이 적용되는 위치와 보안 제약조건을 해결할 방법을 확인할 수 없으면 IT 운영팀 또는 보안팀에 문의하세요. 각 조직은 각자의 환경에 맞춤설정된 정책과 청사진을 적용합니다.

조직에 적용할 수 있는 모든 컨트롤에 대한 자세한 내용은 조직 정책 제약조건 목록을 참조하세요.