Virtual Private Cloud 네트워크의 VPC 서비스 제어 경계 설정

VPC 서비스 제어를 사용하여 서비스 경계를 설정하는 방법을 알아보세요. 이 튜토리얼에서는 VPC 서비스 제어 경계를 효과적으로 사용하는 데 필요한 방화벽, Private Service Connect, DNS 구성과 같은 네트워킹 설정을 사용합니다. 그런 다음 이 튜토리얼에서는 서비스가 허용 또는 거부되는 방법과 특정 서비스의 허용 목록에 대해 세부적인 예외를 만드는 방법을 보여줍니다.

목표

  • 추가 네트워킹 제어로 VPC 서비스 제어 경계를 구성하여 유출 경로를 완화합니다.
  • 경계 내부 또는 경계 외부에서 발생되는 요청에서 경계 내부 서비스에 대한 액세스를 허용하거나 거부합니다.
  • 경계 내부에서 발생되는 요청에 대한 경계 외부의 서비스에 대한 액세스를 허용하거나 거부합니다.
  • 리소스 서비스 사용량 제한 조직 정책과 VPC 서비스 제어를 함께 사용합니다.

비용

이 튜토리얼에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.

이 가이드를 마치면 만든 리소스를 삭제하여 비용이 계속 청구되지 않도록 할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

  1. 이 튜토리얼을 진행하려면 해당 조직의 프로젝트가 필요합니다. Google Cloud 조직이 아직 없는 경우 조직 만들기 및 관리를 참조하세요.

  2. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. API Compute Engine, Access Context Manager, Cloud DNS 사용 설정

    API 사용 설정

  5. Google Cloud 콘솔에서 Cloud Shell을 활성화합니다.

    Cloud Shell 활성화

  6. 조직에 다음 역할이 있는지 확인합니다. Access Context Manager Admin, Organization Policy Administrator

    역할 확인

    1. Google Cloud 콘솔에서 IAM 페이지로 이동합니다.

      IAM으로 이동
    2. 조직을 선택합니다.
    3. 주 구성원 열에서 이메일 주소가 있는 행을 찾습니다.

      이메일 주소가 열에 없으면 역할이 없는 것입니다.

    4. 이메일 주소가 있는 행에 대해 역할 열에서 역할 목록에 필요한 역할이 있는지 확인합니다.

    역할 부여

    1. Google Cloud 콘솔에서 IAM 페이지로 이동합니다.

      IAM으로 이동
    2. 조직을 선택합니다.
    3. 액세스 권한 부여를 클릭합니다.
    4. 새 주 구성원 필드에 이메일 주소를 입력합니다.
    5. 역할 선택 목록에서 역할을 선택합니다.
    6. 역할을 추가로 부여하려면 다른 역할 추가를 클릭하고 각 역할을 추가합니다.
    7. 저장을 클릭합니다.
  7. 프로젝트에 다음 역할이 있는지 확인합니다. Compute Admin, DNS Administrator, IAP-Secured Tunnel User, Service Account User, Service Directory Editor

    역할 확인

    1. Google Cloud 콘솔에서 IAM 페이지로 이동합니다.

      IAM으로 이동
    2. 프로젝트를 선택합니다.
    3. 주 구성원 열에서 이메일 주소가 있는 행을 찾습니다.

      이메일 주소가 열에 없으면 역할이 없는 것입니다.

    4. 이메일 주소가 있는 행에 대해 역할 열에서 역할 목록에 필요한 역할이 있는지 확인합니다.

    역할 부여

    1. Google Cloud 콘솔에서 IAM 페이지로 이동합니다.

      IAM으로 이동
    2. 프로젝트를 선택합니다.
    3. 액세스 권한 부여를 클릭합니다.
    4. 새 주 구성원 필드에 이메일 주소를 입력합니다.
    5. 역할 선택 목록에서 역할을 선택합니다.
    6. 역할을 추가로 부여하려면 다른 역할 추가를 클릭하고 각 역할을 추가합니다.
    7. 저장을 클릭합니다.

VPC 서비스 제어 경계 설정

VPC 네트워크에 VPC 서비스 제어 경계를 구현하려면 외부 서비스에 대한 트래픽을 거부하는 네트워킹 제어를 구현해야 합니다. 다음 섹션에서는 경계 내부의 VPC 네트워크에서 구현해야 하는 네트워킹 구성과 경계 구성의 예시를 자세히 설명합니다.

