Utilizzare l'identità dell'agente con Vertex AI Agent Engine

Questa pagina descrive come utilizzare Identity Access Management (IAM) identità dell'agente per fornire funzionalità di sicurezza e gestione degli accessi quando utilizzi gli agenti in Vertex AI Agent Engine Runtime.

Panoramica

L'identità dell'agente fornisce un'identità per agente che consente un approccio con privilegi minimi ed è legata al ciclo di vita dell'agente, rendendo l'identità dell'agente un'entità più sicura rispetto agli account di servizio. I controlli di gestione degli accessi esistenti tramite IAM supportano l'identità dell'agente per consentire una governance efficace.

Le credenziali dell'identità dell'agente sono protette per impostazione predefinita da un criterio di accesso sensibile al contesto (CAA) gestito da Google. Questo criterio applica l'associazione mTLS per garantire che le credenziali dell'agente sotto forma di token associati a certificati possano essere utilizzate solo dall'ambiente di runtime previsto e attendibile (ad esempio, un container Cloud Run ). Questa baseline di sicurezza impedisce la riproduzione delle credenziali rubate, proteggendo dal furto di credenziali e dalla violazione di account (ATO).

Questa pagina tratta i seguenti argomenti:

Limitazioni

Quando pianifichi il progetto, tieni presente le seguenti limitazioni:

  • Non è possibile concedere alle identità degli agenti i ruoli bucket legacy (storage.legacyBucketReader, storage.legacyBucketWriter o storage.legacyBucketOwner) sui bucket Cloud Storage.

  • Ti consigliamo di utilizzare l'identità dell'agente solo negli ambienti di test.

Creare un agente con identità dell'agente

Puoi eseguire il provisioning degli agenti di cui esegui il deployment in Vertex AI Agent Engine con un'identità univoca al momento della creazione dell'istanza di Agent Engine. L'identità è legata all'ID risorsa dell'agente di Vertex AI Agent Engine ed è indipendente dal framework dell'agente utilizzato per sviluppare l'agente.

Quando crei un'identità dell'agente, hai le seguenti opzioni:

  • Crea un'istanza di Agent Engine senza eseguire il deployment del codice dell'agente: se vuoi configurare i criteri IAM prima di eseguire il deployment dell'agente, puoi creare un'identità dell'agente senza eseguire il deployment del codice dell'agente. Per farlo, crea un'istanza di Agent Engine con il solo campo identity_type:

    import vertexai
    from vertexai import agent_engines
    from vertexai import types
    
    client = vertexai.Client(
      project=PROJECT_ID,
      location=LOCATION,
      http_options=dict(api_version="v1beta1")
    )
    remote_app = client.agent_engines.create(
      config={"identity_type": types.IdentityType.AGENT_IDENTITY}
    )
    

    Dopo aver creato l'istanza di Agent Engine con l'identità dell'agente, puoi aggiungere il codice dell'agente utilizzando agent_engine.update(...).

  • Crea un'istanza di Agent Engine durante il deployment del codice dell'agente: se vuoi eseguire il provisioning dell'identità dell'agente durante il deployment del codice dell'agente, utilizza l'SDK Vertex AI Python e il flag identity_type=AGENT_IDENTITY.

    Definisci l'agente nel framework che preferisci:

    from google.adk.agents import Agent
    
    agent = Agent(
        model="gemini-2.5-flash",
        name="minimal_agent",
        instruction="You are a helpful assistant.",
    )
    

    Poi, esegui il deployment:

    import vertexai
    from vertexai import types
    from vertexai.agent_engines import AdkApp
    
    # Initialize the Vertex AI client with v1beta1 API for agent identity support
    client = vertexai.Client(
      project=PROJECT_ID,
      location=LOCATION,
      http_options=dict(api_version="v1beta1")
    )
    
    # Use the proper wrapper class for your Agent Framework
    app = AdkApp(agent=agent)
    
    # Deploy the agent with Agent Identity
    remote_app = client.agent_engines.create(
      agent=app,
      config={
        "display_name": "running-agent-with-identity",
        "identity_type": types.IdentityType.AGENT_IDENTITY,
        "requirements": ["google-cloud-aiplatform[adk,agent_engines]"],
        "staging_bucket": f"gs://"BUCKET _NAME",
      },
    )
    
    print(f"Effective Identity: {remote_app.api_resource.spec.effective_identity}")
    

    dove BUCKET_NAME è il nome del bucket Cloud Storage.

L'istanza di Agent Engine viene creata con un'identità dell'agente di sola lettura, attestata dal sistema (un identificatore principale):

