Crea e concedi l'accesso alle risorse riservate


I collaboratori dei dati devono configurare le seguenti risorse per consentire a un workload di accedere ai dati riservati:

Inoltre, i collaboratori dei dati devono scegliere dove archiviare i risultati del carico di lavoro di Confidential Space e se i dati presentati sono unici o condivisi. Ad esempio, potresti generare lo stesso risultato in più bucket Cloud Storage appartenenti a ogni collaboratore dei dati.

Memorizzare i dati

Puoi utilizzare qualsiasi servizio Google Cloud che memorizza i dati per ospitare i tuoi dati confidenziali. Ad esempio, puoi utilizzare uno dei seguenti servizi:

Devi assicurarti che questi dati siano criptati at-rest, sia utilizzando funzionalità integrate sia con strumenti come Cloud Key Management Service (Cloud KMS).

Creare un account di servizio per decriptare i dati riservati

Rendi disponibili i tuoi dati riservati ai carichi di lavoro di Confidential Space e riduci l'esposizione umana a questi dati tramite gli account di servizio.

Ad esempio, potresti criptare file riservati in Cloud Storage con Cloud KMS e poi creare un service account che abbia l'autorizzazione per accedere a questi dati e alla chiave per decriptarli.

Successivamente, collega l'account di servizio a un WIP. Un carico di lavoro Confidential Space autorizzato basato su un altro progetto può quindi utilizzare questo WIP per rappresentare l'account di servizio che decripta i dati, recuperare i dati decriptati ed elaborarli.

Poiché gli account di servizio vengono utilizzati sia per decriptare i dati riservati sia per elaborarli, la visibilità dei dati riservati è limitata ai relativi proprietari. Poiché il workload opera in una Confidential VM, la crittografia della memoria basata sull'hardware garantisce la riservatezza dei dati durante l'utilizzo. SSH è disattivato anche sulle VM dei carichi di lavoro che utilizzano l'immagine Confidential Space di produzione, il che significa che nessuno può accedere alla VM mentre è in esecuzione.

Per un esempio, consulta Crea il tuo primo ambiente Confidential Space.

Crea un WIP e un fornitore per la convalida dell'attestazione

Per proteggere i dati da un operatore di carichi di lavoro non attendibile, Confidential Space implementa un processo di attestazione che rileva le modifiche a un'immagine del carico di lavoro o al relativo TEE. Il processo si basa sull'avvio con misurazioni e sulle misurazioni estese in fase di runtime della VM schermata e acquisisce le misurazioni della sequenza di avvio in un registro protetto e di sola estensione nel dispositivo Virtual Trusted Platform Module (vTPM).

Il servizio di attestazione Confidential Space genera token OpenID Connect (OIDC) che includono queste attestazioni vTPM in un formato che può essere convalidato da un WIP, che le confronta con i criteri aggiunti come condizioni degli attributi a un provider. Questi token sono firmati da Google, durano un'ora e vengono aggiornati automaticamente.

Se il WIP autorizza il carico di lavoro, quest'ultimo può quindi rappresentare account di servizio nel progetto per decriptare e recuperare dati riservati.

Per configurare un WIP e un fornitore, completa le seguenti istruzioni:

  1. Crea il WIP.

  2. Collega il tuo account di servizio di decriptazione al WIP con il ruolo iam.workloadIdentityUser.

  3. Crea un provider OIDC con i seguenti dettagli:

    • Un URI emittente di https://confidentialcomputing.googleapis.com/.

    • Un segmento di pubblico consentito di https://sts.googleapis.com.

    • Una mappatura degli attributi del fornitore di google.subject, con un valore di assertion.sub.

    • Condizioni degli attributi utilizzate per convalidare le attestazioni del carico di lavoro. Consulta la sezione Creare un criterio di attestazione per le opzioni disponibili.

Crea una policy di attestazione

Quando crei un WIP, aggiungi le condizioni degli attributi, ovvero le condizioni che un carico di lavoro deve soddisfare per poter accedere ai tuoi dati. Per Confidential Space, queste condizioni degli attributi costituiscono i criteri di attestazione.

I criteri sono scritti in Common Expression Language (CEL) e sono costituiti da una serie di asserzioni che possono essere concatenate con l'operatore &&.

Ecco un esempio di aggiunta di un provider a un pool di identità del workload utilizzando gcloud CLI, insieme all'opzione attribute-condition che definisce i criteri:

gcloud iam workload-identity-pools providers create-oidc attestation-verifier \
    --location=global \
    --workload-identity-pool=user-pool-name \
    --issuer-uri="https://confidentialcomputing.googleapis.com/" \
    --allowed-audiences="https://sts.googleapis.com" \
    --attribute-mapping="google.subject=assertion.sub" \
    --attribute-condition="assertion.submods.container.image_digest =='sha256:837ccb607e312b170fac7383d7ccfd61fa5072793f19a25e75fbacb56539b86b' \
&& 'service-account@my-project.iam.gserviceaccount.com' in assertion.google_service_accounts \
&& assertion.swname == 'CONFIDENTIAL_SPACE' \
&& 'STABLE' in assertion.submods.confidential_space.support_attributes"

In questo esempio, un'identità esterna che tenta di rappresentare un service account connesso al pool di identità per i workload deve attestare e corrispondere ai seguenti dettagli:

  • Il digest dell'immagine del container del carico di lavoro

  • L'indirizzo del account di servizio collegato alla VM del workload

  • CONFIDENTIAL_SPACE è il software in esecuzione sulla VM, con tutte le sue garanzie di sicurezza integrate.

  • L'attributo di supporto dell'immagine Confidential Space di produzione

Asserzioni di attestazione

Le asserzioni disponibili per creare una policy di attestazione sono descritte in dettaglio nella tabella seguente. Possono convalidare le asserzioni fatte dall'immagine Confidential Space, dal container del workload e dalla VM.

Affermazioni relative alle immagini

Asserzione Tipo Descrizione

assertion.dbgstat

Interazione con:

Stringa definita

Verifica che l'immagine di Confidential Space sia la versione di debug o di produzione.

I valori validi sono:

  • enable: verifica che venga utilizzata l'immagine di debug.
  • disabled-since-boot: verifica che venga utilizzata l'immagine di produzione.
Esempi

Il seguente codice verifica che venga utilizzata la versione di debug dell'immagine Confidential Space:

assertion.dbgstat == "enable"

Il seguente codice verifica che venga utilizzata la versione di produzione dell'immagine Confidential Space:

assertion.dbgstat == "disabled-since-boot"
assertion.submods.confidential_space.support_attributes Array di stringhe

Verifica che la versione di sicurezza del TEE sia un'immagine Confidential Space di produzione. Le immagini di Confidential Space per il debug non hanno l'attributo di supporto impostato.

Esistono tre attributi di supporto:

  • LATEST: Questa è l'ultima versione dell'immagine ed è supportata. L'immagine LATEST è anche STABLE e USABLE.
  • STABLE: Questa versione dell'immagine è supportata e monitorata per le vulnerabilità. Un'immagine STABLE è anche USABLE.
  • USABLE: Un'immagine con solo questo attributo non è più supportata e non viene più monitorata per rilevare vulnerabilità. Utilizzalo a tuo rischio.
Esempio

Il seguente codice verifica che venga utilizzata una versione stabile dell'immagine di Confidential Space:

"STABLE" in assertion.submods.confidential_space.support_attributes
assertion.swname Stringa definita

Verifica il software in esecuzione sull'entità di attestazione. Il valore è sempre CONFIDENTIAL_SPACE.

Esempio
assertion.swname == "CONFIDENTIAL_SPACE"
assertion.swversion Array di stringhe

Verifica la versione software dell'immagine Confidential Space. Ti consigliamo di utilizzare assertion.submods.confidential_space.support_attributes per scegliere come target l'ultima versione di un'immagine.

Esempio
int(assertion.swversion[0]) == 230103

Assert di contenitore

Asserzione Tipo Descrizione

assertion.submods.container.cmd_override

Interazione con:

Array di stringhe

Verifica i comandi e parametri CMD utilizzati nell'immagine del workload.

Esempi

Il seguente codice verifica che il CMD dell'immagine del workload non sia stato sovrascritto:

size(assertion.submods.container.cmd_override) == 0

Il seguente codice verifica che program sia l'unico contenuto negli override CMD:

assertion.submods.container.cmd_override == ['program']

assertion.submods.container.env

Interazione con:

Oggetto JSON

Verifica che le variabili di ambiente e i relativi valori siano stati passati esplicitamente al container.

Esempio

Il seguente codice verifica che la variabile di ambiente example-env-1 sia impostata su value-1 e example-env-2 sia impostata su value-2.

assertion.submods.container.env == {"example-env-1": "value-1", "example-env-2": "value-2"}

assertion.submods.container.env_override

Interazione con:

Stringa

Verifica se l'operatore del carico di lavoro ha sovrascritto le variabili di ambiente nel container.

Esempi

Il seguente codice verifica che l'operatore del workload non abbia eseguito l'override della variabile di ambiente example:

!has(assertion.submods.container.env_override.example)

Il codice seguente verifica che l'operatore del carico di lavoro non abbia sovrascritto alcuna variabile di ambiente:

size(assertion.submods.container.env_override) == 0
assertion.submods.container.image_digest Stringa