VPC 네트워크 준비

이 섹션에서는 네트워크 이그레스 경로 범위를 인터넷으로 마이그레이션하기 위해 VPC 네트워크에 대해 Google API 및 서비스에 대한 비공개 연결을 설정합니다.

  1. Cloud Shell에서 변수를 설정합니다.

    gcloud config set project PROJECT_ID
    gcloud config set compute/region REGION
    gcloud config set compute/zone ZONE
    

    다음을 바꿉니다.

    • PROJECT_ID: 리소스를 만들려는 프로젝트의 프로젝트 ID입니다.
    • REGION: 해당 위치와 가까운 리전입니다(예: us-central1).
    • ZONE: 해당 위치와 가까운 영역입니다(예: us-central1-a).
  2. 비공개 Google 액세스가 사용 설정된 VPC 네트워크와 서브넷을 만듭니다.

    gcloud compute networks create restricted-vpc --subnet-mode=custom
    gcloud compute networks subnets create restricted-subnet \
    --range=10.0.0.0/24 \
    --network=restricted-vpc \
    --enable-private-ip-google-access
    
  3. Private Service Connect 엔드포인트 및 vpc-sc 번들을 사용하도록 구성된 전달 규칙을 만듭니다.

    gcloud compute addresses create restricted-psc-endpoint \
    --global \
    --purpose=PRIVATE_SERVICE_CONNECT \
    --addresses=10.0.1.1 \
    --network=restricted-vpc
    
    gcloud compute forwarding-rules create restrictedpsc \
    --global \
    --network=restricted-vpc \
    --address=restricted-psc-endpoint \
    --target-google-apis-bundle=vpc-sc
    
  4. Google Cloud API에 대한 쿼리를 Private Service Connect 엔드포인트로 리디렉션하도록 Cloud DNS 서버 정책을 구성합니다.

    gcloud dns managed-zones create restricted-dns-zone \
      --description="Private DNS Zone to map Google API queries to the Private Service Connect endpoint for Google APIs" \
      --dns-name="googleapis.com." \
      --networks=restricted-vpc \
      --visibility=private
    
    gcloud dns record-sets create googleapis.com  \
    --rrdatas=10.0.1.1 \
    --type=A \
    --ttl=300 \
    --zone=restricted-dns-zone
    
    gcloud dns record-sets create *.googleapis.com  \
    --rrdatas="googleapis.com." \
    --type=CNAME \
    --ttl=300 \
    --zone=restricted-dns-zone
    
  5. 모든 이그레스 트래픽을 거부하도록 낮은 우선순위로 방화벽 규칙을 구성합니다.

    gcloud compute firewall-rules create deny-all-egress \
    --priority=65534 \
    --direction=egress \
    --network=restricted-vpc \
    --action=DENY \
    --rules=all \
    --destination-ranges=0.0.0.0/0
    
  6. 트래픽이 Private Service Connect 엔드포인트에서 사용되는 IP 주소에 도달할 수 있도록 우선순위가 더 높은 방화벽 규칙을 구성합니다.

    gcloud compute firewall-rules create allow-psc-for-google-apis \
    --priority=1000 \
    --direction=egress \
    --network=restricted-vpc \
    --action=ALLOW \
    --rules=tcp:443 \
    --destination-ranges=10.0.1.1
    

    이러한 방화벽 규칙은 Private Service Connect 엔드포인트로의 이그레스를 선택적으로 허용하기 전에 이그레스를 광범위하게 거부합니다. 이 구성은 기본적으로 비공개 Google 액세스 및 묵시적인 방화벽 규칙을 사용하여 일반적으로 연결할 수 있는 기본 도메인에 대한 이그레스 트래픽을 거부합니다.

VPC 서비스 제어 경계 만들기

