VPC 서비스 제어 구성

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

이 통합과 관련된 제한사항은 VPC 서비스 제어 문서를 참조하세요.

조직 수준 설정

Cloud Functions와 함께 VPC 서비스 제어를 사용하려면 조직 수준에서 서비스 경계를 구성하면 됩니다. 적절한 조직 정책을 구성하면 Cloud Functions를 사용할 때 VPC 서비스 제어 검사가 시행되며 개발자는 VPC 서비스 제어를 준수하는 서비스만 배포하도록 보장할 수 있습니다. 조직 정책을 설정할 때 상속위반에 대해 자세히 알아보세요.

VPC 서비스 제어 경계 설정

서비스 경계를 설정하려면 조직 뷰어(roles/resourcemanager.organizationViewer)와 Access Context Manager 편집자(roles/accesscontextmanager.policyEditor) 역할이 필요합니다.

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

  1. 서비스 경계를 만듭니다.

  2. 경계에 하나 이상의 프로젝트를 추가합니다.

  3. Cloud Functions API(1세대) 또는 Cloud Functions API와 Cloud Run Admin API(2세대)를 모두 제한합니다.

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

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

VPC 서비스 제어 검사는 Cloud Functions API에 적용되기 때문에 Cloud Functions API에 대한 호출은 서비스 경계 내에서 발생하지 않는 한 실패합니다. 따라서 Cloud Functions API, Google Cloud 콘솔의 Cloud Functions UI 또는 Google Cloud CLI를 사용하여 함수를 관리하려면 다음 옵션 중 하나를 선택합니다.

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

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

조직 정책 설정

조직 정책을 관리하려면 조직 정책 관리자(roles/orgpolicy.policyAdmin) 역할이 필요합니다.

VPC 서비스 제어를 준수하고 데이터 무단 반출을 방지하려면 서비스 경계에서 Cloud Functions에 허용되는 네트워크 설정을 제어하는 다음 조직 정책을 설정합니다.

허용되는 인그레스 설정 제한

cloudfunctions.allowedIngressSettings 조직 정책은 개발자가 Cloud Functions에 사용할 수 있는 인그레스 설정을 제어합니다. 개발자가 ALLOW_INTERNAL_ONLY 값을 사용하도록 이 조직 정책을 설정합니다.

콘솔

  1. Google Cloud 콘솔에서 허용된 인그레스 설정 정책 페이지로 이동합니다.

    조직 정책으로 이동

  2. 정책 관리를 클릭합니다.

  3. 정책 수정 페이지에서 맞춤설정을 선택합니다.

  4. 정책 시행에서 교체를 선택합니다.

  5. 정책 값에서 커스텀을 선택합니다.

  6. 정책 유형에서 허용을 선택합니다.

  7. 커스텀 값 아래에 ALLOW_INTERNAL_ONLY을 입력합니다.

  8. 정책 설정을 클릭합니다.

gcloud

gcloud resource-manager org-policies allow 명령어를 사용합니다.

gcloud resource-manager org-policies allow \
  cloudfunctions.allowedIngressSettings ALLOW_INTERNAL_ONLY \
  --organization ORGANIZATION_ID

여기서 ORGANIZATION_ID는 조직 ID입니다.

이 조직 정책을 적용한 후에는 모든 함수가 인그레스 설정에 ALLOW_INTERNAL_ONLY 값을 사용해야 합니다. 즉, HTTP 함수는 서비스 경계 내의 VPC 네트워크에서 발생하는 트래픽만 허용할 수 있습니다. 다른 값을 지정하는 함수 배포는 실패합니다.

VPC 커넥터 필요

cloudfunctions.requireVPCConnector 조직 정책은 함수에 서버리스 VPC 액세스 커넥터가 필요한지 여부를 제어합니다. 이 조직 정책을 설정하여 다음과 같은 제약조건을 적용합니다.

콘솔

  1. Google Cloud 콘솔에서 VPC 커넥터 필요 정책 페이지로 이동합니다.

    조직 정책으로 이동

  2. 정책 관리를 클릭합니다.

  3. 정책 수정 페이지에서 맞춤설정을 선택합니다.

  4. 시행에서 사용을 선택합니다.

  5. 정책 설정을 클릭합니다.

gcloud

gcloud resource-manager org-policies enable-enforce 명령어를 사용합니다.

gcloud resource-manager org-policies enable-enforce \
  cloudfunctions.requireVPCConnector \
  --organization ORGANIZATION_ID

