VPC 서비스 제어 사용

VPC 서비스 제어는 데이터 무단 반출을 방지하기 위해 보안 경계를 설정할 수 있는 Google Cloud 기능입니다. 이 페이지에서는 Cloud Build 비공개 풀에 VPC 서비스 제어를 사용하여 빌드에 보안을 추가하는 방법을 보여줍니다.

제한사항

VPC 서비스 제어 보호는 비공개 풀에서 실행되는 빌드에만 사용할 수 있습니다. 기본 풀에서 실행되는 빌드에는 VPC 서비스 제어를 사용할 수 없습니다.

시작하기 전에

  • 이 가이드에서 명령줄 예시를 사용하려면 Google Cloud CLI를 설치하고 구성합니다.

  • Virtual Private Cloud 네트워크와 비공개 풀이 있는 VPC 네트워크 간에 비공개 연결을 설정합니다. 자세한 내용은 비공개 풀을 만들기 위한 환경 설정을 참조하세요.

VPC 서비스 제어 경계에 비공개 풀 설정

Cloud Build에서 VPC 서비스 제어를 사용하려면 먼저 조직 수준에서 수행되는 서비스 경계를 만들고 구성해야 합니다. 이 설정을 사용하면 Cloud Build를 사용할 때 VPC 서비스 제어 검사가 시행되며 개발자는 VPC 서비스 제어를 준수하는 빌드만 실행할 수 있습니다.

VPC 서비스 제어 경계 만들기

Identity and Access Management 권한: 서비스 경계를 설정하려면 조직 뷰어Access Context Manager 편집자역할이 필요합니다. 이러한 역할을 부여하는 안내는 Cloud Build 리소스에 대한 액세스 구성을 참조하세요.

VPC 서비스 제어 경계를 만들려면 다음 안내를 따르세요.

VPC 서비스 제어 빠른 시작에 따라 다음을 수행합니다.

  1. 서비스 경계를 만듭니다.
  2. 비공개 풀을 만들려는 프로젝트를 경계에 추가합니다.

  3. Cloud Build API를 제한합니다.

서비스 경계를 설정한 후 Cloud Build API에 대한 모든 호출이 동일한 경계 내에서 발생한 호출인지 검사합니다.

VPC 서비스 제어 경계에 대한 액세스 권한을 Cloud Build 서비스 계정에 부여

Cloud Build는 Cloud Build 서비스 계정 또는 사용자 지정된 서비스 계정을 사용하여 사용자 대신 빌드를 실행합니다. 다음의 경우에는 빌드가 경계 내 리소스에 액세스할 수 있도록 VPC 서비스 제어 매개변수에 대해 서비스 계정에 액세스 권한을 부여해야 합니다.

Cloud Build API 또는 명령줄을 사용하여 빌드를 시작하기 위해 사용자 지정 서비스 계정을 사용하는 경우 서비스 계정에 VPC 서비스 제어 경계에 대한 액세스 권한을 부여할 필요가 없습니다.

다음 단계를 수행하여 VPC 서비스 제어 경계에 대해 Cloud Build 서비스 계정에 액세스 권한을 부여합니다.

  1. Cloud Build 서비스 계정 또는 사용자 지정된 서비스 계정의 이메일 주소를 확인합니다. Cloud Build 서비스 계정의 이메일 주소를 가져오려면 다음 안내를 따르세요.

    1. IAM 페이지 열기:

      IAM 페이지 열기

    2. 서비스 경계에 추가한 프로젝트를 선택합니다.

    3. 권한 테이블에서 @cloudbuild.gserviceaccount.com으로 끝나는 이메일 주소를 찾아서 기록해 둡니다. 이것이 사용자의 Cloud Build 서비스 계정입니다.

  2. 서비스 계정이 Cloud Build API를 호출할 수 있도록 서비스 경계의 인그레스 정책을 업데이트합니다. 이 인그레스 규칙은 서비스 계정이 CreateBuild API 호출을 수행할 수 있게 해줍니다. VPC 서비스 제어 인그레스 정책에 대한 자세한 내용은 인그레스 및 이그레스 정책 구성인그레스 및 이그레스 규칙을 참조하세요.

    - ingressFrom:
        identities:
        - serviceAccount:SERVICE_ACCOUNT_EMAIL
        sources:
        - accessLevel: '*'
      ingressTo:
        operations:
        - serviceName: 'cloudbuild.googleapis.com'
          methodSelectors:
          - method: '*'
        resources:
        - 'projects/PROJECT_NUMBER'
    
  3. 변수를 적절한 값으로 바꿔서 다음 명령어를 실행하여 경계 정책을 업데이트합니다.

    gcloud beta access-context-manager perimeters update PERIMETER_NAME \
        --set-ingress-policies=INGRESS-FILENAME \
        --policy=POLICY_ID
    