이 섹션에서는 VPC 서비스 제어 경계를 만듭니다.

  1. Cloud Shell에서 VPC 서비스 제어 경계를 만들기 위한 기본 요건으로 액세스 정책을 만듭니다.

    gcloud access-context-manager policies create \
    --organization=ORGANIZATION_ID --title "Access policy at organization node"
    

    출력은 다음과 비슷합니다.

    "Create request issued
    Waiting for operation [operations/accessPolicies/123456789/create/123456789] to complete...done."
    

    조직 노드에는 액세스 정책 컨테이너가 하나만 있을 수 있습니다. 조직에서 이미 정책을 만든 경우 출력이 다음과 비슷합니다.

    "ALREADY_EXISTS: Policy already exists with parent ContainerKey{containerId=organizations/123456789012, numericId=123456789012}"
    

    이 메시지가 표시되면 다음 단계로 이동합니다.

  2. Cloud Storage 및 Compute Engine 서비스를 제한하는 VPC 서비스 제어 경계를 만듭니다.

    export POLICY_ID=$(gcloud access-context-manager policies list \
    --organization=ORGANIZATION_ID \
    --format="value(name)")
    
    gcloud access-context-manager perimeters create demo_perimeter \
    --title="demo_perimeter" \
    --resources=projects/$(gcloud projects describe PROJECT_ID --format="value(projectNumber)") \
    --restricted-services="storage.googleapis.com,compute.googleapis.com" \
    --enable-vpc-accessible-services \
    --policy=$POLICY_ID \
    --vpc-allowed-services="RESTRICTED-SERVICES"
    

경계 외부의 트래픽에서 허용되는 서비스 확인

다음 섹션에서는 VPC 서비스 제어 경계가 경계 외부에서 수행되는 요청에 대한 액세스를 허용하거나 거부하는 방법과 액세스 수준 및 인그레스 정책을 구성하여 서비스에 대한 인그레스를 선택적으로 허용하는 방법을 보여줍니다.

경계 외부의 트래픽을 시뮬레이션하려면 Cloud Shell에서 명령어를 실행합니다. Cloud Shell은 자체 프로젝트 및 경계 외부의 리소스입니다. 요청에 성공하기에 충분한 Identity and Access Management 권한이 있더라도 경계에서 요청을 허용하거나 거부합니다.

이 튜토리얼에서는 Compute Engine API, Cloud Storage API, Cloud Resource Manager API를 사용하지만 다른 서비스에도 같은 개념이 적용됩니다.

경계에서 제한된 서비스에 대한 외부 트래픽을 거부하는지 확인

이 섹션에서는 경계에서 제한된 서비스에 대한 외부 트래픽을 거부하는지 확인합니다.

VPC 서비스 제어 경계가 제한된 서비스에 대한 액세스를 거부하는 방법을 보여주는 아키텍처 다이어그램

이전 다이어그램은 승인된 클라이언트가 제한된 것으로 구성한 경계 내부의 서비스에 대한 액세스를 거부하는 방법을 보여줍니다. 반면, 이 클라이언트는 제한된 것으로 구성되지 않은 서비스에 액세스할 수 있도록 허용됩니다.

다음 단계에서는 VPC 네트워크 내에 VM을 만들려고 시도하지만 VPC 서비스 제어 경계 구성으로 인해 실패하는 Cloud Shell을 사용하여 이 개념을 확인합니다.

  1. Cloud Shell에서 다음 명령어를 실행하여 VPC 네트워크 내에 VM을 만듭니다.

    gcloud compute instances create demo-vm \
        --machine-type=e2-micro \
        --subnet=restricted-subnet \
        --scopes=https://www.googleapis.com/auth/cloud-platform \
        --no-address
    

    출력은 다음과 비슷합니다.

    "ERROR: (gcloud.compute.instances.create) Could not fetch resource:
    - Request is prohibited by organization's policy."
    

    Cloud Shell이 경계 외부에 있고 Compute Engine이 --restricted-services 플래그로 구성되어 있기 때문에 요청이 실패합니다.

  2. Cloud Shell에서 다음 명령어를 실행하여 --restricted-services 플래그에 구성되지 않은 Resource Manager 서비스에 액세스합니다.

    gcloud projects describe PROJECT_ID
    

    응답에 성공하면 프로젝트 세부정보가 반환됩니다. 이 응답은 경계에서 Cloud Resource Manager API에 대한 외부 트래픽을 허용함을 보여줍니다.

    경계에서 --restricted-services에 구성된 서비스에 대한 외부 트래픽을 거부하고 --restricted-services에 명시적으로 구성되지 않은 서비스에 대한 외부 트래픽을 허용하는 것을 보여주었습니다.

다음 섹션에서는 경계 내부의 제한된 서비스에 도달하기 위한 예외 패턴을 소개합니다.

액세스 수준에서 경계에 대한 예외 허용 확인

