VPC 서비스 제어(VPC SC) 사용

VPC 서비스 제어는 데이터 무단 반출을 방지하기 위해 보안 경계를 설정할 수 있는 Google Cloud 기능입니다. 기본 run.app URL과 커스텀 도메인 모두 VPC 서비스 제어가 적용됩니다. 이 가이드에서는 Cloud Run과 함께 VPC 서비스 제어를 사용하여 서비스에 보안을 추가하는 방법을 안내합니다.

제한사항 및 권장사항

  • Artifact Registry 또는 Container Registry의 경우 다음과 같습니다.

    • 컨테이너를 저장하는 레지스트리는 배포하려는 프로젝트와 동일한 VPC 서비스 제어 서비스 경계에 있어야 합니다.
    • 빌드 중인 코드는 컨테이너가 푸시되는 레지스트리와 동일한 경계에 있어야 합니다.
  • VPC 서비스 제어 경계 내에 있는 프로젝트에서는 지속적 배포 기능을 사용할 수 없습니다.

  • Cloud Run 서비스가 호출되면 VPC 서비스 제어 정책 시행은 클라이언트의 IAM 인증 정보를 사용하지 않습니다. 이러한 요청에는 다음과 같은 제한사항이 있습니다.

    • IAM 주 구성원을 사용하는 VPC 서비스 제어 인그레스 정책 규칙은 지원되지 않습니다.
    • IAM 주 구성원을 사용하는 VPC 서비스 제어 경계의 액세스 수준은 지원되지 않습니다.

VPC 서비스 제어를 지원하도록 조직 설정

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

VPC 서비스 제어 경계 설정

다음 단계는 VPC 서비스 제어 경계를 설정하는 방법을 보여줍니다.

  1. VPC 서비스 제어를 관리하는 데 필요한 역할을 받았는지 확인합니다.

  2. Google Cloud 콘솔에서 VPC 서비스 제어 페이지로 이동합니다.

    VPC 서비스 제어 페이지로 이동

  3. 메시지가 표시되면 조직을 선택합니다.

  4. 액세스 정책 관리를 클릭합니다. 액세스 정책을 선택하거나 새로 만듭니다. 액세스 정책에는 경계에 추가하려는 모든 프로젝트가 포함되어야 합니다.

  5. 새 경계선을 클릭합니다. 경계의 이름을 입력합니다.

  6. 경계 내에서 보호하려는 프로젝트를 선택합니다.

    1. 프로젝트를 클릭합니다.

    2. 프로젝트 추가 창에서 추가할 프로젝트를 선택합니다.

      공유 VPC를 사용하는 경우 호스트 프로젝트 및 서비스 프로젝트를 추가해야 합니다.

    3. 프로젝트 추가 버튼을 클릭합니다.

  7. 경계 내에서 보호할 서비스로 Cloud Run을 선택합니다.

    1. 제한된 서비스를 클릭합니다.

    2. 서비스 추가를 클릭합니다.

    3. "Cloud Run"을 검색합니다. 그런 후 Cloud Run Admin API를 선택합니다.

    4. Cloud Run Admin API 추가를 클릭합니다.

  8. 개발자의 액세스를 사용 설정합니다.

    Cloud Run용 VPC 서비스 제어를 사용 설정하면 회사 노트북과 같은 경계 외부에 있는 머신에서 서비스를 보고 배포하는 것을 포함한 경계 외부의 모든 액세스가 차단됩니다. 개발자 및 애플리케이션 운영자가 경계 내에서 리소스를 보고 배포하려면 경계 인그레스 정책을 구성해야 합니다.

    1. 인그레스 정책을 클릭합니다.

    2. 소스, ID, 프로젝트, 서비스를 지정합니다.

    3. '규칙 추가'를 클릭합니다.

    조직에서 Access Context Manager를 사용하는 경우 액세스 수준을 설정하여 개발자 액세스를 사용 설정할 수도 있습니다.

  9. 경계 만들기를 클릭합니다.

이 단계를 완료하면 Cloud Run Admin API에 대한 모든 호출을 검사하여 이들이 동일한 경계 내에서 발생했는지 확인할 수 있습니다.