위 변수를 다음으로 바꿉니다.

  • SERVICE_ACCOUNT_EMAIL: Cloud Build 서비스 계정 또는 사용자 지정된 서비스 계정의 이메일 주소입니다.
  • PROJECT_NUMBER: VPC 서비스 제어 경계에 추가한 Google Cloud 프로젝트의 프로젝트 번호입니다.
  • PERIMETER_NAME: VPC 서비스 제어 경계의 이름입니다.
  • INGRESS-FILENAME: 인그레스 정책 파일의 이름입니다.
  • POLICY_ID: 액세스 정책의 ID입니다.

선택항목: 개발 머신에 경계 액세스 사용 설정

VPC 서비스 제어 검사는 Cloud Build API에 적용되므로 서비스 경계 내에서 발생하지 않는 한 Cloud Build API 호출이 실패합니다. 따라서 Cloud Build API, Google Cloud Console의 Cloud Build UI, Google Cloud CLI를 사용하여 빌드를 관리하려면 다음 옵션 중 하나를 선택합니다.

  • VPC 서비스 제어 경계 안에서 머신을 사용합니다. 예를 들어 VPN을 통해 VPC 네트워크에 연결된 Compute Engine VM 또는 온프레미스 머신을 사용할 수 있습니다.

  • 개발자에게 경계에 대한 액세스 권한을 부여합니다. 예를 들어 IP 주소나 사용자 ID를 기준으로 경계 액세스를 허용하는 액세스 수준을 만들 수 있습니다. 자세한 내용은 서비스 경계 외부에서 보호된 리소스에 액세스 허용을 참조하세요.

조직 정책 제약조건 설정

VPC 서비스 제어 검사가 올바르게 시행되고 지정된 비공개 풀만 사용하도록 Google Cloud 조직의 빌드를 제한하려면 constraints/cloudbuild.allowedWorkerPools 조직 정책 제약조건을 설정합니다. 조직 정책을 전체 조직 또는 조직 내 프로젝트 또는 폴더에 적용할 수 있습니다. 예를 들어 조직 정책에서 다음을 지정할 수 있습니다.

  • 조직 내 모든 빌드가 지정된 비공개 풀을 사용합니다.
  • 폴더 내 모든 빌드가 지정된 비공개 풀을 사용합니다.
  • 프로젝트 내 모든 빌드가 지정된 비공개 풀을 사용합니다.

IAM 권한: 조직 정책을 관리하려면 조직 정책 관리자(roles/orgpolicy.policyAdmin) 역할이 필요합니다. 역할 부여에 대한 안내는 Cloud Build 리소스에 대한 액세스 구성을 참조하세요.

gcloud resource-manager org-policies allow 명령어는 조직 내 빌드가 지정된 비공개 풀만 사용하도록 요구하는 조직 정책을 설정합니다.

 gcloud resource-manager org-policies allow \
     cloudbuild.allowedWorkerPools \
     projects/PRIVATEPOOL_PROJECT_ID/locations/LOCATION/workerPools/PRIVATEPOOL_ID \
     --organization ORGANIZATION_ID