이 섹션에서는 액세스 수준에서 경계에 대한 예외를 허용하는지 확인합니다. 액세스 수준은 외부 트래픽이 경계 내부의 모든 제한된 서비스에 액세스하도록 예외를 만들고 서비스별 또는 기타 속성에 대해 세분화된 예외가 필요하지 않는 경우에 유용합니다.

액세스 수준에서 VPC 서비스 제어 경계 내의 모든 서비스에 예외를 부여하는 방법을 보여주는 아키텍처 다이어그램

위의 다이어그램은 액세스 수준에서 승인된 클라이언트가 경계 내에 있는 모든 제한된 서비스에 액세스하는 방법을 보여줍니다.

다음 단계에서는 액세스 수준을 만든 다음 Compute Engine 서비스에 성공적으로 요청을 수행하여 이 개념을 확인합니다. 이 요청은 Compute Engine을 제한됨으로 구성한 경우에도 허용됩니다.

  1. Cloud Shell에서 액세스 수준 구성을 설명하는 YAML 파일을 만들고 이를 경계에 적용합니다. 이 샘플은 현재 튜토리얼을 실행하는 데 사용하는 사용자 ID의 액세스 수준을 만듭니다.

    export USERNAME=$(gcloud config list account --format "value(core.account)")
    
    cat <<EOF > user_spec.yaml
    - members:
      - user:$USERNAME
    EOF
    
    gcloud access-context-manager levels create single_user_level \
    --title="single-user access level" \
    --basic-level-spec=user_spec.yaml \
    --policy=$POLICY_ID
    
    gcloud access-context-manager perimeters update demo_perimeter \
    --add-access-levels=single_user_level \
    --policy=$POLICY_ID
    
  2. Cloud Shell에서 다음 명령어를 다시 실행하여 VM 만들기를 시도합니다.

    gcloud compute instances create demo-vm \
    --machine-type=e2-micro \
    --subnet=restricted-subnet \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --no-address
    

    이번에는 요청이 작동합니다. 경계는 외부 트래픽이 제한된 서비스를 사용하지 못하게 하지만, 사용자가 구성한 액세스 수준에서는 예외가 허용됩니다.

인그레스 정책이 경계에 세분화된 예외를 허용하는지 확인

이 섹션에서는 인그레스 정책이 경계에 대한 세분화된 예외를 허용하는지 확인합니다. 대략적인 액세스 수준과 비교하여 세분화된 인그레스 정책은 트래픽 소스에 대한 추가 속성을 구성하고 개별 서비스 또는 메서드에 대한 액세스를 허용할 수 있습니다.

인그레스 정책에서 경계 내부의 지정된 서비스에 도달하는 세분화된 예외를 허용하는 방법을 보여주는 아키텍처 다이어그램

위 다이어그램은 인그레스 정책에서 승인된 클라이언트가 다른 제한된 서비스에 대한 액세스를 허용하지 않고 경계 내부의 지정된 서비스에만 액세스하도록 허용하는 방법을 보여줍니다.

다음 단계에서는 액세스 수준을 승인된 클라이언트가 Compute Engine 서비스에만 액세할 수 있도록 허용하고 다른 제한된 서비스에 대한 액세스는 허용하지 않는 인그레스 정책으로 대체하여 이 개념을 확인합니다.

  1. Cloud Shell 탭에서 다음 명령어를 실행하여 액세스 수준을 삭제합니다.

    gcloud access-context-manager perimeters update demo_perimeter \
    --policy=$POLICY_ID \
    --clear-access-levels
    
  2. Cloud Shell 탭에서 사용자 ID를 Compute Engine 서비스에만 인그레스할 수 있는 인그레스 정책을 만들고 경계에 정책을 적용합니다.

    cat <<EOF > ingress_spec.yaml
    - ingressFrom:
        identities:
        - user:$USERNAME
        sources:
        - accessLevel: '*'
      ingressTo:
        operations:
        - methodSelectors:
          - method: '*'
          serviceName: compute.googleapis.com
        resources:
        - '*'
    EOF
    
    gcloud access-context-manager perimeters update demo_perimeter \
    --set-ingress-policies=ingress_spec.yaml \
    --policy=$POLICY_ID
    
  3. Cloud Shell 탭에서 다음 명령어를 실행하여 경계 내에 Cloud Storage 버킷을 만듭니다.

    gcloud storage buckets create gs://PROJECT_ID-01
    

    출력은 다음과 비슷합니다.

    "ERROR: (gcloud.storage.buckets.create) HTTPError 403: Request is prohibited by organization's policy."
    

    Cloud Shell은 경계 외부의 클라이언트이므로 VPC 서비스 제어 경계는 Cloud Shell이 경계 내부의 제한된 서비스와 통신하지 못하도록 차단합니다.

  4. Cloud Shell 탭에서 다음 명령어를 실행하여 경계 내에서 Compute Engine 서비스에 요청을 수행합니다.

    gcloud compute instances describe demo-vm --zone=ZONE
    

    성공적인 응답은 demo-vm의 세부정보를 반환합니다. 이 응답은 경계가 Compute Engine 서비스에 대한 인그레스 정책 조건을 충족하는 외부 트래픽을 허용함을 보여줍니다.