Verifica il digest dell'immagine del container del carico di lavoro. La specifica di questa condizione consente a più parti di concordare un carico di lavoro autorizzato che può accedere ai loro dati.

Esempio
assertion.submods.container.image_digest == "sha256:837ccb607e312b170fac7383d7ccfd61fa5072793f19a25e75fbacb56539b86b"
assertion.submods.container.image_id Stringa

Verifica l'ID immagine del container del carico di lavoro.

Esempio
assertion.submods.container.image_id == "sha256:652a44b0e911271ba07cf2915cd700fdfa50abd62a98f87a57fdebc59843d93f"

assertion.submods.container.image_reference

Interazione con:

Stringa

Verifica la posizione del container del workload in esecuzione sopra l'immagine di Confidential Space.

Esempio
assertion.submods.container.image_reference == "us-docker.pkg.dev/PROJECT_ID/WORKLOAD_CONTAINER:latest"

assertion.submods.container.image_signatures

Interazione con:

Oggetto JSON

Verifica che l'immagine abbia una determinata firma o sia firmata da una chiave pubblica e un algoritmo di firma. La specifica di questa condizione consente a più parti di concordare un carico di lavoro autorizzato che può accedere ai loro dati.

L'asserzione può includere i seguenti elementi:

  • key_id: L'impronta esadecimale della chiave pubblica. Per ottenere l'impronta, puoi eseguire il comando seguente:

    openssl pkey -pubin -in public_key.pem -outform DER | openssl sha256

    Dove public_key.pem è la tua chiave pubblica in formato PEM.

  • signature: La firma su un payload associato al contenitore firmato e che segue il formato di firma semplice.
  • signature_algorithm: l'algoritmo utilizzato per firmare la chiave. Il valore sarà uno dei seguenti:

    • RSASSA_PSS_SHA256 (RSASSA-PSS con un digest SHA-256)
    • RSASSA_PKCS1V15_SHA256 (RSASSA-PKCS1 v1_5 con un digest SHA-256)
    • ECDSA_P256_SHA256 (ECDSA sulla curva P-256 con un digest SHA-256)
Esempio
assertion.swname == 'CONFIDENTIAL_SPACE' && ['ECDSA_P256_SHA256:PUBLIC_KEY_FINGERPRINT'].exists(fingerprint, fingerprint in assertion.submods.container.image_signatures.map(sig, sig.signature_algorithm+':'+sig.key_id)) && 'serviceaccount.iam.gserviceaccount.com' in assertion.google_service_accounts"

assertion.submods.container.restart_policy

Interazione con:

Stringa definita

Verifica la policy di riavvio del launcher del container quando il workload si arresta.

I valori validi sono:

  • Never (valore predefinito)
  • Always
  • OnFailure
Esempio
assertion.submods.container.restart_policy == "Never"

Asserzioni VM

Asserzione Tipo Descrizione

assertion.google_service_accounts

Interazione con:

Array di stringhe

Verifica che un account di servizio specificato sia connesso alla VM che esegue il workload o sia stato elencato utilizzando tee-impersonate-service-accounts nei metadati della VM.

Esempio
workload-service-account@my-project.iam.gserviceaccount.com in assertion.google_service_accounts
assertion.hwmodel Stringa

Verifica la tecnologia Confidential Computing sottostante. Le piattaforme supportate sono le seguenti:

  • GCP_AMD_SEV
  • INTEL_TDX
Esempio
assertion.hwmodel == "GCP_AMD_SEV"

assertion.submods.confidential_space.monitoring_enabled

Interazione con:

Booleano

Verifica lo stato di monitoraggio dell'entità di attestazione.

Esempio
assertion.submods.confidential_space.monitoring_enabled.memory == true
assertion.submods.gce.instance_id Stringa

Verifica l'ID istanza VM.

Esempio
assertion.submods.gce.instance_id == "0000000000000000000"
assertion.submods.gce.instance_name Stringa

Verifica il nome dell'istanza VM.

Esempio
assertion.submods.gce.instance_name == "workload-vm"
assertion.submods.gce.project_id Stringa

Verifica che la VM esegua un Google Cloud progetto con l' ID progetto specificato.

Esempio
assertion.submods.gce.project_id == "project-id"
assertion.submods.gce.project_number Stringa

Verifica che la VM sia in esecuzione in un Google Cloud progetto con il numero di progetto specificato.

Esempio
assertion.submods.gce.project_number == "00000000000"

assertion.submods.gce.zone

Interazione con:

  • Operatore del carico di lavoro: il valore --zone .
Stringa

Verifica che la VM sia in esecuzione nella zona specificata.

Esempio
assertion.submods.gce.zone == "us-central1-a"