# Agent identity Format
principal://TRUST_DOMAIN/NAMESPACE/AGENT_NAME

# Example agent identity
principal://agents.global.org-ORGANIZATION_ID.system.id.goog/resources/aiplatform/projects/PROJECT_NUMBER/locations/LOCATION/reasoningEngines/AGENT_ENGINE_ID

Le seguenti parti vengono sottoposte a provisioning automatico come parte dell'identità dell'agente:

  • TRUST_DOMAIN: un dominio di attendibilità viene sottoposto a provisioning quando abiliti l'API Vertex AI:

    • Se hai un'organizzazione, il dominio di attendibilità viene creato a livello di organizzazione con il formato agents.global.org-ORGANIZATION_ID.system.id.goog.

    • Se il tuo progetto non ha un'organizzazione, viene creato un dominio di attendibilità a livello di progetto con il formato agents.global.project-PROJECT_NUMBER.system.id.goog.

  • NAMESPACE: il percorso della risorsa immutabile dell'agente.

  • AGENT_NAME: l'elemento agent-reasoning-engine-id immutabile.

L'identità dell'agente si basa su SPIFFE. Eseguiamo anche il provisioning automatico e la gestione di un certificato x509 sull'agente con la stessa identità per l'autenticazione sicura.

Puoi visualizzare l'identità tramite la console e l'API di Vertex AI Agent Engine Google Cloud .

Accedere Google Cloud alle API e ai servizi utilizzando l'identità dell'agente

Dopo aver creato un agente con identità dell'agente, puoi concedere o negare l'accesso dell'agente alle Google Cloud API e ai servizi utilizzando i seguenti criteri IAM:

  • Policy di autorizzazione: concedi a un agente l'accesso a una Google Cloud risorsa.

  • Policy di negazione: nega a un agente l'accesso a una Google Cloud risorsa.

Concedere l'accesso a un agente

Concedi le autorizzazioni IAM all'identità dell'agente. Ti consigliamo i seguenti ruoli:

  • roles/aiplatform.expressUser: concedi l'accesso all'esecuzione di inferenze, sessioni e memoria.

  • roles/serviceusage.serviceUsageConsumer: concedi all'agente l'autorizzazione a utilizzare la quota del progetto e l'SDK Vertex AI.

  • roles/browser: concedi l'accesso alle funzionalità di base Google Cloud .

Potrebbero essere necessarie autorizzazioni aggiuntive se utilizzi la registrazione, le metriche e il registro delle API Cloud, nonché per qualsiasi altra risorsa che vuoi esporre al tuo agente. Per altri esempi, vedi più avanti.

Crea una policy di autorizzazione IAM per concedere a un agente un ruolo IAM:

  # Example: Grant the agent access to vision API.
  gcloud RESOURCE_TYPE add-iam-policy-binding RESOURCE_ID \
  --member="principal://agents.global.org-ORGANIZATION_ID.system.id.goog/resources/aiplatform/projects/PROJECT_NUMBER/locations/LOCATION/reasoningEngines/AGENT_ENGINE_ID" \
  --role="ROLE_NAME" \

Sostituisci quanto segue:

  • ORGANIZATION_ID: l'ID della tua organizzazione.

  • PROJECT_NUMBER: il numero del tuo progetto.

  • LOCATION: la tua regione. Consulta le regioni supportate per Vertex AI Agent Engine.

  • AGENT_ENGINE_ID: l'ID risorsa dell'istanza di Agent Engine.

  • ROLE_NAME è il nome del ruolo che vuoi concedere. Ad esempio, roles/vision.user. Per un elenco dei ruoli predefiniti, consulta la sezione Informazioni sui ruoli.

Una volta configurato IAM, le credenziali predefinite dell'applicazione di Google Cloud SDK utilizzano automaticamente l'identità dell'agente per eseguire l'autenticazione alle risorse.Google Cloud

Concedere l'accesso a più agenti

Puoi concedere un ruolo IAM a tutti gli agenti di Agent Engine in un progetto specifico o in un'intera organizzazione.

Per concedere un ruolo a tutti gli agenti di Agent Engine in un progetto, utilizza uno dei seguenti comandi.

Se il tuo progetto appartiene a un'organizzazione:

# Grant all agents in a project the following role
gcloud RESOURCE_TYPE add-iam-policy-binding RESOURCE_ID \
--member="principalSet://agents.global.org-ORGANIZATION_ID.system.id.goog/attribute.platformContainer/aiplatform/projects/PROJECT_NUMBER" \
--role="ROLE_NAME"

Se il tuo progetto non appartiene a un'organizzazione:

# Grant all agents in an orgless project the following role
gcloud RESOURCE_TYPE add-iam-policy-binding RESOURCE_ID \
--member="principalSet://agents.global.project-PROJECT_NUMBER.system.id.goog/attribute.platformContainer/aiplatform/projects/PROJECT_NUMBER" \
--role="ROLE_NAME"

Può essere più facile concedere autorizzazioni comuni come la quota, la registrazione o l'accesso ai modelli a tutti gli agenti del progetto per semplificare i deployment. Poi, concedi autorizzazioni specifiche e limitate ai singoli agenti per autorizzazioni più sensibili, come l'accesso ai dati. La concessione di queste autorizzazioni è possibile in qualsiasi momento dopo il primo utilizzo della funzionalità di identità dell'agente all'interno di un'organizzazione o di un progetto, quindi può essere eseguita prima del deployment dell'agente.

Ad esempio, i seguenti comandi concedono i ruoli di base a tutti gli agenti di un progetto:

gcloud projects add-iam-policy-binding PROJECT_ID \
--member="principalSet://agents.global.org-ORGANIZATION_ID.system.id.goog/attribute.platformContainer/aiplatform/projects/PROJECT_NUMBER" \
--role=roles/serviceusage.serviceUsageConsumer

gcloud projects add-iam-policy-binding PROJECT_ID \
--member="principalSet://agents.global.org-ORGANIZATION_ID.system.id.goog/attribute.platformContainer/aiplatform/projects/PROJECT_NUMBER" \
--role=roles/browser

gcloud projects add-iam-policy-binding PROJECT_ID \
--member="principalSet://agents.global.org-ORGANIZATION_ID.system.id.goog/attribute.platformContainer/aiplatform/projects/PROJECT_NUMBER" \
--role=roles/aiplatform.expressUser

gcloud projects add-iam-policy-binding PROJECT_ID \
--member="principalSet://agents.global.org-ORGANIZATION_ID.system.id.goog/attribute.platformContainer/aiplatform/projects/PROJECT_NUMBER" \
--role=roles/cloudapiregistry.viewer

gcloud projects add-iam-policy-binding PROJECT_ID \
--member="principalSet://agents.global.org-ORGANIZATION_ID.system.id.goog/attribute.platformContainer/aiplatform/projects/PROJECT_NUMBER" \
--role=roles/logging.logWriter

gcloud projects add-iam-policy-binding PROJECT_ID \
--member="principalSet://agents.global.org-ORGANIZATION_ID.system.id.goog/attribute.platformContainer/aiplatform/projects/PROJECT_NUMBER" \
--role=roles/monitoring.metricWriter

Per concedere un ruolo a tutti gli agenti di Agent Engine in un'organizzazione:

# Grant all agents in an organization the following role
gcloud RESOURCE_TYPE add-iam-policy-binding RESOURCE_ID \
--member="principalSet://agents.global.org-ORGANIZATION_ID.system.id.goog/attribute.platform/aiplatform" \
--role="ROLE_NAME"

Negare l'accesso a un agente

Per negare l'accesso di un agente alle risorse, puoi utilizzare la policy di negazione IAM o configurare una policy di Principal Access Boundary.

  • Nega l'accesso dell'agente a determinate risorse utilizzando la policy di negazione IAM.

    // Deny policy (deny all agents across the org from ability to create or delete buckets)
    
    {
    "displayName": "Deny access to bucket for all agent identities in the org",
    "rules": [
      {
        "denyRule": {
          "deniedPrincipals": [
            "principalSet://<org.id>.global.agent.id.goog/*"
          ],
          "deniedPermissions": [
            "iam.googleapis.com/roles.create",
            "storage.googleapis.com/buckets.delete"
          ]
        }
      }
    ]
    }
    
  • Configura Principal Access Boundary per limitare le risorse a cui l'agente può accedere, nonostante altre autorizzazioni che l'agente potrebbe avere:

    // PAB Policy (Only allow agents to operate within resource boundary)
    
    {
        "name":"organizations/ORGANIZATION_ID/locations/global/principalAccessBoundaryPolicies/example-policy",
        "details": {
        "rules": [
          {
            "description": "Restrict agent identity inside a folder",
            "resources": [
              "//cloudresourcemanager.googleapis.com/folder/0123456789012"
            ],
            "effect": "ALLOW"
          }
        ],
      }
    }
    
    // Bind PAB policy to all identities in the organization (incl agent id)
    
    gcloud iam principal-access-boundary-policies bindings create example-pab-binding \
          --organization=organizations/ORGANIZATION_ID \
          --policy=example-policy \ --target-principal-set=cloudresourcemanager.googleapis.com/organizations/ORGANIZATION_ID
    