경계 내부의 트래픽에서 허용되는 서비스 확인

다음 섹션에서는 VPC 서비스 제어 경계가 경계 내부에서 서비스에 대한 요청을 허용하거나 거부하는 방법과 이그레스 정책에 따라 외부 서비스에 대한 이그레스를 선택적으로 허용하는 방법을 설명합니다.

경계 내부와 외부 트래픽의 차이를 보여주기 위해 다음 섹션에서는 경계 외부의 Cloud Shell과 경계 내에서 만든 Compute Engine 인스턴스를 모두 사용합니다. 경계 내부 Compute Engine 인스턴스의 SSH 세션에서 실행하는 명령어는 연결된 서비스 계정의 ID를 사용하는 반면 경계 외부의 Cloud Shell에서 실행하는 명령어는 자체 ID를 사용합니다. 이 튜토리얼의 권장 설정을 따르면 요청이 성공하기에 충분한 IAM 권한이 있더라도 경계가 요청을 허용 또는 거부합니다.

이 튜토리얼에서는 Compute Engine API, Cloud Storage API, Cloud Resource Manager API를 사용하지만 다른 서비스에도 같은 개념이 적용됩니다.

경계에서 경계 내부의 제한된 서비스에 대한 내부 트래픽을 허용하는지 확인

이 섹션에서는 서비스가 VPC 액세스 가능 서비스에도 구성된 경우 경계가 경계 내에 있는 네트워크 엔드포인트의 트래픽을 허용하는지 확인합니다.

VPC 액세스 가능 서비스 구성을 통해 내부 네트워크 엔드포인트에서 서비스에 연결하는 방법을 보여주는 아키텍처 다이어그램

이전 다이어그램은 경계를 통해 트래픽이 경계 내부의 네트워크 엔드포인트에서 VPC 액세스 가능 서비스로 구성된 제한된 서비스까지 도달하는 방법을 보여줍니다. VPC 액세스 가능 서비스로 구성되지 않은 서비스는 경계 내 네트워크 엔드포인트에서 연결할 수 없습니다.

