1. Panoramica
Vuoi migliorare la sicurezza e la privacy dei tuoi carichi di lavoro accelerati con GPU? Questo codelab ti guiderà attraverso le funzionalità di Trusted Space, un'offerta che fornisce un'elevata isolamento degli operatori e il supporto di acceleratori per i tuoi workload AI/ML sensibili.
La protezione di dati, modelli e chiavi di valore è più importante che mai. Trusted Space offre una soluzione garantendo che i carichi di lavoro funzionino in un ambiente sicuro e attendibile a cui non ha accesso nemmeno l'operatore del carico di lavoro.
Ecco cosa offre Trusted Space:
- Privacy e sicurezza avanzate: Trusted Space fornisce un ambiente di esecuzione attendibile in cui le risorse sensibili (ad es. modelli, dati e chiavi di valore) rimangono protette, grazie a una prova di crittografia.
- Isolamento dell'operatore:elimina i dubbi sull'interferenza dell'operatore. Con Trusted Space, nemmeno gli operatori dei carichi di lavoro hanno accesso, il che impedisce loro di eseguire SSH, accedere ai dati, installare software o manomettere il codice.
- Supporto degli acceleratori:lo spazio attendibile è progettato per funzionare perfettamente con una vasta gamma di acceleratori hardware, tra cui GPU come H100, A100, T4 e L4. In questo modo, le applicazioni AI/ML critiche per le prestazioni funzioneranno senza problemi.
Cosa imparerai a fare
- Scopri le offerte principali di Trusted Space.
- Scopri come implementare e configurare un ambiente Trusted Space per proteggere asset importanti del tuo carico di lavoro di IA/ML.
Che cosa ti serve
- Un progetto Google Cloud
- Conoscenza di base di Google Compute Engine e degli acceleratori.
- Conoscenze di base su account di servizio, gestione delle chiavi, Federazione delle identità per i carichi di lavoro e condizioni degli attributi.
- Conoscenza di base di Container e Artifact Registry
Proteggere i prompt di generazione di codice sensibili con Primus Company
In questo codelab, vestiremo i panni di Primus, un'azienda che dà la priorità alla privacy e alla sicurezza dei dati dei propri dipendenti. Primus vuole implementare un modello di generazione di codice per aiutare i propri sviluppatori a svolgere le attività di programmazione. Tuttavia, sono preoccupati di proteggere la riservatezza dei prompt inviati dai dipendenti, in quanto spesso contengono snippet di codice sensibili, dettagli di progetti interni o algoritmi proprietari.
Perché la società Primus non si fida dell'operatore?
Primus Corp opera in un mercato altamente competitivo. La base di codice contiene una preziosa proprietà intellettuale, inclusi algoritmi proprietari e snippet di codice sensibili che offrono un vantaggio competitivo. Sono preoccupati per la possibilità di spionaggio aziendale da parte degli operatori dei carichi di lavoro. Inoltre, le richieste ai dipendenti potrebbero includere parti di codice riservate "Need To Know" che Primus Corp vuole proteggere.
Per risolvere il 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 Spazio attendibile, in cui è disponibile la chiave di decrittografia corrispondente, può decriptare il messaggio 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 crittografia dell'involucro.
- Isolamento dell'operatore: solo il server di inferenza, in esecuzione in un ambiente Trusted Space, avrà accesso alla chiave utilizzata per la crittografia e potrà decriptare la richiesta in un ambiente attendibile. L'accesso alla chiave di crittografia sarebbe protetto dal pool Workload Identity. Grazie alle garanzie di isolamento di Trusted Space, anche l'operatore del carico di lavoro non può accedere alla chiave utilizzata per la crittografia e ai contenuti decriptati.
- Inferenza sicura mediante acceleratori: il server di inferenza verrà avviato su una VM protetta (nell'ambito della configurazione dello spazio attendibile) per garantire 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 all'interno dell'ambiente Trusted Space, esegue l'inferenza utilizzando il modello di generazione di codice e restituisce il codice generato al dipendente.
2. Configurare le risorse cloud
Prima di iniziare
- Clona questo repository utilizzando il comando riportato di seguito per ottenere gli script richiesti utilizzati nell'ambito di questo codelab.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
- Modifica 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 questa pagina per informazioni dettagliate su come recuperare l'ID progetto e su come si differenzia 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 API seguenti 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 i 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 anche le risorse esistenti, se sono già state create. (ad es.
export PRIMUS_SERVICE_ACCOUNT='my-service-account'
)
- Puoi impostare le seguenti variabili con i nomi delle risorse cloud esistenti nel progetto Primus. Se la variabile è impostata, verrà utilizzata la risorsa cloud esistente corrispondente del progetto Primus. Se la variabile non è impostata, il nome della risorsa cloud viene generato dal nome del progetto e viene creata una nuova risorsa cloud con quel nome. Di seguito sono riportate le variabili supportate per i nomi delle risorse:
| Regione in cui verranno create le risorse regionali per l'azienda Primus. |
| Posizione in cui verranno create le risorse per l'azienda Primus. |
| Zona in cui verranno create le risorse zonali per la società Primus. |
| Il pool di identità del workload della società Primus per proteggere le risorse cloud. |
| Il provider 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. |
| L'account di servizio della società Primus utilizzato da |
| La chiave KMS viene utilizzata per criptare le richieste fornite dai dipendenti dell'azienda Primus. |
| Il portachiavi KMS che verrà utilizzato per creare la chiave di crittografia |
| La versione della chiave KMS della chiave di crittografia |
| Il repository di elementi in cui verrà eseguito il push dell'immagine Docker del carico di lavoro. |
| La regione del repository di elementi in cui si trova l'immagine Docker del workload pubblicato. |
| Nome della VM del carico di lavoro. |
| Nome dell'immagine Docker del workload. |
| Tag dell'immagine container del carico di lavoro. |
| L'account di servizio che ha l'autorizzazione per accedere alla VM con accesso riservato che esegue il workload. |
| Nome della VM client che eseguirà l'applicazione client del server di inferenza. |
| L'account di servizio utilizzato dal |
- Per il progetto
$PRIMUS_PROJECT_ID
sono necessari i ruoli Amministratore archiviazione, Amministratore Artifact Registry, Amministratore Cloud KMS, Amministratore account di servizio e Amministratore del pool di identità del workload IAM. Puoi consultare questa guida su come concedere i ruoli IAM utilizzando la console Google Cloud. - 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 della società Primus
In questo passaggio, configurerai le risorse cloud necessarie per Primus. Esegui il seguente script per configurare le risorse per Primus. Nell'ambito dell'esecuzione dello script verranno create le seguenti risorse:
- 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 i claim in base alle condizioni degli attributi configurate nel relativo provider. - L'account di servizio (
$PRIMUS_SERVICE_ACCOUNT
) associato al pool di identità del carico di lavoro ($PRIMUS_WORKLOAD_IDENTITY_POOL
) sopra indicato ha accesso alla decrittografia dei dati utilizzando la chiave KMS (utilizzando il ruoloroles/cloudkms.cryptoKeyDecrypter
), alla crittografia dei dati utilizzando la chiave KMS (utilizzando il ruoloroles/cloudkms.cryptoKeyEncrypter
), alla lettura dei dati dal bucket di archiviazione sul cloud (utilizzando il ruoloobjectViewer
) e alla connessione dell'account di servizio al pool di identità del carico di lavoro (utilizzandoroles/iam.workloadIdentityUser
).
./setup_primus_resources.sh
3. Crea workload
Crea un account di servizio per il workload
Ora crea un account di servizio per il carico di lavoro con i ruoli e le autorizzazioni richiesti. Esegui il seguente script per creare un account di servizio per il carico di lavoro nel progetto Primus. Questo account di servizio verrà utilizzato dalla VM che esegue il server di inferenza.
Questo account di servizio del carico di lavoro ($WORKLOAD_SERVICEACCOUNT
) avrà i seguenti ruoli:
confidentialcomputing.workloadUser
per ottenere un token di attestazionelogging.logWriter
per scrivere i log in Cloud Logging.
./create_workload_service_account.sh
Crea workload
In questo passaggio, creerai un'immagine Docker del carico di lavoro. Il workload sarà creato dalla società Primus. Il carico di lavoro utilizzato in questo codelab è un codice Python che utilizza il modello codegemma del bucket GCS disponibile pubblicamente (del giardino dei modelli di Vertex). Il carico di lavoro 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à il DEK con wrapping insieme a un prompt criptato. Il carico di lavoro eseguirà quindi la chiamata all'API KMS per decriptare la DEK e poi decripterà la richiesta utilizzando questa DEK. Le chiavi di crittografia (per la DEK) verrebbero protette tramite il pool di identità per i carichi di lavoro e l'accesso verrebbe concesso ai carichi di lavoro che soddisfano le condizioni degli attributi. Queste condizioni degli attributi sono descritte in maggiore dettaglio nella sezione successiva sull'autorizzazione del carico di lavoro. 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 carico di lavoro con i nomi delle risorse richieste.
- Crea il carico di lavoro del server di inferenza e crea il Dockerfile per la creazione di un'immagine Docker del codice del carico di lavoro. Qui puoi trovare il Dockerfile utilizzato per questo codelab.
- Crea e pubblica l'immagine Docker in Artifact Registry (
$PRIMUS_ARTIFACT_REGISTRY
) di proprietà di Primus. - Concedi a
$WORKLOAD_SERVICEACCOUNT
l'autorizzazione di lettura per$PRIMUS_ARTIFACT_REGISTRY
. Questo è necessario per consentire al container del workload di estrarre l'immagine Docker del workload da Artifact Registry.
./create_workload.sh
Come riferimento, di seguito è riportato 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 carico di lavoro
Autorizza il workload
Primus vuole autorizzare i workload ad accedere alla propria chiave KMS utilizzata per la crittografia della richiesta in base agli attributi delle seguenti risorse:
- Che cosa: codice verificato
- Dove: un ambiente sicuro
- Chi: un operatore attendibile
Primus utilizza la federazione delle identità per i carichi di lavoro per applicare un criterio di accesso in base a questi requisiti. La federazione delle identità per i carichi di lavoro ti consente di specificare le 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 WIP 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 durante il passaggio di configurazione delle risorse cloud. Ora Primus creerà un nuovo provider del pool di identità del workload OIDC. Il --attribute-condition
specificato autorizza l'accesso al contenitore del carico di lavoro. Richiede:
- Che cosa:
$WORKLOAD_IMAGE_NAME
più recente caricato nel repository$PRIMUS_ARTIFACT_REPOSITORY
. - Dove: l'ambiente di esecuzione attendibile di Confidential Space è in esecuzione sull'immagine VM di Confidential Space completamente supportata.
- Chi: account di servizio 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 riportato sopra verifica che il carico di lavoro sia in esecuzione in un ambiente dello spazio attendibile controllando che hwmodel
sia impostato su "GCP_SHIELDED_VM" e swname
su "HARDENED_SHIELDED". Inoltre, include asserzioni specifiche per il carico di lavoro, come image_digest
e image_reference
, per migliorare la sicurezza e garantire l'integrità del carico di lavoro in esecuzione.
Esegui workload
Nell'ambito di questo passaggio, eseguiremo il carico di lavoro nella VM Trusted Space a cui sarà collegato un acceleratore. Gli argomenti TEE obbligatori vengono passati utilizzando il flag dei metadati. Gli argomenti per il contenitore del workload vengono passati utilizzando la parte "tee-cmd
" del flag. Per equipaggiare la VM del carico di lavoro con una GPU Nvidia Tesla T4, utilizzeremo il flag --accelerator=type=nvidia-tesla-t4,count=1
. Verrà collegata una GPU 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 aver lanciato il server di inferenza del carico di lavoro, ora 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 passaggi che seguono 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 dell'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 i seguenti 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 è riportato lo script che può essere utilizzato per ripulire le risorse che abbiamo creato nell'ambito di questo codelab. Nell'ambito di questa operazione di pulizia, verranno eliminate le seguenti risorse:
- Account di servizio Primus (
$PRIMUS_SERVICEACCOUNT
). - Chiave di crittografia Primus (
$PRIMUS_ENC_KEY
). - Repository di elementi di Primus (
$PRIMUS_ARTIFACT_REPOSITORY
). - Pool di identità del workload Primus (
$PRIMUS_WORKLOAD_IDENTITY_POOL
) con il relativo provider. - Account di servizio del workload di Primus (
$WORKLOAD_SERVICEACCOUNT
). - VM del carico di lavoro (
$WORKLOAD_VM
) e VM client ($CLIENT_VM
).
./cleanup.sh
Se hai finito di esplorare, valuta la possibilità di eliminare il progetto.
- Vai alla console della piattaforma Cloud.
- Seleziona il progetto che vuoi arrestare, quindi fai clic su "Elimina" in alto per pianificarne l'eliminazione.