Accedere a servizi di terze parti utilizzando l'autorità delegata tramite OAuth

L'identità dell'agente può consentire all'agente di accedere a servizi di terze parti per tuo conto integrandosi con Secret Manager.

Per configurare l'integrazione con Secret Manager, devi prima archiviare le credenziali ausiliarie (ID client o client secret) per accedere ai servizi di terze parti in Secret Manager (nel progetto consumer in cui viene gestito il ciclo di vita dell'agente) seguendo questi passaggi:

  1. Crea un nuovo contenitore in Secret Manager.

  2. Ottieni l'ID client o il client secret dal fornitore dell'app di terze parti.

  3. Aggiungi l'ID client o il client secret a Secret Manager.

  4. Limita l'accesso a queste credenziali in base all'ID agente (un identificatore principale):

    # Create the secret container
    gcloud secrets create my-app-oauth-secret
    
    # Add the actual client secret to Secret Manager
    gcloud secrets versions add my-app-oauth-secret --data-file=oauth-secret
    
    # Grant agent identity access to the secret
    gcloud secrets add-iam-policy-binding my-app-oauth-secret \
    --role='roles/secretmanager.secretAccessor' \
    --member="principal://agents.global.org-ORGANIZATION_ID.system.id.goog/resources/aiplatform/projects/PROJECT_NUMBER/locations/LOCATION/reasoningEngines/AGENT_ENGINE_ID" \
    

Una volta archiviato il secret, l'agente può accedere a queste credenziali durante il runtime utilizzando il relativo identificatore principale e la libreria diGoogle Cloud autenticazione standard automaticamente come parte delle Credenziali predefinite dell'applicazione.

# Example: Use agent identity to retrieve third party credentials from Secret Manager
# Use case: Using an agent, the user is trying to post a message on Slack,
# The developer first retrieves secret from Secret Manager using agent identity,
# and then uses it to login to Slack and post a message.

from google.cloud import secretmanager
from google.auth import default

def access_secret(project_id: str, secret_id: str, version_id: str = "latest") -> str:
  # Application default credential automatically gets token from MDS using agent identity
  agent_identity_credentials, _ = default()

  # Create the Secret Manager client.
  client = secretmanager.SecretManagerServiceClient(credentials=agent_identity_credentials)

  # Build the resource name of the secret version.
  name = f"projects/{project_id}/secrets/{secret_id}/versions/{version_id}"

  # Access the secret version.
  response = client.access_secret_version(request={"name": name})

  # Decode the payload to get the secret string.
  secret_value = response.payload.data.decode("UTF-8")
  return secret_value

Con l'ID client e il client secret, ora puoi creare lo strumento e configurare l'autenticazione basata su OAuth.

L'esempio seguente utilizza un agente sviluppato da Agent Development Kit (ADK). L'autenticazione basata su OAuth è inclusa in AuthCredential e OAuth2Auth come parte della creazione dello strumento:

import os
import asyncio

from google.adk.auth.auth_schemes import OpenIdConnectWithConfig
from google.adk.auth.auth_credential import AuthCredential, AuthCredentialTypes, OAuth2Auth
from google.adk.tools.openapi_tool.openapi_spec_parser.openapi_toolset import OpenAPIToolset
from google.adk.agents.llm_agent import LlmAgent

auth_scheme = OpenIdConnectWithConfig(
  authorization_endpoint="https://your-endpoint.slack.com/oauth2/v1/authorize",
  token_endpoint="https://your-token-endpoint.slack.com/oauth2/v1/token",
  scopes=['openid', 'profile', "email"]
)

auth_credential = AuthCredential(
  auth_type=AuthCredentialTypes.OPEN_ID_CONNECT,
  oauth2=OAuth2Auth(
    client_id=access_secret(project_id='foo', secret_id='slack_oauth_client_id'),
    client_secret=access_secret(project_id='foo', secret_id='slack_oauth_client_secret'),
  )
)

# --- Slack Toolset Configuration Based On OpenAPI Specification ---
with open(os.path.join(os.path.dirname(__file__), 'spec.yaml'), 'r') as f:
   spec_content = f.read()

slack_toolset = OpenAPIToolset(
  spec_str=spec_content,
  spec_str_type='yaml',

  # ** Crucially, associate the authentication scheme and credentials with these tools. **
  # This tells the ADK that the tools require the defined OIDC/OAuth2 flow.
  auth_scheme=auth_scheme,
  auth_credential=auth_credential,
)

# Configure and create the main LLM Agent.

