Criteri di attestazione

Per contribuire a proteggere i dati da un operatore dei 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 suo TEE. Il processo si basa su VM schermate misurate in fase di avvio e di runtime esteso 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 pool di identità dei carichi di lavoro, che li confronta con i criteri aggiunti come condizioni degli attributi a un provider. Questi token sono firmati da Google e durano un'ora e vengono aggiornati automaticamente.

Crea un criterio di attestazione

Dopo aver creato un pool di Workload Identity, i criteri di attestazione vengono aggiunti come condizioni di attributo a un provider. I criteri sono scritti in un 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 Workload Identity utilizzando l'interfaccia a riga di comando gcloud, 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 impersonare un account di servizio collegato al pool di identità del carico di lavoro deve attestare i seguenti dettagli e avere i relativi valori corrispondenti ai valori dei criteri per autenticarsi:

  • Digest di immagini del container del carico di lavoro

  • L'indirizzo dell'account di servizio collegato alla VM del carico di lavoro

  • Il nome dell'immagine Confidential Space

  • Attributo di supporto dell'immagine Confidential Space di produzione

Le asserzioni disponibili per creare un criterio di attestazione sono dettagliate nella tabella seguente.

Affermazioni di attestazione

Asserzioni Tipo Descrizione
Affermazioni relative all'immagine Confidential Space
assertion.dbgstat String

Utilizzalo per verificare che l'immagine Confidential Space sia la versione di debug o di produzione.

Esistono due valori validi:

  • enable. Verifica che l'immagine di debug sia in uso.
  • disabled-since-boot. Verifica che venga utilizzata l'immagine di produzione.
  • Esempi:

    assertion.dbgstat == "enable"

    Verifica che venga utilizzata la versione di debug dell'immagine Confidential Space.

    assertion.dbgstat == "disabled-since-boot"

    Verifica che venga utilizzata la versione di produzione dell'immagine Confidential Space.

assertion.submods.confidential_space.support_attributes Array[String]

Utilizzalo per verificare la versione di sicurezza del TEE in un'immagine Confidential Space di produzione. Non è stato impostato alcun attributo di supporto per le immagini di Confidential Space di debug.

Esistono tre attributi di supporto:

  • USABLE. Un'immagine con questo attributo non è supportata e non è più monitorata per rilevare le vulnerabilità. Utilizzo a proprio rischio.
  • STABLE. Questa versione dell'immagine è supportata e monitorata per rilevare le vulnerabilità. Anche un'immagine STABLE è USABLE.
  • LATEST. Questa è la versione più recente dell'immagine ed è supportata. Anche l'immagine LATEST è STABLE e USABLE.

Esempio:

"LATEST" in assertion.submods.confidential_space.support_attributes

Verifica che venga utilizzata la versione più recente dell'immagine Confidential Space.

assertion.swname String

Utilizzato per verificare il software in esecuzione sull'entità attestante. Il valore è sempre CONFIDENTIAL_SPACE.

Esempio:

assertion.swname == "CONFIDENTIAL_SPACE"
assertion.swversion Array[String]

Utilizza questa opzione per verificare la versione software dell'immagine Confidential Space. Consigliamo di utilizzare assertion.submods.confidential_space.support_attributes per scegliere come target l'ultima versione di un'immagine, anziché una versione specifica.

Esempio:

int(assertion.swversion[0]) == 230103
Affermazioni container di carichi di lavoro
assertion.submods.container.cmd_override Array[String]

Utilizza questa opzione per verificare i comandi e i parametri CMD utilizzati nell'immagine del carico di lavoro.

Esempi:

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

Verifica che il CMD dell'immagine del carico di lavoro non sia stato sovrascritto.

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

Verifica che "programma" sia l'unico contenuto negli override CMD.

assertion.submods.container.env JSON object

Utilizzato per verificare le variabili di ambiente e i relativi valori sono stati trasmessi esplicitamente al container.

Esempio:

{"example-env-1": "value-1", "example-env-2": "value-2"}

Verifica che la variabile di ambiente example-env-1 sia impostata su value-1 e che example-env-2 sia impostato su value-2.

assertion.submods.container.env_override JSON object

Utilizzalo per verificare se l'utente ha sovrascritto le variabili di ambiente nel container.

Esempi:

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

Verifica che l'utente non abbia sostituito la variabile di ambiente di esempio.

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

Verifica che l'utente non abbia sovrascritto alcuna variabile di ambiente.

assertion.submods.container.image_digest String

Utilizza questa opzione per verificare il digest delle immagini del container del carico di lavoro. La specifica di questa condizione consente a più parti di concordare un carico di lavoro autorizzato autorizzato ad accedere ai propri dati.

Esempio:

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

Utilizzato per verificare l'ID immagine del container del carico di lavoro.

Esempio:

assertion.submods.container.image_id == "sha256:652a44b0e911271ba07cf2915cd700fdfa50abd62a98f87a57fdebc59843d93f"
assertion.submods.container.image_reference String

Utilizza questa opzione per verificare la posizione del container del carico di lavoro in esecuzione in Confidential Space.

Esempio:

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

Utilizzalo per verificare il criterio di riavvio di Avvio applicazioni quando il carico di lavoro viene arrestato. I valori validi sono Always, OnFailure e Never. Il valore predefinito è Never.

Esempio:

assertion.submods.container.restart_policy == "Never"
Affermazioni VM
assertion.google_service_accounts Array[String]

Utilizzalo per verificare che un account di servizio specificato sia collegato alla VM che esegue il carico di lavoro o sia stato elencato utilizzando tee-impersonate-service-account nei metadati della VM.

Esempio:

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

Da utilizzare per verificare la protezione hardware sottostante e le specifiche del sistema operativo della piattaforma Confidential Computing. L'unica piattaforma supportata è GCP_AMD_SEV.

Esempio:

assertion.hwmodel == "GCP_AMD_SEV"
assertion.submods.gce.instance_id String

Utilizzalo per verificare l'ID istanza VM.

Esempio:

assertion.submods.gce.instance_id == "0000000000000000000"
assertion.submods.gce.instance_name String

Utilizzalo per verificare il nome dell'istanza VM.

Esempio:

assertion.submods.gce.instance_name == "workload-vm"
assertion.submods.gce.project_id String

Utilizzalo per verificare che la VM esegua un progetto Google Cloud}} con l'ID progetto specificato.

Esempio:

assertion.submods.gce.project_id == "project-id"
assertion.submods.gce.project_number String

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

Esempio:

assertion.submods.gce.project_number == "00000000000"
assertion.submods.gce.zone String

Utilizza questo comando per verificare che la VM sia in esecuzione nella zona specificata.

Esempio:

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

Risoluzione dei problemi relativi ai criteri

Se all'account di servizio associato alla VM Confidential Space è stato concesso il ruolo logging.logWriter, puoi risolvere gli errori visualizzando i log della VM:

  1. Vai a Logging nel progetto dell'operatore del carico di lavoro nella console Google Cloud.

    Vai a Logging

  2. Fai clic su Modifica ora per impostare le ore di inizio e di fine dei log da visualizzare.

  3. Filtra i filtri in base ai seguenti campi, se disponibili:

    • Tipo di risorsa: istanza VM

    • ID istanza: l'ID istanza della VM

    • Nome log: Confidential-space-Avvio app

  4. Leggi il messaggio di errore per scoprire di che problema si tratta. Una risorsa potrebbe non essere stata configurata correttamente oppure le condizioni degli attributi nei provider di pool di identità del carico di lavoro potrebbero non corrispondere alle dichiarazioni effettuate dal carico di lavoro Confidential Space.