조직 정책 설정

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

VPC 서비스 제어를 준수하고 데이터 무단 유출을 방지하려면 서비스 경계에서 Cloud Run에 허용되는 인그레스이그레스 설정을 제어하도록 다음 조직 정책을 설정하세요.

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

run.allowedIngress 조직 정책은 개발자가 Cloud Run에 사용할 수 있는 인그레스 설정을 제어합니다. 내부 요청만 허용하기를 원하면 개발자가 internal 값을 사용하고, Cloud Load Balancing에서 관리되는 액세스 제어를 사용하여 외부 애플리케이션 부하 분산기를 통한 요청을 허용하려는 경우에는 internal-and-cloud-load-balancing 값을 사용하도록 조직 정책을 설정하세요.

이러한 설정에 대한 자세한 내용은 Cloud Run에 대한 인그레스 제한을 참조하세요.

콘솔

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

    조직 정책으로 이동

  2. 수정을 클릭합니다.

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

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

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

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

  7. 커스텀 값 아래에 internal을 입력합니다. Cloud Load Balancing 트래픽도 허용하려면 새 정책 값을 클릭하고 internal-and-cloud-load-balancing을 입력합니다.

  8. 저장을 클릭합니다.

gcloud

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

gcloud resource-manager org-policies allow \
  run.allowedIngress internal \
  --organization ORGANIZATION_ID

여기서 ORGANIZATION_ID는 조직 ID입니다. Cloud Load Balancing 트래픽도 허용하려면 run.allowedIngress internalrun.allowedIngress internal-and-cloud-load-balancing으로 바꿉니다.

이 조직 정책을 적용한 후에는 모든 서비스가 인그레스 설정에 허용되는 값을 사용해야 합니다. 즉, Cloud Run 서비스는 서비스 경계 내의 VPC 네트워크에서 발생하는 트래픽만 허용할 수 있습니다. 인그레스를 다른 값으로 설정하려고 시도하면 조직 정책에 의해 차단됩니다.

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

run.allowedVPCEgress 조직 정책은 개발자가 Cloud Run에 사용할 수 있는 이그레스 설정을 제어합니다. all-traffic 값만 허용하도록 이 조직 정책을 설정하세요.

콘솔

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

    조직 정책으로 이동

  2. 수정을 클릭합니다.

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

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

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

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

  7. 커스텀 값 아래에 all-traffic을 입력합니다.

  8. 저장을 클릭합니다.

gcloud

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

gcloud resource-manager org-policies allow \
  run.allowedVPCEgress all-traffic \
  --organization ORGANIZATION_ID

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

조직 정책을 설정한 이후의 동작

조직 정책을 적용한 후에는 모든 새 버전에서 직접 VPC 이그레스 또는 서버리스 VPC 액세스 커넥터를 사용해야 하며 이그레스 설정에 all-traffic 값을 사용해야 합니다. 이렇게 설정을 조합하면 이러한 버전의 모든 이그레스 트래픽이 VPC 네트워크를 통해 라우팅되며, 이 트래픽은 VPC 네트워크의 방화벽 규칙 및 기타 설정에 적용됩니다. 다른 값을 지정하는 새 버전 배포는 조직 정책에 의해 차단됩니다.

조직 정책 및 트래픽 마이그레이션

조직 정책이 설정되기 전에 존재한 서비스의 경우, 트래픽을 제공하는 모든 버전이 규정을 준수할 때까지 규정 미준수 버전으로 트래픽을 계속 마이그레이션할 수 있습니다.

이 동작을 사용하면 정책을 준수하는 새 버전을 테스트하고 점진적으로 출시할 수 있습니다. 트래픽을 제공하는 모든 버전이 정책을 준수하면 정책을 준수하지 않는 버전으로 트래픽을 이동하려는 모든 시도는 조직 정책에 의해 차단됩니다.

VPC 서비스 제어를 지원하도록 프로젝트 설정

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

VPC 네트워크 구성

