Codelab su Trusted Space

1. Panoramica

Vuoi migliorare la sicurezza e la privacy dei tuoi workload accelerati dalla GPU? Questo codelab ti guiderà attraverso le funzionalità di Trusted Space, un'offerta che fornisce un forte isolamento dell'operatore e il supporto degli acceleratori per i tuoi carichi di lavoro AI/ML sensibili.

Proteggere dati, modelli e chiavi preziosi è più importante che mai. Trusted Space offre una soluzione garantendo che i tuoi carichi di lavoro operino in un ambiente sicuro e attendibile a cui non ha accesso nemmeno l'operatore del carico di lavoro.

Ecco cosa offre lo spazio attendibile:

  • Privacy e sicurezza avanzate:Trusted Space fornisce un ambiente di esecuzione attendibile in cui le tue risorse sensibili (ad es. modelli, dati e chiavi di valore) rimangono protette, supportate da prove crittografiche.
  • Isolamento dell'operatore:elimina i dubbi sull'interferenza dell'operatore. Con Trusted Space, anche gli operatori dei workload non hanno accesso, il che impedisce loro di utilizzare SSH, accedere ai dati, installare software o manomettere il codice.
  • Supporto degli acceleratori:Trusted Space è progettato per funzionare perfettamente con un'ampia gamma di acceleratori hardware, tra cui GPU come H100, A100, T4 e L4. In questo modo, le tue applicazioni AI/ML critiche per le prestazioni vengono eseguite senza problemi.

Cosa imparerai a fare

  • Acquisire una comprensione delle offerte chiave di Trusted Space.
  • Scopri come eseguire il deployment e configurare un ambiente Trusted Space per proteggere le risorse preziose del tuo carico di lavoro AI/ML.

Che cosa ti serve

Protezione dei prompt di generazione di codice sensibili con Primus Company

In questo codelab, ci metteremo nei panni di Primus, un'azienda che dà la priorità alla privacy e alla sicurezza dei dati dei suoi dipendenti. Primus vuole eseguire il deployment di un modello di generazione di codice per aiutare i suoi sviluppatori con le attività di programmazione. Tuttavia, sono preoccupati di proteggere la riservatezza dei prompt inviati dai loro dipendenti, in quanto spesso contengono snippet di codice sensibili, dettagli di progetti interni o algoritmi proprietari.

Perché la Primus Company non si fida dell'operatore?

Primus Corp opera in un mercato altamente competitivo. Il loro codebase contiene proprietà intellettuale di valore, tra cui algoritmi proprietari e snippet di codice sensibili che forniscono un vantaggio competitivo. Temono la possibilità di spionaggio aziendale da parte degli operatori dei workload. Inoltre, i prompt per i dipendenti potrebbero includere parti di codice riservate "Need To Know" che Primus Corp vuole proteggere.

