샌드박스로 VPC 서비스 제어 및 Private Service Connect 구성

Private Service Connect(PSC-E/PSC-I)를 사용하여 Agent Platform 샌드박스의 비공개 인그레스 및 인터넷 이그레스를 제어합니다. 이러한 제어를 통해 샌드박스는 경계 내부 또는 경계 없이 VPC 서비스 제어를 준수합니다.

개요

VPC 서비스 제어를 사용하면 Google Cloud 리소스를 격리하는 서비스 경계를 정의하여 데이터 무단 반출 위험을 완화할 수 있습니다. Gemini Enterprise Agent Platform 샌드박스는 에이전트가 신뢰할 수 없는 코드를 실행하거나, 웹브라우저를 구동하거나(컴퓨터 사용), 커스텀 컨테이너 이미지를 실행할 수 있는 안전하고 격리된 컴퓨팅 환경을 제공합니다. 샌드박스는 대화형 데이터 영역을 노출하고 아웃바운드 호출을 수행하므로 비공개 인그레스(PSC-E) 및 이그레스 제어(PSC-I)라는 두 가지 Private Service Connect 제어로 관리됩니다.

경계 내에서 샌드박스를 실행하면 다음 항목이 경계 내에서 보호됩니다.

  • 샌드박스 세션 중에 에이전트가 읽거나 쓰는 데이터(샌드박스 디스크의 파일, 메모리 내 상태)
  • 디스크 및 메모리 내 상태를 캡처하고 Cloud Storage 버킷에 자동으로 저장되는 샌드박스 스냅샷
  • 샌드박스 데이터 영역과 교환되는 요청 및 응답(예: 컴퓨터 사용 명령어, 스크린샷)
  • Artifact Registry에서 가져온 커스텀 컨테이너 이미지
  • 샌드박스에서 Google API(예: Cloud Storage 또는 Agent Platform)를 호출합니다.

PSC-E(비공개 인그레스) 및 PSC-I(이그레스)는 샌드박스를 VPC 서비스 제어 규정을 준수하도록 만들기 때문에 VPC 서비스 제어 경계 없이 인그레스 및 이그레스 제어를 설정할 수도 있습니다. VPC 서비스 제어 경계 없이 인그레스 및 이그레스를 설정하려면 Private Service Connect 인터페이스(PSC-I)를 사용하여 샌드박스 이그레스 제어로 건너뜁니다.

제한사항 및 고려사항

샌드박스에 VPC 서비스 제어 및 Private Service Connect를 구성할 때는 다음 제한사항과 보안 경계를 염두에 두세요.

  • 기본 제공 샌드박스 도메인 허용 목록 없음: 샌드박스 및 SandboxEnvironmentTemplate 리소스에는 기본 제공 도메인 허용 목록 필드가 없습니다. network_attachment 없이 egress_control_config에서 internet_access: True를 사용 설정하면 공개 IP 주소(0.0.0.0/0, 비공개 RFC 1918 범위 및 169.254.0.0/16 메타데이터 범위 제외)에 대한 무제한 아웃바운드 액세스가 부여됩니다. 도메인 이름(FQDN), URL 또는 IP 주소로 아웃바운드 연결을 제한하려면 Private Service Connect 인터페이스(network_attachment)를 사용하여 샌드박스 이그레스를 VPC에 브리지하고 Cloud Next Generation Firewall(Cloud NGFW) 또는 Secure Web Proxy(Secure Web Proxy)를 사용하여 VPC에서 필터링을 적용해야 합니다.
  • 비공개 인그레스용 단일 소비자 프로젝트: 비공개 인그레스(PSC-E)는 최대 하나의 소비자 프로젝트에 사용 설정할 수 있으며, 이는 샌드박스가 실행되는 동일한 사용자 프로젝트여야 합니다.
  • DNS 변환 및 터널링 방지: 이그레스가 VPC에 브리지되면 Cloud DNS 피어링(dns_peering_configs)을 통한 비공개 이름 변환만 지원됩니다. DNS 터널 유출을 방지하기 위해 공개 DNS 전달은 사용 중지됩니다.
  • Cloud 감사 로그 및 네트워크 위협 검사: Cloud 감사 로그는 컨트롤 플레인 수명 주기 호출 및 데이터 영역 실행 RPC(ExecuteSandboxEnvironment, BidiExecuteSandboxEnvironment, AuthorizeSandboxEnvironmentAccess)를 기록하지만 VPC 서비스 제어로 보호되는 리소스에는 요청 및 응답 페이로드 로깅을 사용할 수 없습니다. 컨테이너 내부의 개별 하위 프로세스와 네트워크 소켓은 Cloud 감사 로그에 로깅되지 않습니다. 아웃바운드 연결을 검사하고 네트워크 위협을 감지하려면 VPC에서 VPC 흐름 로그, Cloud NGFW 규칙 로깅, Cloud DNS 쿼리 로깅, Secure Web Proxy 로그를 사용 설정하세요.
  • 샌드박스 내 격리된 ID: 샌드박스 내의 코드는 프로젝트에 대한 Identity and Access Management(IAM) 역할이 없는 권한이 없는 테넌트 ID로 실행되며, 상위 에이전트의 에이전트 ID 또는 서비스 계정을 상속하지 않으며, Compute Engine 메타데이터 서버(169.254.169.254:80)에 사용자 인증 정보를 쿼리할 수 없습니다. 자세한 내용은 실행 ID 및 사용자 인증 정보 경계를 참조하세요.
  • 경계 액세스 수준: 호출자가 경계의 액세스 수준과 일치하지 않는 한 경계 외부에서의 프로그래매틱 및 콘솔 액세스가 거부됩니다.