다음 단계에서는 경계 내에서 Compute Engine 인스턴스에 대해 SSH 연결을 설정한 다음 서비스에 요청하여 이 개념을 확인합니다.

  1. Cloud Shell에서 TCP 전달을 위한 IAP 서비스에서 사용하는 35.235.240.0/20 IP 주소 범위의 인그레스를 허용하여 VPC 네트워크에 대한 SSH 트래픽을 허용하는 방화 규칙을 생성합니다.

    gcloud compute firewall-rules create demo-allow-ssh \
    --direction=INGRESS \
    --priority=1000 \
    --network=restricted-vpc \
    --action=ALLOW \
    --rules=tcp:22 \
    --source-ranges=35.235.240.0/20
    
  2. 이 인스턴스에 대한 SSH 세션을 시작합니다.

    gcloud compute ssh demo-vm --zone=ZONE
    

    인스턴스의 호스트 이름을 표시하도록 명령줄 프롬프트가 변경되었는지 확인하여 demo-vm 인스턴스에 성공적으로 연결되었는지 확인합니다.

    username@demo-vm:~$
    

    이전 명령어가 실패하면 다음과 유사한 오류 메시지가 표시될 수 있습니다.

    "[/usr/bin/ssh] exited with return code [255]"
    

    이 경우 Compute Engine 인스턴스가 부팅을 완료하지 않았을 수 있습니다. 1분 동안 기다린 후 다시 시도하세요.

  3. 경계 내부의 SSH 세션에서 VPC 액세스 가능 서비스 허용 목록에 구성된 Google Cloud 서비스를 사용하여 경계가 내부적으로 허용하는 서비스를 확인합니다. 예를 들어 Compute Engine 서비스를 사용하여 명령어를 시도합니다.

    gcloud compute instances describe demo-vm --zone=ZONE
    

    성공적인 응답은 demo-vm의 세부정보를 반환합니다. 이 응답은 경계가 Compute Engine API에 대해 내부 트래픽을 허용하는 것을 보여줍니다.

  4. 경계 내부의 SSH 세션에서 VPC 액세스 가능 서비스 허용 목록에 포함되지 않은 서비스가 VM에서 허용되지 않는지 확인합니다. 예를 들어 다음 명령어는 VPC 액세스 가능 서비스 허용 목록에 구성되지 않은 Resource Manager 서비스를 사용합니다.

    gcloud projects describe PROJECT_ID
    

    출력은 다음과 비슷합니다.

    "ERROR: (gcloud.projects.list) PERMISSION_DENIED: Request is prohibited by organization's policy."
    

    Compute Engine 인스턴스 및 기타 네트워크 엔드포인트는 VPC 액세스 가능 서비스 허용 목록에 구성된 서비스만 요청할 수 있습니다. 그러나 경계 외부에서 발생한 서버리스 리소스 또는 서비스 트래픽이 해당 서비스를 요청할 수 있습니다. 프로젝트에서 서비스가 사용되지 않도록 하려면 제한된 서비스 리소스 사용량 정책을 참조하세요.

경계가 경계 외부에서 제한된 서비스에 대한 내부 트래픽을 거부하는지 확인

이 섹션에서는 경계가 해당 경계 내부의 서비스에서 경계 외부의 Google Cloud 서비스로의 통신을 차단하는지 확인합니다.

VPC 서비스 제어 경계가 경계 내부의 트래픽에서 경계 외부의 제한된 서비스로의 액세스를 거부하는 방법을 보여주는 아키텍처 다이어그램

이전 다이어그램은 내부 트래픽이 경계 외부의 제한된 서비스와 통신할 수 없는 경우를 보여줍니다.

다음 단계에서는 경계 내부의 제한된 서비스와 경계 외부의 제한된 서비스로 내부 트래픽 전송을 시도하여 이 개념을 확인합니다.

  1. 경계 내부의 SSH 세션에서 다음 명령어를 실행하여 경계 내에 스토리지 버킷을 만듭니다. Cloud Storage 서비스가 restricted-servicesaccessible-services에 구성되어 있으므로 이 명령어는 작동합니다.

    gcloud storage buckets create gs://PROJECT_ID-02
    

    응답이 성공하면 스토리지 버킷이 생성됩니다. 이 응답은 경계가 Cloud Storage 서비스에 대해 내부 트래픽을 허용하는 것을 보여줍니다.

  2. 경계 내부의 SSH 세션에서 다음 명령어를 실행하여 경계 외부에 있는 버킷에서 읽습니다. 이 공개 버킷은 allUsers에 대한 읽기 전용 권한을 허용하지만 경계는 경계 내부에서 경계 외부의 제한된 서비스로의 트래픽을 거부합니다.

    gcloud storage cat gs://solutions-public-assets/vpcsc-tutorial/helloworld.txt
    

    출력은 다음과 비슷합니다.

    "ERROR: (gcloud.storage.objects.describe) HTTPError 403: Request is prohibited
    by organization's policy."
    

    이 응답은 경계 내에서 제한된 서비스를 사용할 수 있지만 경계 내부의 리소스는 경계 외부의 제한된 서비스와 통신할 수 없음을 보여줍니다.

이그레스 정책이 경계에 예외를 허용하는지 확인

이 섹션에서는 이그레스 정책이 경계 예외를 허용하는지 확인합니다.

이그레스 정책에서 특정 예외가 경계 외부의 제한된 서비스에 도달하도록 허용하는 방법을 보여주는 아키텍처 다이어그램

이전 다이어그램은 이그레스 정책을 사용하여 제한된 예외를 부여할 때 내부 트래픽이 특정 외부 리소스와 통신하는 방법을 보여줍니다.