Per risolvere questo problema, Primus Corp utilizzerà Trusted Space per isolare il server di inferenza che esegue il modello per la generazione di codice. Ecco come funziona:

  • Crittografia dei prompt: prima di inviare un prompt al server di inferenza, ogni dipendente lo cripta utilizzando una chiave KMS gestita da Primus Corp in Google Cloud. In questo modo, solo l'ambiente Trusted Space, in cui è disponibile la chiave di decrittografia corrispondente, può decrittografarlo e accedere al prompt in testo normale. In uno scenario reale, la crittografia lato client può essere gestita dalle librerie disponibili (ad es. tink). Nell'ambito di questo codelab, utilizzeremo questa applicazione client di esempio con la crittografia envelope.
  • Isolamento dell'operatore:solo il server di inferenza, in esecuzione in un ambiente Trusted Space, avrà accesso alla chiave utilizzata per la crittografia e sarà in grado di decriptare il prompt in un ambiente attendibile. L'accesso alla chiave di crittografia sarebbe protetto dal pool di identità del workload. Grazie alle garanzie di isolamento di Trusted Space, nemmeno l'operatore del workload può accedere alla chiave utilizzata per la crittografia e ai contenuti decriptati.
  • Inferenza sicura utilizzando uno o più acceleratori: il server di inferenza verrà avviato su una Shielded VM (nell'ambito della configurazione dello spazio attendibile), il che garantirà che l'istanza del carico di lavoro non sia stata compromessa da malware o rootkit a livello di avvio o di kernel. Questo server decripta il prompt nell'ambiente Trusted Space, esegue l'inferenza utilizzando il modello di generazione del codice e restituisce il codice generato al dipendente.

2. Configura le risorse cloud

Prima di iniziare

  • Clona questo repository utilizzando il comando riportato di seguito per ottenere gli script richiesti utilizzati in questo codelab.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
  • Cambia la directory per questo codelab.
cd confidential-space/codelabs/trusted_space_codelab/scripts
  • Assicurati di aver impostato le variabili di ambiente del progetto richieste come mostrato di seguito. Per ulteriori informazioni sulla configurazione di un progetto Google Cloud, consulta questo codelab. Puoi fare riferimento a questo articolo per scoprire come recuperare l'ID progetto e in che modo differisce dal nome e dal numero del progetto.
export PRIMUS_PROJECT_ID=<GCP project id of Primus>
  • Abilita la fatturazione per i tuoi progetti.
  • Abilita l'API Confidential Computing e le seguenti API per entrambi i progetti.
gcloud services enable \
    cloudapis.googleapis.com \
    cloudresourcemanager.googleapis.com \
    cloudkms.googleapis.com \
    cloudshell.googleapis.com \
    container.googleapis.com \
    containerregistry.googleapis.com \
    iam.googleapis.com \
    confidentialcomputing.googleapis.com
  • Assegna valori alle variabili per i nomi delle risorse specificati sopra utilizzando il seguente comando. Queste variabili ti consentono di personalizzare i nomi delle risorse in base alle esigenze e di utilizzare le risorse esistenti, se sono già state create. (ad es.export PRIMUS_SERVICE_ACCOUNT='my-service-account')
  1. Puoi impostare le seguenti variabili con i nomi delle risorse cloud esistenti nel progetto Primus. Se la variabile è impostata, viene utilizzata la risorsa cloud esistente corrispondente del progetto Primus. Se la variabile non è impostata, il nome della risorsa cloud verrà generato dal nome del progetto e verrà creata una nuova risorsa cloud con quel nome. Di seguito sono riportate le variabili supportate per i nomi delle risorse:

$PRIMUS_PROJECT_REGION

Regione in cui verranno create le risorse regionali per la società Primus.

$PRIMUS_SERVICE_LOCATION

Località in cui verranno create le risorse per la società Primus.

$PRIMUS_PROJECT_ZONE

Zona in cui verranno create le risorse zonali per la società Primus.

$PRIMUS_WORKLOAD_IDENTITY_POOL

Il pool di identità del workload della società Primus per proteggere le risorse cloud.

$PRIMUS_WIP_PROVIDER

Il fornitore del pool di identità del workload della società Primus che include la condizione di autorizzazione da utilizzare per i token firmati dal servizio di verifica dell'attestazione.

$PRIMUS_SERVICEACCOUNT

Il service account della società Primus che $PRIMUS_WORKLOAD_IDENTITY_POOL utilizza per accedere alle risorse protette. In questo passaggio ha l'autorizzazione per visualizzare i dati dei clienti archiviati nel bucket $PRIMUS_INPUT_STORAGE_BUCKET.

$PRIMUS_ENC_KEY

La chiave KMS viene utilizzata per criptare i prompt forniti dai dipendenti della società Primus.

$PRIMUS_ENC_KEYRING

Il keyring KMS che verrà utilizzato per creare la chiave di crittografia $PRIMUS_ENC_KEY per la società Primus.

$PRIMUS_ENC_KEYVERSION

La versione della chiave KMS della chiave di crittografia $PRIMUS_ENC_KEY. Il valore predefinito è 1. Aggiorna questo valore se utilizzi una chiave esistente ruotata in passato e la cui versione è stata aggiornata.

$PRIMUS_ARTIFACT_REPOSITORY

Il repository di artefatti in cui verrà eseguito il push dell'immagine Docker del workload.

$PRIMUS_PROJECT_REPOSITORY_REGION

La regione del repository di artefatti che conterrà l'immagine Docker del workload pubblicata.

$WORKLOAD_VM

Nome della VM del workload.

$WORKLOAD_IMAGE_NAME

Nome dell'immagine Docker del workload.

$WORKLOAD_IMAGE_TAG

Tag dell'immagine container del carico di lavoro.

$WORKLOAD_SERVICEACCOUNT

Il service account con l'autorizzazione per accedere alla VM confidenziale che esegue il workload.

$CLIENT_VM

Nome della VM client che eseguirà l'applicazione client del server di inferenza.

$CLIENT_SERVICEACCOUNT

Il service account utilizzato da $CLIENT_VM

  • Per il progetto $PRIMUS_PROJECT_ID, avrai bisogno dei ruoli Amministratore archiviazione, Amministratore Artifact Registry, Amministratore Cloud KMS, Amministratore service account e Amministratore pool di identità del workload IAM. Puoi consultare questa guida su come concedere ruoli IAM utilizzando la console GCP.
  • Per $PRIMUS_PROJECT_ID, esegui il seguente script per impostare i nomi delle variabili rimanenti su valori basati sull'ID progetto per i nomi delle risorse.
source config_env.sh

Configurare le risorse di Primus Company

Nell'ambito di questo passaggio, configurerai le risorse cloud richieste per Primus. Esegui il seguente script per configurare le risorse per Primus. Le seguenti risorse verranno create nell'ambito dell'esecuzione dello script:

  • Chiave di crittografia ($PRIMUS_ENC_KEY) e portachiavi ($PRIMUS_ENC_KEYRING) in KMS per criptare il file di dati dei clienti della società Primus.
  • Pool di identità del workload ($PRIMUS_WORKLOAD_IDENTITY_POOL) per convalidare le rivendicazioni in base alle condizioni degli attributi configurate nel relativo fornitore.
  • Il service account ($PRIMUS_SERVICE_ACCOUNT) collegato al pool di identità del workload menzionato sopra ($PRIMUS_WORKLOAD_IDENTITY_POOL) ha accesso alla decrittografia dei dati utilizzando la chiave KMS (utilizzando il ruolo roles/cloudkms.cryptoKeyDecrypter), alla crittografia dei dati utilizzando la chiave KMS (utilizzando il ruolo roles/cloudkms.cryptoKeyEncrypter), alla lettura dei dati dal bucket Cloud Storage (utilizzando il ruolo objectViewer) e al collegamento del service account al pool di identità del workload (utilizzando roles/iam.workloadIdentityUser).
./setup_primus_resources.sh

3. Crea workload

Crea un service account del workload

Ora creerai un service account per il workload con i ruoli e le autorizzazioni richiesti. Esegui il seguente script per creare un service account del workload nel progetto Primus. Questo service account verrà utilizzato dalla VM che esegue il server di inferenza.

Questo service account del workload ($WORKLOAD_SERVICEACCOUNT) avrà i seguenti ruoli:

  • confidentialcomputing.workloadUser per ottenere un token di attestazione
  • logging.logWriter per scrivere i log in Cloud Logging.
./create_workload_service_account.sh

Crea workload

Nell'ambito di questo passaggio, creerai un'immagine Docker del workload. Il workload verrà creato dalla società Primus. Il carico di lavoro utilizzato in questo codelab è il codice Python che utilizza il modello codegemma del bucket GCS disponibile pubblicamente (di Vertex Model Garden). Il workload caricherà il modello Codegemma e avvierà il server di inferenza che gestirà le richieste di generazione di codice degli sviluppatori di Primus.

Nella richiesta di generazione del codice, Workload riceverà la DEK sottoposta a wrapping insieme a un prompt criptato. Il workload effettuerà quindi la chiamata all'API KMS per decriptare la DEK e poi decriptare il prompt utilizzando questa DEK. Le chiavi di crittografia (per DEK) sarebbero protette tramite il pool di identità per i carichi di lavoro e l'accesso sarebbe concesso ai carichi di lavoro che soddisfano le condizioni degli attributi. Queste condizioni degli attributi sono descritte in modo più dettagliato nella sezione successiva sull'autorizzazione del workload. Una volta che il server di inferenza ha il prompt decriptato, genera il codice utilizzando un modello caricato e restituisce la risposta.

Esegui il seguente script per creare un carico di lavoro in cui vengono eseguiti i seguenti passaggi:

  • Crea Artifact Registry($PRIMUS_ARTIFACT_REGISTRY) di proprietà di Primus.
  • Aggiorna il codice del workload con i nomi delle risorse richieste.
  • Crea il carico di lavoro del server di inferenza e crea Dockerfile per creare un'immagine Docker del codice del carico di lavoro. Qui trovi il Dockerfile utilizzato per questo codelab.
  • Crea e pubblica l'immagine Docker in Artifact Registry ($PRIMUS_ARTIFACT_REGISTRY) di proprietà di Primus.
  • Concedi l'autorizzazione di lettura $WORKLOAD_SERVICEACCOUNT per $PRIMUS_ARTIFACT_REGISTRY. È necessario che il container del workload esegua il pull dell'immagine Docker del workload da Artifact Registry.
./create_workload.sh

Per riferimento, ecco il metodo generate() del carico di lavoro creato e utilizzato in questo codelab (puoi trovare l'intero codice del carico di lavoro qui).

def generate():
  try:
    data = request.get_json()
    ciphertext = base64.b64decode(data["ciphertext"])
    wrapped_dek = base64.b64decode(data["wrapped_dek"])
    unwrapped_dek_response = kms_client.decrypt(
        request={"name": key_name, "ciphertext": wrapped_dek}
    )
    unwrapped_dek = unwrapped_dek_response.plaintext
    f = Fernet(unwrapped_dek)
    plaintext = f.decrypt(ciphertext)
    prompt = plaintext.decode("utf-8")
    tokens = tokenizer(prompt, return_tensors="pt")
    outputs = model.generate(**tokens, max_new_tokens=128)
    generated_code = tokenizer.decode(outputs[0])
    generated_code_bytes = generated_code.encode("utf-8")

    response = f.encrypt(generated_code_bytes)
    ciphertext_base64 = base64.b64encode(response).decode("utf-8")
    response = {"generated_code_ciphertext": ciphertext_base64}
    return jsonify(response)

  except (ValueError, TypeError, KeyError) as e:
    return jsonify({"error": str(e)}), 500

4. Autorizza ed esegui il workload

Autorizza workload

Primus vuole autorizzare i workload ad accedere alla propria chiave KMS utilizzata per la crittografia dei prompt in base agli attributi delle seguenti risorse:

  • Cosa: codice verificato
  • Dove: un ambiente sicuro
  • Chi: un operatore di cui ti fidi

Primus utilizza la federazione delle identità per i carichi di lavoro per applicare un criterio di accesso basato su questi requisiti. La federazione delle identità per i workload consente di specificare condizioni degli attributi. Queste condizioni limitano le identità che possono autenticarsi con il pool di identità del workload (WIP). Puoi aggiungere il servizio di verifica dell'attestazione al pool di identità del workload come provider del pool di identità del workload per presentare le misurazioni e applicare il criterio.

Il pool di identità del workload è già stato creato in precedenza nell'ambito del passaggio di configurazione delle risorse cloud. Ora Primus creerà un nuovo provider di pool di identità del workload OIDC. Il --attribute-condition specificato autorizza l'accesso al container del carico di lavoro. Richiede:

  • Cosa: l'ultima $WORKLOAD_IMAGE_NAME caricata nel repository $PRIMUS_ARTIFACT_REPOSITORY.
  • Dove: il Trusted Execution Environment di Confidential Space viene eseguito sull'immagine VM di Confidential Space completamente supportata.
  • Chi: service account Primus $WORKLOAD_SERVICE_ACCOUNT.
export WORKLOAD_IMAGE_DIGEST=$(gcloud artifacts docker images describe ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG  --format="value(image_summary.digest)" --project ${PRIMUS_PROJECT_ID})
gcloud iam workload-identity-pools providers create-oidc $PRIMUS_WIP_PROVIDER \
  --location="global" \
  --project="$PRIMUS_PROJECT_ID" \
  --workload-identity-pool="$PRIMUS_WORKLOAD_IDENTITY_POOL" \
  --issuer-uri="https://confidentialcomputing.googleapis.com/" \
  --allowed-audiences="https://sts.googleapis.com" \
  --attribute-mapping="google.subject='assertion.sub'" \
  --attribute-condition="assertion.swname == 'HARDENED_SHIELDED' && assertion.hwmodel == 'GCP_SHIELDED_VM' && 
assertion.submods.container.image_digest == '${WORKLOAD_IMAGE_DIGEST}' &&
 assertion.submods.container.image_reference == '${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG' && 
'$WORKLOAD_SERVICEACCOUNT@$PRIMUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"

Il comando precedente verifica che il carico di lavoro sia in esecuzione in un ambiente trusted space controllando che hwmodel sia impostato su "GCP_SHIELDED_VM" e swname su "HARDENED_SHIELDED". Inoltre, include asserzioni specifiche del workload, come image_digest e image_reference, per migliorare la sicurezza e garantire l'integrità del workload in esecuzione.

Esegui workload

Nell'ambito di questo passaggio, eseguiremo il workload nella VM Trusted Space a cui è collegato un acceleratore. Gli argomenti TEE obbligatori vengono passati utilizzando il flag dei metadati. Gli argomenti per il container del workload vengono passati utilizzando la parte "tee-cmd" del flag. Per dotare la VM del workload di una GPU Nvidia Tesla T4, utilizzeremo il flag --accelerator=type=nvidia-tesla-t4,count=1. In questo modo, una GPU verrà collegata alla VM. Dovremo anche includere tee-install-gpu-driver=true nei flag dei metadati per attivare l'installazione del driver GPU appropriato.

gcloud compute instances create ${WORKLOAD_VM} \
  --accelerator=type=nvidia-tesla-t4,count=1 \
  --machine-type=n1-standard-16 \
  --shielded-secure-boot \
  --image-project=conf-space-images-preview \
  --image=confidential-space-0-gpupreview-796705b \
  --zone=${PRIMUS_PROJECT_ZONE} \
  --maintenance-policy=TERMINATE \
  --boot-disk-size=40 \
  --scopes=cloud-platform \
  --service-account=${WORKLOAD_SERVICEACCOUNT}@${PRIMUS_PROJECT_ID}.iam.gserviceaccount.com \
  --metadata="^~^tee-image-reference=${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}~tee-install-gpu-driver=true~tee-restart-policy=Never"

Esegui query di inferenza

Dopo l'avvio del server di inferenza del workload, i dipendenti della società Primus possono inviare le richieste di generazione di codice al server di inferenza.

Nell'ambito di questo codelab, utilizzeremo il seguente script per configurare l'applicazione client che interagirà con il server di inferenza. Esegui questo script per configurare la VM client.

./setup_client.sh

I seguenti passaggi mostrano come accedere tramite SSH alla VM client ed eseguire un'applicazione client di esempio in un ambiente virtuale Python. Questa applicazione di esempio utilizza la crittografia envelope con la libreria Fernet, ma tieni presente che le librerie di crittografia specifiche possono essere adattate a diversi casi d'uso.

gcloud compute ssh ${CLIENT_VM} --zone=${PRIMUS_PROJECT_ZONE}

Esegui questi comandi per attivare l'ambiente virtuale Python nella VM client ed eseguire l'applicazione client.

source venv/bin/activate
python3 inference_client.py

L'output di questa applicazione client di esempio mostrerà le richieste di prompt di crittografia e testo normale e le relative risposte criptate e decriptate.

5. Esegui la pulizia

Qui trovi lo script che può essere utilizzato per pulire le risorse che abbiamo creato nell'ambito di questo codelab. Nell'ambito di questa pulizia, verranno eliminate le seguenti risorse:

  • Account di servizio Primus ($PRIMUS_SERVICEACCOUNT).
  • Chiave di crittografia Primus ($PRIMUS_ENC_KEY).
  • Repository elementi di Primus ($PRIMUS_ARTIFACT_REPOSITORY).
  • Pool di identità del workload Primus ($PRIMUS_WORKLOAD_IDENTITY_POOL) con il relativo fornitore.
  • Service account del workload di Primus ($WORKLOAD_SERVICEACCOUNT).
  • VM del workload ($WORKLOAD_VM) e VM client ($CLIENT_VM).
./cleanup.sh

Se hai terminato l'esplorazione, valuta la possibilità di eliminare il progetto.

  • Vai alla console di Cloud Platform.
  • Seleziona il progetto che vuoi chiudere, quindi fai clic su "Elimina" in alto: il progetto verrà pianificato per l'eliminazione