이 섹션에서는 일반 googleapis.com 도메인으로 전송된 요청이 자동으로 제한된 가상 IP(VIP) 범위(Cloud Run 서비스를 제공하는 199.36.153.4/30(restricted.googleapis.com))로 라우팅되도록 VPC 네트워크를 구성하는 방법을 보여줍니다. 여기에서는 코드를 변경할 필요가 없습니다.

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

  1. VPC 네트워크 리소스를 호스팅하는 서브넷에서 비공개 Google 액세스를 사용 설정합니다.

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

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

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

  3. Cloud DNS 응답 정책을 만듭니다.

    gcloud dns response-policies create RESPONSE_POLICY \
    --networks=NETWORK \
    --description=DESCRIPTION
    

    다음을 바꿉니다.

    • RESPONSE_POLICY: 응답 정책의 이름입니다.
    • NETWORK: 이 정책과 연결할 네트워크의 이름입니다. 여러 네트워크를 지정하려면 각 네트워크의 이름을 쉼표로 구분합니다(예: network1,network2).
    • DESCRIPTION: 응답 정책의 설명입니다(예: Cloud Run VPC Service Controls response policy).
  4. 응답 정책에 규칙을 추가하여 *.googleapis.comrestricted.googleapis.com으로 확인합니다. restricted.googleapis.com의 IP 주소 범위는 199.36.153.4/30입니다.

    gcloud dns response-policies rules create RESPONSE_POLICY_RULE \
    --response-policy=RESPONSE_POLICY \
    --dns-name="*.googleapis.com." \
    --local-data=name="restricted.googleapis.com.",type="A",ttl=300,rrdatas="199.36.153.4|199.36.153.5|199.36.153.6|199.36.153.7"
    

    다음을 바꿉니다.

    • RESPONSE_POLICY_RULE: 응답 정책 규칙의 이름입니다.
    • RESPONSE_POLICY: 이전 단계에서 만든 응답 정책의 따옴표로 묶인 이름입니다.
  5. 응답 정책에 규칙을 추가하여 *.run.apprestricted.googleapis.com으로 확인합니다. restricted.googleapis.com의 IP 주소 범위는 199.36.153.4/30입니다.

    gcloud dns response-policies rules create RESPONSE_POLICY_RULE \
    --response-policy=RESPONSE_POLICY \
    --dns-name="*.run.app." \
    --local-data=name="restricted.googleapis.com.",type="A",ttl=300,rrdatas="199.36.153.4|199.36.153.5|199.36.153.6|199.36.153.7"
    

    다음을 바꿉니다.

    • RESPONSE_POLICY_RULE: 응답 정책 규칙의 이름입니다.
    • RESPONSE_POLICY: 이전 단계에서 지정한 응답 정책의 따옴표로 묶인 이름입니다.

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

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

VPC 서비스 제어를 준수하는 Cloud Run 서비스 및 작업 배포

Cloud Run에 대해 VPC 서비스 제어를 구성한 후에는 서비스 경계 내에 배포한 모든 Cloud Run 서비스 및 작업에서 VPC 서비스 제어를 사용 설정해야 합니다. 그러려면 다음 조치를 취해야 합니다.

  • Cloud Run 서비스 및 작업은 직접 VPC 이그레스 또는 서버리스 VPC 액세스 커넥터를 사용해야 합니다. 자세한 내용은 VPC 네트워크에 연결을 참조하세요.
  • Cloud Run 서비스 및 작업은 VPC 네트워크를 통해 모든 발신 트래픽을 라우팅해야 합니다. 자세한 내용은 이그레스 설정을 참조하세요.
  • Cloud Run 서비스는 내부 소스의 트래픽만 허용해야 합니다. 자세한 내용은 인그레스 설정을 참조하세요. 인그레스를 '모두'로 설정하면 VPC 서비스 제어 시행이 사용 중지됩니다.

기존 서비스의 VPC 서비스 제어 규정 준수 여부 감사

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

서비스를 정기적으로 감사하여 인그레스 및 이그레스 설정이 요구사항을 충족하는지 확인하고 필요에 따라 서비스를 업데이트하거나 재배포하는 것이 좋습니다. 예를 들어 Cloud Run Admin API를 사용하여 서비스를 나열하고 적절한 네트워크 설정이 지정되지 않은 서비스를 강조표시하는 스크립트를 만들 수 있습니다.