다음 단계에서는 이그레스 정책을 만든 후 이그레스 정책에서 허용하는 경계 외부에 있는 공개 Cloud Storage 버킷에 액세스하여 이 개념을 확인합니다.

  1. Cloud Shell에서 새 탭 열기를 클릭하여 새 Cloud Shell 세션을 엽니다. 이후 단계에서는 경계 내에 SSH 세션이 있는 첫 번째 탭과 명령줄 프롬프트가 username@cloudshell로 시작하는 경계 외부 Cloud Shell의 두 번째 탭 간에 전환합니다.

  2. Cloud Shell 탭에서 google.storage.objects.get 메서드를 사용하여 demo-vm의 연결된 서비스 계정 ID에서 외부 프로젝트의 공개 버킷으로 이그레스를 허용하는 이그레스 정책을 만듭니다. 이그레스 정책으로 경계를 업데이트합니다.

    export POLICY_ID=$(gcloud access-context-manager policies list \
    --organization=ORGANIZATION_ID \
    --format="value(name)")
    
    export SERVICE_ACCOUNT_EMAIL=$(gcloud compute instances describe demo-vm \
    --zone=ZONE) \
    --format="value(serviceAccounts.email)"
    
    cat <<EOF > egress_spec.yaml
    - egressFrom:
        identities:
          - serviceAccount:$SERVICE_ACCOUNT_EMAIL
      egressTo:
        operations:
        - methodSelectors:
          - method: 'google.storage.objects.get'
          serviceName: storage.googleapis.com
        resources:
        - projects/950403849117
    EOF
    
    gcloud access-context-manager perimeters update demo_perimeter \
    --set-egress-policies=egress_spec.yaml \
    --policy=$POLICY_ID
    
  3. username@demo-vm으로 시작하는 명령줄 프롬프트가 있는 경계 내에서 VM에 대한 SSH 세션이 있는 탭으로 돌아갑니다.

  4. 경계 내부의 SSH 세션에서 Cloud Storage 버킷에 다른 요청을 수행하고 작동하는지 확인합니다.

    gcloud storage cat gs://solutions-public-assets/vpcsc-tutorial/helloworld.txt
    

    출력은 다음과 비슷합니다.

    "Hello world!
    This is a sample file in Cloud Storage that is viewable to allUsers."
    

    이 응답은 경계와 이그레스 정책이 특정 ID에서 특정 Cloud Storage 버킷으로 내부 트래픽을 허용하는 것을 보여줍니다.

  5. 경계 내부의 SSH 세션에서 이그레스 정책 예외에서 명시적으로 허용되지 않은 다른 메서드도 테스트할 수 있습니다. 예를 들어 다음 명령어에는 경계에서 거부된 google.storage.buckets.list 권한이 필요합니다.

    gcloud storage ls gs://solutions-public-assets/vpcsc-tutorial/*
    

    출력은 다음과 비슷합니다.

    "ERROR: (gcloud.storage.cp) Request is prohibited by organization's policy."
    

    이 응답은 경계가 외부 버킷에 있는 객체를 나열하는 내부 트래픽을 거부함을 나타내며, 이그레스 정책이 명시적으로 지정된 메서드를 제한적으로 허용함을 나타냅니다.

서비스 경계 외부에서 데이터를 공유하는 일반적인 패턴에 대한 자세한 내용은 인그레스 및 이그레스 규칙을 사용한 안전한 데이터 교환을 참조하세요.

(선택사항) 제한된 서비스 리소스 사용량 정책 구성

또한 환경에서 개별적으로 승인된 API만 사용하도록 허용하는 내부 요구사항 또는 규정 준수 요구사항이 있을 수 있습니다. 이 경우 제한된 서비스 리소스 사용량 조직 정책 서비스를 구성할 수도 있습니다. 프로젝트에 조직 정책을 적용하면 해당 프로젝트에서 만들 수 있는 서비스를 제한할 수 있습니다. 하지만 조직 정책은 이 프로젝트의 서비스가 다른 프로젝트의 서비스와 통신하는 것을 차단하지 않습니다. 반면 VPC 서비스 제어를 사용하면 경계 외부 서비스와 통신을 방지하도록 경계를 정의할 수 있습니다.