위 명령어의 자리표시자 값을 다음으로 바꿉니다.

  • PRIVATEPOOL_ID: 빌드를 실행할 비공개 풀의 ID입니다.

  • PRIVATEPOOL_PROJECT_ID: 비공개 풀이 포함된 Google Cloud 프로젝트의 ID입니다.

  • LOCATION: 비공개 풀이 포함된 리전입니다.

  • ORGANIZATION_ID: 빌드를 실행하는 조직의 ID입니다.

이 명령어는 under:is 프리픽스를 지원합니다.

조직 내 모든 빌드가 조직에 속한 비공개 풀을 사용하도록 하는 조직 정책을 설정하는 방법은 다음과 같습니다.

 gcloud resource-manager org-policies allow \
     cloudbuild.allowedWorkerPools under:organizations/ORGANIZATION_ID \
     --organization ORGANIZATION_ID

여기서 ORGANIZATION_ID는 비공개 풀이 포함된 조직의 ID입니다.

폴더에 속한 프로젝트 내 모든 빌드가 지정된 프로젝트의 비공개 풀을 사용하도록 하는 조직 정책을 설정하려면 다음 안내를 따르세요.

 gcloud resource-manager org-policies allow \
     cloudbuild.allowedWorkerPools under:projects/PROJECT_ID \
     --folder FOLDER_ID

여기서 PROJECT_ID는 비공개 풀이 포함된 프로젝트의 ID이고 FOLDER_ID는 빌드를 실행 중인 프로젝트를 포함합니다.

프로젝트 내 모든 빌드가 지정된 프로젝트의 비공개 풀을 사용하도록 하는 조직 정책을 설정하려면 다음 안내를 따르세요.

 gcloud resource-manager org-policies allow \
     cloudbuild.allowedWorkerPools under:projects/PRIVATEPOOL_PROJECT_ID \
     --project BUILD_PROJECT_ID

여기서 PRIVATEPOOL_PROJECT_ID는 비공개 풀이 포함된 프로젝트의 ID이고 BUILD_PROJECT_ID는 빌드를 실행 중인 프로젝트의 ID입니다.

constraints/cloudbuild.allowedWorkerPools 조직 정책 제약조건을 시행할 때 다음 사항에 유의하세요.

  • 이 조직 정책 제약조건을 Google Cloud 프로젝트에 적용하는 경우 프로젝트 내 모든 빌드가 비공개 풀을 사용해야 합니다. 기본 공유 풀을 사용하려고 시도하는 빌드는 실패합니다.

  • Google Cloud 조직에 Cloud Build를 암시적으로 사용하는 App Engine 또는 Cloud Functions와 같은 서비스가 포함된 경우 조직 정책 제약조건에 따라 이러한 서비스가 예상대로 작동하지 않을 수 있습니다.

서비스 경계에 비공개 풀 만들기

Console

  1. Google Cloud 콘솔에서 작업자 풀 페이지를 엽니다.

    Cloud Build 작업자 풀 페이지 열기

  2. 비공개 풀을 만들 프로젝트를 선택합니다.

  3. 작업자 풀 페이지에서 만들기를 클릭합니다.

  4. 비공개 풀 만들기 측면 패널에서 다음을 수행합니다.

    1. 비공개 풀의 이름을 입력합니다.

    2. 비공개 풀을 만들 리전을 선택합니다.

    3. 비공개 풀에 사용할 Compute Engine 머신 유형을 선택합니다.

    4. VPC 네트워크를 만든 Google Cloud 프로젝트의 프로젝트 번호를 입력합니다.

    5. VPC 네트워크의 이름을 입력합니다.

    6. 외부 IP 할당을 선택 해제합니다.

    7. 만들기를 클릭합니다.