시작하기 전에

샌드박스에 VPC 서비스 제어 또는 Private Service Connect를 구성하기 전에 다음 기본 요건을 완료하세요.

  • 프로젝트가 포함된 VPC 서비스 제어 서비스 경계를 만들거나 식별합니다. VPC 서비스 제어 경계로 샌드박스를 보호하려면 샌드박스를 만들기 전에 Google Cloud 프로젝트가 경계에 있어야 합니다.
  • 프로젝트에서 Agent Platform API(aiplatform.googleapis.com)를 사용 설정합니다.
  • 샌드박스를 실행하는 리전에 VPC 네트워크가 있어야 합니다.
  • 필수 역할이 있는지 확인합니다.
    • 경계에 대한 Access Context Manager 관리자 역할
    • 네트워크 연결을 소유한 프로젝트의 Compute 네트워크 관리자(roles/compute.networkAdmin)

서비스 경계에 Agent Platform 추가

VPC 서비스 제어 경계의 제한된 서비스 목록에 Agent Platform API를 추가합니다. 이렇게 하면 Agent Platform(샌드박스 컨트롤 플레인 포함)이 보호되고 호출자가 액세스 수준에 있지 않는 한 API에 대한 공개 인터넷 액세스가 차단됩니다.

  1. Google Cloud 콘솔에서 VPC 서비스 제어를 열고 경계를 수정합니다.
  2. 제한된 서비스에서 Agent Platform API(aiplatform.googleapis.com)를 추가합니다.
  3. 샌드박스에서 사용하는 종속 항목이 동일한 경계에 있는지 확인합니다. 일반적으로 Cloud Storage(storage.googleapis.com) 및 Artifact Registry(artifactregistry.googleapis.com, 커스텀 컨테이너 이미지의 경우)입니다. 스냅샷 스토리지는 자동으로 처리됩니다.
  4. 경계 외부의 신뢰할 수 있는 사용자(예: 회사 네트워크)에 대한 액세스를 복원하려면 경계에 액세스 수준을 연결합니다.

선택사항: Google API에 대한 비공개 액세스 구성

VPC 서비스 제어 경계 내에서 샌드박스는 제한된 가상 IP 주소(VIP)를 통해 비공개로 Google API에 도달합니다. 자체 VPC 및 온프레미스 네트워크에서 제한된 VIP를 사용하여 요청이 공개 인터넷을 거치지 않도록 합니다.

  • *.googleapis.com을 제한된 VIP 199.36.153.4/30로 라우팅하고 Google API를 호출하는 서브넷에서 비공개 Google 액세스를 사용 설정합니다.
  • 제한된 VIP로 확인되는 googleapis.com(이미지를 가져오는 경우 pkg.dev/gcr.io)의 Cloud DNS 비공개 영역을 만듭니다.

Private Service Connect 인터페이스(PSC-I)를 사용하여 샌드박스 이그레스 제어

샌드박스에는 기본 제공 도메인 허용 목록 설정이 포함되어 있지 않으므로 아웃바운드 도메인(FQDN)을 허용 목록에 추가하거나, URL을 필터링하거나, 샌드박스가 비공개 서비스에 도달하도록 허용해야 할 때마다 Private Service Connect 인터페이스(PSC-I)를 사용하세요. PSC-I는 모든 샌드박스 이그레스를 VPC에 브리지하므로 프로젝트가 VPC 서비스 제어 경계 내에 있는지 여부와 관계없이 자체 VPC 보안 제어를 사용하여 해당 트래픽을 제어하고 로깅할 수 있습니다.