예를 들어 프로젝트에서 Compute Engine을 허용하고 Cloud Storage를 거부하도록 조직 정책을 정의하는 경우 이 프로젝트의 VM은 프로젝트의 Cloud Storage 버킷을 만들 수 없습니다. 하지만 VM은 다른 프로젝트의 Cloud Storage 버킷에 요청할 수 있으므로 Cloud Storage 서비스를 통한 유출이 여전히 가능합니다. 다음 단계는 이 시나리오를 구현하고 테스트하는 방법을 보여줍니다.

  1. 명령줄 프롬프트가 username@cloudshell로 시작하는 Cloud Shell 탭으로 전환합니다.
  2. Cloud Shell 탭에서 Compute Engine 서비스의 사용만 허용하고 다른 모든 서비스는 거부하는 조직 정책 서비스를 설명하는 YAML 파일을 만든 다음 이를 프로젝트에 적용합니다.

    cat <<EOF > allowed_services_policy.yaml
    constraint: constraints/gcp.restrictServiceUsage
    listPolicy:
      allowedValues:
      - compute.googleapis.com
      inheritFromParent: true
    EOF
    
    gcloud resource-manager org-policies set-policy allowed_services_policy.yaml \
    --project=PROJECT_ID
    
  3. username@demo-vm으로 시작하는 명령줄 프롬프트가 있는 경계 내에서 VM에 대한 SSH 세션이 있는 탭으로 돌아갑니다.

  4. 경계 내부의 SSH 세션에서 다음 명령어를 실행하여 이전에 이 프로젝트 내에서 만든 동일한 스토리지 버킷을 표시합니다.

    gcloud storage buckets describe gs://PROJECT_ID
    

    출력은 다음과 비슷합니다.

    "ERROR: (gcloud.storage.buckets.create) HTTPError 403: Request is disallowed by organization's constraints/gcp.restrictServiceUsage constraint for 'projects/123456789' attempting to use service 'storage.googleapis.com'."
    

    이 응답은 조직 정책 서비스가 경계 구성에 관계없이 프로젝트 내의 Cloud Storage 서비스를 거부함을 보여줍니다.

  5. 경계 내부의 SSH 세션에서 다음 명령어를 실행하여 이그레스 정책에서 허용하는 경계 외부에 있는 스토리지 버킷을 확인합니다.

    gcloud storage cat gs://solutions-public-assets/vpcsc-tutorial/helloworld.txt
    

    출력은 다음과 비슷합니다.

    "Hello world!
    This is a sample file in Cloud Storage that is viewable to allUsers."
    

    호출이 성공하면 외부 스토리지 버킷의 helloworld.txt 콘텐츠가 반환됩니다. 이 응답은 경계 및 이그레스 정책이 제한된 특정 조건에서 내부 트래픽이 외부 스토리지 버킷에 도달하도록 허용하지만 조직 정책 서비스는 경계 구성에 관계없이 프로젝트의 Cloud Storage 서비스를 거부함을 보여줍니다. 프로젝트 외부의 서비스는 제한된 서비스 리소스 사용량 조직 정책 서비스에 관계없이 경계에서 허용되는 경우 유출에 계속 사용될 수 있습니다.

    경계 외부의 Cloud Storage나 다른 Google 서비스와의 통신을 거부하려면 제한된 서비스 리소스 사용량 조직 정책 서비스만으로는 충분하지 않습니다. VPC 서비스 제어 경계를 구성해야 합니다. VPC 서비스 제어는 데이터 무단 반출 경로를 완화하며 제한된 서비스 리소스 사용량은 환경 내에서 승인되지 않은 서비스를 만들지 못하도록 하는 규정 준수 제어입니다. 이러한 제어를 함께 사용하여 해당 환경에서 승인된 서비스를 내부 용도로 사용할 수 있도록 다양한 유출 경로를 차단하고 선택적으로 허용합니다.

삭제

Google Cloud 프로젝트를 삭제합니다.

gcloud projects delete PROJECT_ID

VPC 서비스 제어 경계는 추가 비용을 발생시키지 않지만 조직의 혼잡한 미사용 리소스를 방지하기 위해 정리해야 합니다.

  1. Google Cloud Console 상단의 프로젝트 선택기에서 이 튜토리얼에서 사용한 조직을 선택합니다.
  2. Google Cloud console에서 VPC 서비스 제어 페이지로 이동합니다.

    VPC 서비스 제어로 이동

  3. 경계 목록에서 삭제할 경계를 선택한 후 삭제를 클릭합니다.

  4. 대화상자에서 삭제를 다시 클릭하여 삭제를 확인합니다.

다음 단계