여기서 ORGANIZATION_ID는 조직 ID입니다.

이 조직 정책을 적용한 후에는 모든 함수가 서버리스 VPC 액세스 커넥터를 사용해야 합니다. 커넥터를 지정하지 않은 함수 배포는 실패합니다.

허용되는 VPC 커넥터 이그레스 설정 제한

cloudfunctions.allowedVpcConnectorEgressSettings 조직 정책은 개발자가 Cloud Functions에 사용할 수 있는 이그레스 설정을 제어합니다. ALL_TRAFFIC 값만 허용하도록 이 조직 정책을 설정합니다.

콘솔

  1. Google Cloud 콘솔에서 허용되는 VPC 커넥터 이그레스 설정 정책 페이지로 이동합니다.

    조직 정책으로 이동

  2. 정책 관리를 클릭합니다.

  3. 정책 수정 페이지에서 맞춤설정을 선택합니다.

  4. 정책 시행에서 교체를 선택합니다.

  5. 정책 값에서 커스텀을 선택합니다.

  6. 정책 유형에서 허용을 선택합니다.

  7. 커스텀 값 아래에 ALL_TRAFFIC을 입력합니다.

  8. 정책 설정을 클릭합니다.

gcloud

gcloud resource-manager org-policies allow 명령어를 사용합니다.

gcloud resource-manager org-policies allow \
  cloudfunctions.allowedVpcConnectorEgressSettings ALL_TRAFFIC \
  --organization ORGANIZATION_ID

여기서 ORGANIZATION_ID는 조직 ID입니다.

이 조직 정책을 적용한 후에는 모든 함수가 이그레스 설정에 ALL_TRAFFIC 값을 사용해야 합니다. 즉, 함수는 VPC 네트워크를 통해 모든 이그레스 트래픽을 라우팅해야 합니다. 다른 값을 지정하는 함수 배포는 실패합니다.

cloudfunctions.requireVPCConnector 조직 정책과 함께 사용하면 모든 이그레스 트래픽이 구성된 방화벽 및 라우팅 규칙이 적용되는 VPC 네트워크를 통과합니다.

프로젝트 수준 설정

서비스 경계 내의 개별 프로젝트의 경우 VPC 서비스 제어를 사용하려면 추가 구성을 수행해야 합니다.

VPC 네트워크 구성

Google API 및 서비스에 액세스할 때 데이터 무단 반출 위험을 완화하려면 요청을 제한된 가상 IP(VIP) 범위199.36.153.4/30(restricted.googleapis.com)으로 전송해야 합니다.

프로젝트의 VPC 네트워크마다 제한된 VIP 범위에 대한 트래픽을 제외한 아웃바운드 트래픽을 차단하려면 다음 안내를 따르세요.

  1. 데이터가 VPC 네트워크에서 나가는 것을 방지하도록 방화벽 규칙을 구성합니다.

    • 모든 아웃바운드 트래픽을 차단하는 이그레스 거부 규칙을 만듭니다.

    • TCP 포트 443에 199.36.153.4/30으로 트래픽을 허용하는 이그레스 허용 규칙을 만듭니다. 이 규칙이 방금 만든 이그레스 거부 규칙보다 우선순위가 높은지 확인합니다. 이렇게 하면 제한된 VIP 범위로만 송신할 수 있습니다.

  2. *.googleapis.comrestricted.googleapis.com으로 변환하도록 DNS를 구성합니다.

  3. *.cloudfunctions.net199.36.153.4/30 IP 범위로 매핑하는 A 레코드를 사용하여 DNS를 구성합니다. Cloud DNS를 사용하여 다음 작업을 수행할 수 있습니다.

    gcloud dns managed-zones create ZONE_NAME \
    --visibility=private \
    --networks=https://www.googleapis.com/compute/v1/projects/PROJECT_NAME/global/networks/VPC_NAME \
    --description=none \
    --dns-name=cloudfunctions.net
    
    gcloud dns record-sets transaction start --zone=ZONE_NAME
    
    gcloud dns record-sets transaction add --name=*.cloudfunctions.net. \
    --type=A 199.36.153.4 199.36.153.5 199.36.153.6 199.36.153.7 \
    --zone=ZONE_NAME \
    --ttl=300
    
    gcloud dns record-sets transaction execute --zone=ZONE_NAME
    
  4. VPC 커넥터의 서브넷에 비공개 Google 액세스를 사용 설정합니다.