이 단계의 모든 리소스는 샌드박스를 소유한 사용자 프로젝트 또는 공유 VPC 호스트 프로젝트에서 생성됩니다. 이그레스는 템플릿에 설정한 단일 VPC 네트워크 및 네트워크 연결로 전달됩니다.

네트워크 연결 만들기

샌드박스의 네트워크 연결을 만듭니다.

# A dedicated subnet for the PSC interface (minimum /28)
gcloud compute networks subnets create sandbox-psc-subnet \
    --network=YOUR_VPC \
    --range=10.0.0.0/28 \
    --region=REGION

# The network attachment the sandbox connects into
gcloud compute networks network-attachments create sandbox-egress-na \
    --region=REGION \
    --connection-preference=ACCEPT_AUTOMATIC \
    --subnets=sandbox-psc-subnet

샌드박스 템플릿에서 첨부파일 참조

샌드박스가 VPC를 통해 이그레스를 라우팅하도록 SandboxEnvironmentTemplate에서 이그레스 필드를 설정합니다.

from vertexai import Client

client = Client(project="PROJECT_ID", location="REGION",
                http_options={"api_version": "v1beta1"})

templates = client.agent_engines.sandboxes.templates
op = templates.create(
    name=agent_instance_name,
    display_name="cu-vpcsc-template",
    config={
        "custom_container_environment": {
            "custom_container_spec": {"image_uri": "IMAGE_URI"},
            "ports": [{"port": 8080, "protocol": "TCP"}],
        },
        "egress_control_config": {
            "internet_access": True, # Enables outbound access from the sandbox. With VPC-SC, that traffic is bridged into your VPC.
            "customer_vpc_network":
                "projects/PROJECT_ID/global/networks/YOUR_VPC", # The VPC network in your project that egress is bridged into. Checked by VPC-SC at creation time.
            "network_attachment":
                "projects/PROJECT_ID/regions/REGION/networkAttachments/sandbox-egress-na", # The network attachment that accepts the sandbox's PSC interface.
        },
    },
)

PSC 인터페이스는 VPC에 비공개 경로를 빌드하고, internet_access가 사용 설정되면 플랫폼이 샌드박스의 이그레스를 이 경로로 자동으로 조정합니다.

VPC에서 나가는 경로를 설정하고 관리하려면 인터넷 이그레스가 필요한지 아니면 비공개 전용 이그레스가 필요한지 결정합니다.

  • 인터넷 이그레스: 인터넷 이그레스의 경우 Cloud NAT가 필요하며, Cloud Next Generation Firewall(Cloud NGFW) 규칙 또는 Secure Web Proxy를 사용한 대상 제어가 필요합니다.
  • 비공개 전용 이그레스(VPC 또는 온프레미스의 서비스에 연결, 인터넷 없음): Cloud NAT가 필요하지 않습니다. 경로, 방화벽 규칙, DNS 피어링만 있으면 됩니다.

인터넷 이그레스 설정 및 대상 관리

샌드박스는 내부(RFC 1918) 주소로 VPC에 들어가므로 인터넷에 연결하려면 Cloud NAT가 필요합니다. 대상에서 소스 IP를 허용 목록에 추가하는 경우 고정 이그레스 IP를 예약합니다.

# Reserve a static egress IP (optional, for destination-side allow-listing)
gcloud compute addresses create sandbox-egress-ip --region=REGION

# Cloud Router + NAT for the region, scoped to the PSC subnet
gcloud compute routers create sandbox-egress-router \
    --network=YOUR_VPC --region=REGION

gcloud compute routers nats create sandbox-egress-nat \
    --router=sandbox-egress-router --region=REGION \
    --nat-external-ip-pool=sandbox-egress-ip \
    --nat-custom-subnet-ip-ranges=sandbox-psc-subnet

샌드박스가 VPC를 통과하는 트래픽으로 도달할 수 있는 대상을 제한하려면 필요한 제어 수준을 선택하세요.

  • Cloud NGFW(네트워크 수준): 허용 규칙(FQDN 객체 지원)과 그 외 모든 항목에 대한 기본 거부가 포함된 전역 네트워크 방화벽 정책입니다.

    gcloud compute network-firewall-policies create sandbox-egress-policy --global
    
    # Allow only the destinations your agent needs (by FQDN)
    gcloud compute network-firewall-policies rules create 1000 \
        --firewall-policy=sandbox-egress-policy --global-firewall-policy \
        --direction=EGRESS --action=allow --layer4-configs=tcp:443 \
        --dest-fqdns=api.partner.example.com
    
    # Default-deny the rest of egress
    gcloud compute network-firewall-policies rules create 65000 \
        --firewall-policy=sandbox-egress-policy --global-firewall-policy \
        --direction=EGRESS --action=deny --layer4-configs=all \
        --dest-ip-ranges=0.0.0.0/0
    
    gcloud compute network-firewall-policies associations create \
        --firewall-policy=sandbox-egress-policy --global-firewall-policy \
        --network=YOUR_VPC
    
  • Secure Web Proxy(애플리케이션/L7): TLS 인식 URL별 정책을 위해 VPC에서 Secure Web Proxy를 이그레스 검사 지점으로 배포하고 이를 통해 PSC 서브넷의 이그레스를 라우팅합니다.

