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

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

개요

VPC 서비스 제어를 사용하면 리소스를 격리하여 데이터 무단 반출 위험을 완화하는 서비스 경계를 정의할 수 있습니다. Cloud de Confiance by S3NS 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)로 샌드박스 이그레스 제어로 건너뛰세요.

제한사항 및 고려사항

  • 비공개 인그레스는 정확히 하나의 소비자 프로젝트에 대해 사용 설정할 수 있으며 샌드박스가 실행되는 동일한 사용자 프로젝트여야 합니다.
  • DNS 피어링을 통한 비공개 확인만 지원됩니다. 터널링을 방지하기 위해 공개 DNS 전달은 사용 중지됩니다.
  • VPC 서비스 제어로 보호되는 리소스에는 요청 및 응답 로깅을 사용할 수 없습니다.
  • 호출자가 액세스 수준에 있지 않으면 경계 외부에서의 프로그래매틱 및 콘솔 액세스가 거부됩니다.

시작하기 전에

  • 프로젝트가 포함된 VPC 서비스 제어 서비스 경계를 만들거나 식별합니다. 샌드박스가 VPC 서비스 제어 경계로 보호되려면 샌드박스를 만들기 전에 Cloud de Confiance by S3NS 프로젝트가 경계 내에 있어야 합니다.
  • 프로젝트에서 Agent Platform API (aiplatform.googleapis.com)를 사용 설정합니다.
  • 샌드박스를 실행하는 리전에 VPC 네트워크가 있어야 합니다.
  • 필요한 역할을 보유하고 있는지 확인합니다.

서비스 경계에 Agent Platform 추가

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

  1. Cloud de Confiance 콘솔에서 VPC 서비스 제어를 열고 경계를 수정합니다.
  2. 제한된 서비스에서 Vertex AI 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)로 샌드박스 이그레스 제어

샌드박스가 인터넷 또는 비공개 서비스에 연결되도록 하려면 Private Service Connect 인터페이스를 사용하여 이그레스를 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 서브넷의 이그레스를 Secure Web Proxy를 통해 라우팅합니다.

비공개 전용 이그레스 설정

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

DNS 피어링 설정

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

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

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

# Agent Platform service agent of the project that runs the sandbox
service-PROJECT_NUMBER@gcp-sa-aiplatform.s3ns-system.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.s3ns-system.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 엔드포인트 만들기

샌드박스가 생성된 후 연결 정보에서 서비스 연결을 읽고 VPC의 전달 규칙 (PSC 엔드포인트)으로 타겟팅합니다.

# The sandbox returns a service attachment to connect to
service_attachment = sandbox.connection_info.service_attachment
# 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 포트를 통해 연결하는 클라이언트).

다음 단계