root_agent = LlmAgent(
   model='gemini-2.5-flash',
   name='enterprise_assistant',
   instruction='Help user integrate with Slack and post messages to Slack.',
   tools=[slack_toolset],
)

Durante il runtime, si verifica quanto segue (se utilizzi ADK in locale tramite ADK Web, i passaggi vengono automatizzati all'interno di ADK Web e del backend ADK):

  1. Accedi all'agente e l'agente decide di dover richiamare lo strumento (ad esempio, Slack).

  2. Gli strumenti programmati all'interno di ADK (con auth_scheme e auth_credential) restituiscono un oggetto authConfig al frontend (che include l'URI di reindirizzamento e l'ID client).

  3. Il frontend analizza l'oggetto authConfig e viene reindirizzato alla pagina di autorizzazione di terze parti. Dopo aver eseguito l'accesso, viene reindirizzato al frontend dell'agente e il codice di autorizzazione viene inviato al backend ADK.

  4. Il backend utilizza il codice di autorizzazione per ottenere un token di accesso per il servizio di terze parti e continua a eseguire lo strumento.

Se esegui il deployment di un agente ADK in Vertex AI Agent Engine Runtime, devi creare un frontend personalizzato e migrare il codice di autenticazione o reindirizzamento di ADK-web nel frontend per eseguire la stessa integrazione OAuth.

Accedere a servizi di terze parti utilizzando le chiavi API

L'identità dell'agente può consentire all'agente di accedere a servizi di terze parti e di agire per tuo conto utilizzando le chiavi API. Devi prima archiviare le chiavi API per l'accesso ai servizi di terze parti in Secret Manager, quindi recuperare queste credenziali da Secret Manager.

from google.adk.tools.openapi_tool.auth.auth_helpers import token_to_scheme_credential
from google.adk.tools.openapi_tool.openapi_spec_parser.openapi_toolset import OpenAPIToolset

# Access secret is defined in the code blocks above
WEATHER_DOT_COM_API_KEY = access_secret(project_id='foo', secret_id='weather_dot_com_api_key')

auth_scheme, auth_credential = token_to_scheme_credential(
  "apikey", "query", "apikey", WEATHER_DOT_COM_API_KEY
)

sample_api_toolset = OpenAPIToolset(
  spec_str="...",
  spec_str_type="yaml",
  auth_scheme=auth_scheme,
  auth_credential=auth_credential,
)

Registrare l'attività dell'agente

Se abiliti Cloud Logging, puoi visualizzare i log degli agenti e degli utenti che hanno avuto accesso a una Google Cloud risorsa.

  • Quando l'agente agisce per conto di un utente, i log mostrano sia l'identità dell'agente sia quella dell'utente.

  • Quando l'agente agisce di propria autorità, i log mostrano solo l'identità dell'agente.

Elencare gli agenti e le relative identità

Puoi visualizzare l'elenco delle identità degli agenti in Vertex AI Agent Engine utilizzando la Google Cloud console e la riga di comando.

Console

  1. Nella Google Cloud console, vai alla pagina Vertex AI Agent Engine.

    Vai a Agent Engine

    Gli agenti di cui è stato eseguito il deployment e che fanno parte del progetto selezionato vengono visualizzati nell'elenco. Puoi utilizzare il campo Filtra per filtrare l'elenco in base alla colonna specificata.

  2. Per ogni agente, l'identità dell'agente è elencata nella colonna Identità.

API REST

Puoi recuperare l'identità dell'agente quando ottieni un'istanza di Agent Engine utilizzando l'API REST.

La risposta include l'identità dell'agente nel seguente formato:

{
  ...
  spec: {
    "effectiveIdentity": "agents.global.org-ORGANIZATION_ID.system.id.goog/resources/aiplatform/projects/PROJECT_ID/locations/LOCATION/reasoningEngines/AGENT_ENGINE_ID"
  }
  ...
}

Per le istanze di Agent Engine che non utilizzano l'identità dell'agente, il campo effectiveIdentity contiene il nome del service agent o dell'account di servizio associato all'istanza di Agent Engine.

Disattivare l'accesso sensibile al contesto (CAA)

Per casi particolari, ad esempio requisiti specifici di condivisione dei token tra gli agenti, puoi disattivare la policy CAA predefinita. Questa azione è fortemente sconsigliata, in quanto rende un agente vulnerabile al furto di credenziali.

Disattiva la policy di accesso sensibile al contesto (CAA) predefinita impostando la seguente variabile di ambiente quando crei l'istanza di Agent Engine:

config={
  "env_vars": {
    "GOOGLE_API_PREVENT_AGENT_TOKEN_SHARING_FOR_GCP_SERVICES": False,
  }
}

Passaggi successivi