비공개 전용 이그레스 설정

샌드박스에 VPC 또는 온프레미스의 비공개 서비스만 필요한 경우 VPC에 대상에 대한 경로가 있는지 확인하고, PSC 서브넷(10.0.0.0/28)의 이그레스 방화벽 규칙으로 이를 허용하고, DNS 피어링을 통해 서비스 이름을 확인합니다.

DNS 피어링 설정

공개 리졸버 대신 VPC를 통해 샌드박스 이름 변환을 제공합니다(DNS 터널 무단 반출도 차단됨). 샌드박스에 필요한 레코드를 사용하여 VPC에 Cloud DNS 비공개 영역을 만든 다음 샌드박스가 해당 영역의 이름을 확인하도록 DNS 피어링을 구성합니다.

서비스 에이전트 액세스 권한 부여(공유 VPC)

네트워크 연결이 샌드박스가 실행되는 프로젝트(프로젝트 B)와 별도의 프로젝트(프로젝트 A)에 있는 경우 프로젝트 B의 에이전트 플랫폼 서비스 에이전트에 프로젝트 A에 대한 Compute 네트워크 사용자 역할을 부여합니다.

# Agent Platform service agent of the project that runs the sandbox
service-PROJECT_NUMBER@gcp-sa-aiplatform.iam.gserviceaccount.com

# On the project that owns the network attachment
gcloud projects add-iam-policy-binding NETWORK_PROJECT_ID \
    --member="serviceAccount:service-PROJECT_NUMBER@gcp-sa-aiplatform.iam.gserviceaccount.com" \
    --role="roles/compute.networkUser"

다음을 바꿉니다.

  • PROJECT_NUMBER: 샌드박스를 실행하는 프로젝트의 프로젝트 번호입니다.
  • NETWORK_PROJECT_ID: 네트워크 연결을 소유한 프로젝트의 ID입니다.

Private Service Connect(PSC-E)를 사용하여 비공개 인그레스 사용 설정

대화형 워크로드는 클라이언트가 연결해야 하는 데이터 영역을 노출합니다. 공개 인터넷 대신 VPC의 비공개 Private Service Connect 엔드포인트(PSC-E)를 통해 해당 데이터 영역에 도달합니다.

허용된 소비자 프로젝트 선언

연결이 허용된 소비자 프로젝트를 사용하여 템플릿에 인그레스 구성을 설정합니다. 샌드박스가 실행되는 동일한 사용자 프로젝트만 샌드박스 VPC에 대한 비공개 인그레스를 가질 수 있습니다.

동일한 프로젝트의 VPC에서 샌드박스에 연결합니다.

config = {
    # ...custom_container_environment, egress_control_config...
    "ingress_control_config": {
        "private_service_connect_config": {
            # Must be the same project the sandbox runs in.
            "enable_private_service_connect": True,
        }
    },
}

VPC에서 PSC 엔드포인트 만들기

샌드박스가 생성되면 연결 정보에서 서비스 연결을 읽습니다.

# The sandbox returns a service attachment to connect to
service_attachment = sandbox.connection_info.service_attachment

그런 다음 내부 IP 주소를 예약하고 VPC에서 서비스 연결을 타겟팅하는 전달 규칙(PSC 엔드포인트)을 만듭니다.

# Reserve an internal IP and create the PSC endpoint
gcloud compute addresses create sandbox-ingress-ip \
    --region=REGION --subnet=YOUR_SUBNET

gcloud compute forwarding-rules create sandbox-ingress-ep \
    --region=REGION \
    --network=YOUR_VPC \
    --address=sandbox-ingress-ip \
    --target-service-attachment=SERVICE_ATTACHMENT_URI

이제 해당 프로젝트의 VPC에 있는 클라이언트(또는 VPC를 통해 연결 가능한 클라이언트)가 엔드포인트의 비공개 IP를 통해 샌드박스에 연결합니다(예: 샌드박스 WebSocket 또는 CDP 포트를 통해 연결하는 클라이언트).

다음 단계

샌드박스를 계속 구성하고 보호하려면 다음 리소스를 참고하세요.