gcloud

  1. YAML 또는 JSON 형식으로 비공개 풀 구성 파일을 만들고 egressOption 플래그를 NO_PUBLIC_EGRESS로 설정합니다.

    privatePoolV1Config:
      networkConfig:
        egressOption: NO_PUBLIC_EGRESS
        peeredNetwork: PEERED_NETWORK
      workerConfig:
        diskSizeGb: 'PRIVATE_POOL_DISK_SIZE'
        machineType: PRIVATE_POOL_MACHINE_TYPE
    

    각 항목의 의미는 다음과 같습니다.

    • PEERED_NETWORK는 서비스 제공업체 네트워크에 피어링된 네트워크의 네트워크 리소스 URL입니다. PEERED_NETWORKprojects/NETWORK_PROJECT_ID/global/networks/NETWORK_NAME 형식이어야 합니다. 여기서 NETWORK_PROJECT_ID는 VPC 네트워크를 보유한 Google Cloud 프로젝트의 프로젝트 ID이고 NETWORK_NAME은 VPC 네트워크의 이름입니다.
    • PRIVATE_POOL_MACHINE_TYPE은 비공개 풀 인스턴스의 Compute Engine 머신 유형입니다. 지원되는 머신 유형은 비공개 풀 구성 파일 스키마를 참조하세요.
    • PRIVATE_POOL_DISK_SIZE는 비공개 풀 인스턴스의 디스크 크기(GB)입니다. 100 이상이고 1,000 이하인 값을 지정합니다. 0을 지정하면 Cloud Build는 기본값 100을 사용합니다.
    • egressOption는 비공개 풀의 VPC 서비스 제어 경계를 사용 설정하는 플래그입니다. VPC 서비스 제어 경계 내에 비공개 풀을 만들려면 이를 NO_PUBLIC_EGRESS로 설정합니다.
  2. 다음 gcloud 명령어를 실행합니다. 여기서 PRIVATEPOOL_ID는 비공개 풀의 고유 식별자이고, PRIVATEPOOL_CONFIG_FILE은 비공개 풀 구성 파일 이름이며, REGION은 비공개 풀을 만들 리전입니다.

    gcloud builds worker-pools create PRIVATEPOOL_ID --config-from-file PRIVATEPOOL_CONFIG_FILE --region REGION
    

선택사항: VPC 네트워크에서 공개 인터넷 호출 사용 설정

다음 설정을 사용하여 저장소가 호스팅되는 위치(예: github.com)에 네트워크 연결을 허용하도록 VPC 네트워크가 구성되었는지 확인합니다.

  1. 비공개 풀 구성 파일에서 egressOption 필드를 NO_PUBLIC_EGRESS로 설정해야 합니다.

  2. 비공개 풀이 실행되는 VPC 네트워크를 PeeredNetwork로 정의합니다. 저장소 호스트 호출을 허용하려면 이 VPC 네트워크가 저장소 호스트에 대한 공개 이그레스를 허용해야 합니다. 이 작업에 대한 자세한 내용은 경로 및 방화벽 규칙을 참조하세요.

서비스 경계 내의 비공개 풀에서 빌드 실행

서비스 경계 내에서 실행되는 빌드는 공개 인터넷에 액세스할 수 없으므로 빌드를 실행하기 전에 몇 가지 작업을 수행해야 합니다.

빌드된 이미지 및 아티팩트 푸시

빌드가 다른 Google Cloud 프로젝트에 있는 Container Registry(지원 중단됨, Artifact Registry 또는 Cloud Storage에 이미지 및 아티팩트를 푸시하는 경우, 빌드가 시작된 프로젝트와 동일한 서비스 경계에 해당 프로젝트를 추가해야 합니다.

로그 버킷 만들기

서비스 경계 내에서 실행되는 빌드는 기본 Cloud Storage 로그 버킷의 빌드 로그를 저장할 권한이 없습니다. 다음 옵션 중 하나를 선택합니다.

빌드 실행

비공개 풀에서 빌드 실행의 안내에 따라 빌드를 실행합니다.

다음 단계