이 시점에서 VPC 네트워크 내에서 발생하는 요청은 다음과 같습니다.

  • VPC 네트워크를 나갈 수 없으므로 서비스 경계 외부의 이그레스를 차단합니다.
  • VPC 서비스 제어를 검사하는 Google API 및 서비스에만 도달하므로 Google API를 통한 유출을 방지합니다.

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

Cloud Functions는 Cloud Build를 사용하여 소스 코드를 실행 가능한 컨테이너에 빌드합니다. VPC 서비스 제어와 함께 Cloud Functions를 사용하려면 서비스 경계에 액세스할 수 있도록 Cloud Build 서비스 계정(기본 또는 커스텀)을 구성해야 합니다.

서비스 계정 이름 찾기

기본 Cloud Build 서비스 계정을 사용하는 경우 이름은 다음과 같이 찾을 수 있습니다.

  1. Google Cloud 콘솔의 IAM 페이지를 사용하여 Cloud Build 서비스 계정을 찾습니다.

    Open IAM

  2. 프로젝트 드롭다운에 올바른 프로젝트가 표시되었는지 확인합니다.

  3. cloudbuild.gserviceaccount.com을 검색합니다. PROJECT_NUMBER@cloudbuild.gserviceaccount.com 형식의 이메일 주소는 서비스 계정 이름입니다.

커스텀 Cloud Build 서비스 계정이 있으면 대신 해당 이름을 사용합니다.

서비스 계정에 서비스 경계에 대한 액세스 권한 부여

서비스 계정 이름이 있으면 사용자 또는 서비스 계정별 액세스 제한의 가이드에 따라 서비스 계정의 액세스 수준을 만듭니다. 그런 후 기존 경계에 액세스 수준 추가에 따라 서비스 경계에 액세스 수준을 추가합니다.

VPC 서비스 제어를 준수하는 함수 배포

Cloud Functions에 VPC 서비스 제어를 구성한 후에는 서비스 경계 내에 배포된 모든 함수가 지정된 조직 정책을 준수하는지 확인해야 합니다. 다시 말하면 다음과 같습니다.

  • 모든 함수는 서버리스 VPC 액세스 커넥터를 사용해야 합니다. 자세한 내용은 VPC 네트워크에 연결을 참조하세요.
  • 모든 함수는 내부 소스의 트래픽만 허용해야 합니다. 자세한 내용은 인그레스 설정을 참조하세요.
  • 모든 함수는 VPC 네트워크를 통해 모든 발신 트래픽을 라우팅해야 합니다. 자세한 내용은 이그레스 설정을 참조하세요.

이러한 기준을 충족하지 않는 함수 배포는 실패합니다.

기존 함수를 감사하여 VPC 서비스 제어 규정 준수 확인

VPC 서비스 제어를 설정한 후 서비스 경계 내부의 프로젝트에서 새 함수를 만들면 해당 함수에 대한 규정 준수 여부가 자동으로 검사됩니다. 하지만 기존 워크로드의 중단을 방지하기 위해 기존 함수는 계속 작동하며 조직 정책을 준수하지 않을 수 있습니다.

필요한 경우 기존 함수를 감사하고 함수를 업데이트하거나 다시 배포하는 것이 좋습니다. 이 과정을 원활하게 진행하기 위해 Cloud Functions API를 사용하여 함수를 나열하고 적절한 네트워크 설정을 지정하지 않는 함수를 강조표시하는 스크립트를 만들 수 있습니다.

경계 외부 함수에 VPC 서비스 제어 사용

앞의 섹션은 VPC 서비스 제어 서비스 경계 내에서 Cloud Functions를 배포하는 시나리오에 적용됩니다.

서비스 경계 외부의 함수를 배포해야 하지만 함수에 경계 내부 리소스에 대한 액세스가 필요하면 다음 구성을 사용합니다.

  1. Cloud Build 서비스 계정에 VPC 서비스 제어 경계에 대한 액세스 권한을 부여합니다.
  2. 함수의 런타임 서비스 계정에 경계에 대한 액세스 권한을 부여합니다. 이렇게 하려면 액세스 수준 만들기서비스 계정에 액세스 수준 추가를 수행하거나 경계에서 인그레스 정책 만들기를 수행하면 됩니다.
  3. VPC 네트워크에 기능을 연결합니다.
  4. VPC 네트워크를 통해 기능의 모든 송신 트래픽을 라우팅합니다. 자세한 내용은 이그레스 설정을 참조하세요.

이 구성을 완료하면 기능이 경계로 보호되는 리소스에 연결할 수 있습니다.