サンドボックスを使用して VPC Service Controls と Private Service Connect を構成する

Private Service Connect(PSC-E / PSC-I)を使用して、Agent Platform サンドボックスのプライベート上り(内向き)とインターネット下り(外向き)を制御します。これらのコントロールにより、サンドボックスは境界内または境界外の VPC Service Controls に準拠します。

概要

VPC Service Controls を使用すると、 Cloud de Confiance by S3NS リソースを分離するサービス境界を定義して、データ漏洩のリスクを軽減できます。Gemini Enterprise Agent Platform のサンドボックスは、信頼できないコードの実行、ウェブブラウザの操作(コンピュータの使用)、カスタム コンテナ イメージの実行を行うための、安全で分離されたコンピューティング環境をエージェントに提供します。サンドボックスはインタラクティブなデータプレーンを公開し、アウトバウンド呼び出しを行うため、プライベート上り(内向き)(PSC-E)と下り(外向き)制御(PSC-I)の 2 つの Private Service Connect コントロールで管理されます。

境界内でサンドボックスを実行すると、次のものが境界内で保護されます。

  • エージェントがサンドボックス セッション中に読み取りまたは書き込みを行うデータ(サンドボックス ディスク上のファイル、メモリ内状態)。
  • ディスクとメモリ内の状態をキャプチャし、Cloud Storage バケットに自動的に保存されるサンドボックス スナップショット。
  • サンドボックス データプレーンと交換されるリクエストとレスポンス(コンピュータの使用コマンドやスクリーンショットなど)。
  • Artifact Registry から pull されたカスタム コンテナ イメージ。
  • サンドボックスが Google API(Cloud Storage や Agent Platform など)に対して行う呼び出し。

また、VPC Service Controls の境界なしで上り(内向き)と下り(外向き)の制御を設定することもできます。これは、PSC-E(プライベート上り(内向き))と PSC-I(下り(外向き))によって、サンドボックスが VPC Service Controls に準拠するようになるためです。VPC Service Controls の境界を使用せずに入力と出力を設定するには、Private Service Connect インターフェース(PSC-I)を使用してサンドボックスの下り(外向き)を制御するに進みます。

制限事項と考慮事項

  • プライベート上り(内向き)は、1 つのコンシューマー プロジェクトに対してのみ有効にできます。また、サンドボックスが実行されるユーザー プロジェクトと同じである必要があります。
  • DNS ピアリングを介したプライベート解決のみがサポートされます。トンネリングを防ぐため、パブリック DNS 転送は無効になっています。
  • VPC Service Controls で保護されているリソースでは、リクエストとレスポンスのロギングは使用できません。
  • 呼び出し元がアクセスレベルにない限り、境界外からのプログラム アクセスとコンソール アクセスは拒否されます。

始める前に

  • プロジェクトを含む VPC Service Controls のサービス境界を作成または特定します。サンドボックスが VPC Service Controls の境界で保護されるようにするには、サンドボックスを作成する前に Cloud de Confiance by S3NS プロジェクトが境界内にある必要があります。
  • プロジェクトで Agent Platform API(aiplatform.googleapis.com)を有効にします。
  • サンドボックスを実行するリージョンに VPC ネットワークがある。
  • 必要なロールがあることを確認します。
    • 境界の Access Context Manager 管理者ロール
    • ネットワーク アタッチメントを所有するプロジェクトの Compute ネットワーク管理者(roles/compute.networkAdmin)。

サービス境界に Agent Platform を追加する

VPC Service Controls の境界内の制限付きサービスのリストに Agent Platform API を追加します。これにより、Agent Platform(サンドボックス コントロール プレーンを含む)が保護され、呼び出し元がアクセスレベルにない限り、API へのパブリック インターネット アクセスがブロックされます。

  1. Cloud de Confiance コンソールで VPC Service Controls を開き、境界を編集します。
  2. [制限付きサービス] で、Vertex AI API(aiplatform.googleapis.com)を追加します。
  3. サンドボックスで使用する依存関係が同じ境界内にあることを確認します。通常は Cloud Storage(storage.googleapis.com)と Artifact Registry(カスタム コンテナ イメージの場合は artifactregistry.googleapis.com)です。スナップショット ストレージは自動的に処理されます。
  4. 境界外の信頼できるユーザー(企業ネットワークなど)のアクセス権を復元するには、境界にアクセスレベルを適用します。

省略可: Google API へのプライベート アクセスを構成する

VPC Service Controls の境界内では、サンドボックスは制限付き仮想 IP アドレス(VIP)を介して Google API に非公開でアクセスします。独自の VPC ネットワークとオンプレミス ネットワークから、制限付き VIP も使用して、リクエストが公共のインターネットを通過しないようにします。

  • *.googleapis.com を制限付き VIP 199.36.153.4/30 にルーティングし、Google API を呼び出すサブネットでプライベート Google アクセスを有効にします。
  • 制限付き VIP に解決される googleapis.com(イメージを pull する場合は 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

サンドボックス テンプレートから添付ファイルを参照する

SandboxEnvironmentTemplate の下り(外向き)フィールドを設定して、サンドボックスが VPC 経由で下り(外向き)をルーティングするようにします。

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 からのパスを設定して管理するには、インターネットまたはプライベート専用の下り(外向き)が必要かどうかを判断します。

インターネットの下り(外向き)を設定して宛先を管理する

サンドボックスは内部(RFC 1918)アドレスで VPC に入るため、インターネットに接続するには Cloud NAT が必要です。宛先が送信元 IP で許可リストに登録されている場合は、静的 Egress 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 トンネルの引き出しもブロックされます)。サンドボックスに必要なレコードを含む Cloud DNS 限定公開ゾーンを VPC に作成し、サンドボックスがそのゾーンの名前を解決するように 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 ポートを介して接続するクライアント)。

次のステップ