Assertions d'attestation

Pour en savoir plus sur l'utilisation des assertions d'attestation, consultez Créer une règle d'attestation.

Les assertions disponibles pour créer une règle d'attestation sont détaillées dans le tableau suivant. Les règles peuvent valider les assertions faites par l'image Confidential Space, le conteneur de charge de travail et l'instance de VM.

Affirmations concernant les images

Assertion Type Description

assertion.dbgstat

Interagit avec :

Enumeration

Vérifie que l'image Confidential Space est la version de débogage ou de production.

Les valeurs valides sont les suivantes :

  • enable : vérifiez que l'image de débogage est utilisée.
  • disabled-since-boot : vérifiez que l'image de production est utilisée.
Exemples

Le code suivant vérifie que la version de débogage de l'image Confidential Space est utilisée :

assertion.dbgstat == "enable"

Le code suivant vérifie que la version de production de l'image Confidential Space est utilisée :

assertion.dbgstat == "disabled-since-boot"
assertion.submods.confidential_space.support_attributes Tableau de chaînes

Vérifie que la version de sécurité du TEE est une image Confidential Space de production. Aucun attribut de compatibilité n'est défini pour les images Confidential Space de débogage.

Le tableau suivant décrit les attributs de compatibilité des images de production Confidential Space.

Attribut "Assistance" Description

LATEST

Les images LATEST possèdent également les attributs de prise en charge suivants :

  • STABLE
  • USABLE

Durée de vie des images : environ un mois. L'attribut LATEST est ensuite supprimé.

Il s'agit de la dernière version de l'image Confidential Space. Elle est compatible et surveillée pour détecter les failles.

Pour les charges de travail de longue durée, nous vous recommandons de ne pas spécifier LATEST dans votre règle d'attestation. En effet, l'image Confidential Space peut être mise à jour pendant l'exécution de votre charge de travail, ce qui fait que l'image Confidential Space que vous utilisez n'est plus LATEST et que votre charge de travail échoue à l'attestation lors de la prochaine actualisation du jeton Confidential Space par défaut.

STABLE

Les images STABLE possèdent également les attributs de prise en charge suivants :

  • USABLE

Durée de vie des images : environ six mois. À partir du 1er avril 2027, l'attribut de prise en charge STABLE sera supprimé à l'expiration de la durée de vie de l'image.

Les images avec l'attribut STABLE sont compatibles et surveillées pour détecter les failles pendant six mois. Nous vous recommandons de rédiger une règle d'attestation basée sur l'attribut STABLE.

Dans de rares cas, l'attribut STABLE peut être supprimé pendant la période d'assistance normale de six mois, par exemple en cas de découverte de failles critiques.

USABLE

Les images ne comportant que l'attribut USABLE peuvent toujours être utilisées, mais sont considérées comme obsolètes. Les images obsolètes ne sont pas acceptées et datent de plus de six mois. Vous les utilisez à vos propres risques.

Les images USABLE ont une propriété deprecated.deprecated. Sa valeur correspond au code temporel indiquant la date à laquelle l'image devrait être obsolète. Les propriétés d'une image peuvent être consultées avec la commande gcloud compute images describe ou avec la méthode REST images.get. Exemple :

gcloud compute images describe confidential-space-240800 \
    --format=json \
    --project=confidential-space-images
EXPERIMENTAL

Les images ne comportant que cet attribut utilisent les fonctionnalités d'aperçu. Les images EXPERIMENTAL sont destinées à des fins de test uniquement et ne doivent jamais être utilisées en production.

Une image EXPERIMENTAL ne comporte jamais les attributs LATEST, STABLE ni USABLE.

Nous vous recommandons de toujours mettre à jour votre image Confidential Space. Pour savoir comment mettre à jour votre image Confidential Space, consultez Mettre à jour les images Confidential Space.

Exemple

Le code suivant vérifie qu'une version stable de l'image Confidential Space est utilisée :

"STABLE" in assertion.submods.confidential_space.support_attributes
assertion.swname Enumeration

Vérifie le logiciel exécuté sur l'entité de test. La valeur est toujours CONFIDENTIAL_SPACE.

Exemple
assertion.swname == "CONFIDENTIAL_SPACE"
assertion.swversion Tableau de chaînes

Vérifie la version logicielle de l'image Confidential Space. Nous vous recommandons d'utiliser assertion.submods.confidential_space.support_attributes pour cibler la dernière version d'une image.

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

Assertions de conteneur

Assertion Type Description

assertion.submods.container.cmd_override

Interagit avec :

  • Auteur de la charge de travail : règle de lancement allow_cmd_override.
  • Opérateur de charge de travail : variable de métadonnées tee-cmd.
Tableau de chaînes

Vérifie les commandes et les paramètres CMD utilisés dans l'image de charge de travail.

Exemples

Le code suivant vérifie que l'objet CMD de l'image de charge de travail n'a pas été écrasé :

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

Le code suivant vérifie que program est le seul contenu dans les remplacements CMD :

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

assertion.submods.container.env

Interagit avec :

Objet JSON

Vérifie que les variables d'environnement et leurs valeurs ont été explicitement transmises au conteneur.

Exemple

Le code suivant vérifie que la variable d'environnement example-env-1 est définie sur value-1 et que example-env-2 est définie sur value-2.

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

assertion.submods.container.env_override

Interagit avec :

Chaîne

Vérifie si l'opérateur de charge de travail a écrasé les variables d'environnement dans le conteneur.

Exemples

Le code suivant vérifie que l'opérateur de charge de travail n'a pas remplacé la variable d'environnement example :

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

Le code suivant vérifie que l'opérateur de charge de travail n'a écrasé aucune variable d'environnement :

size(assertion.submods.container.env_override) == 0
assertion.submods.container.image_digest Chaîne

Vérifie le condensé de l'image du conteneur de la charge de travail. Spécifier cette condition permet à plusieurs parties d'accepter une charge de travail autorisée et autorisée à accéder à leurs données.

Exemple
assertion.submods.container.image_digest == "sha256:837ccb607e312b170fac7383d7ccfd61fa5072793f19a25e75fbacb56539b86b"
assertion.submods.container.image_id Chaîne

Vérifie l'ID d'image du conteneur de charge de travail.

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

assertion.submods.container.image_reference

Interagit avec :

Chaîne

Vérifie l'emplacement du conteneur de charge de travail s'exécutant sur l'image Confidential Space.

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

assertion.submods.container.image_signatures

Interagit avec :

Objet JSON

Vérifie que l'image possède une certaine signature ou qu'elle est signée par une clé publique et un algorithme de signature. Spécifier cette condition permet à plusieurs parties d'accepter une charge de travail autorisée et autorisée à accéder à leurs données.

L'assertion peut inclure les éléments suivants :

  • key_id : empreinte hexadécimale de la clé publique. Pour obtenir l'empreinte, vous pouvez exécuter la commande suivante :

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

    Où public_key.pem est votre clé publique au format PEM.

  • signature : signature d'une charge utile associée au conteneur signé et qui suit le format Simple Signing.
  • signature_algorithm : algorithme utilisé pour signer la clé. Choisissez l'une des options suivantes :

    • RSASSA_PSS_SHA256 (RSASSA-PSS avec un condensé SHA-256)
    • RSASSA_PKCS1V15_SHA256 (RSASSA-PKCS1 v1_5 avec un condensé SHA-256)
    • ECDSA_P256_SHA256 (ECDSA sur la courbe P-256 avec un condensé SHA-256)
Exemple
['ECDSA_P256_SHA256:PUBLIC_KEY_FINGERPRINT'].exists(fingerprint, fingerprint in assertion.submods.container.image_signatures.map(sig, sig.signature_algorithm+':'+sig.key_id))

assertion.submods.container.restart_policy

Interagit avec :

Enumeration

Vérifie la règle de redémarrage du lanceur de conteneurs lorsque la charge de travail s'arrête.

Les valeurs valides sont les suivantes :

  • Never (par défaut)
  • Always
  • OnFailure
Exemple
assertion.submods.container.restart_policy == "Never"

Assertions de VM

Assertion Type Description

assertion.google_service_accounts

Interagit avec :

Tableau de chaînes

Vérifie qu'un compte de service spécifié est associé à la VM qui exécute la charge de travail ou a été répertorié à l'aide de tee-impersonate-service-accounts dans les métadonnées de la VM.

Exemple
workload-service-account@my-project.iam.gserviceaccount.com in assertion.google_service_accounts
assertion.hwmodel Chaîne

Vérifie la technologie d'informatique confidentielle sous-jacente. Les plates-formes compatibles sont les suivantes :

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

assertion.submods.confidential_space.monitoring_enabled

Interagit avec :

Booléen

Vérifie l'état de la surveillance sur l'entité d'attestation.

Exemple
assertion.submods.confidential_space.monitoring_enabled.memory == true
assertion.submods.gce.instance_id Chaîne

Vérifie l'ID de l'instance de VM.

Exemple
assertion.submods.gce.instance_id == "0000000000000000000"
assertion.submods.gce.instance_name Chaîne

Vérifie le nom de l'instance de VM.

Exemple
assertion.submods.gce.instance_name == "workload-vm"
assertion.submods.gce.project_id Chaîne

Permet de vérifier que la VM exécute un projet Google Cloud avec l'ID du projet spécifié.

Exemple
assertion.submods.gce.project_id == "project-id"
assertion.submods.gce.project_number Chaîne

Vérifie que la VM est en cours d'exécution dans un projet Google Cloud avec le numéro de projet spécifié.

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

assertion.submods.gce.zone

Interagit avec :

  • Opérateur de charge de travail : valeur --zone.
Chaîne

Vérifie que la VM est en cours d'exécution dans la zone spécifiée.

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

assertion.submods.nvidia_gpu.cc_feature

Interagit avec :

Enumeration

Vérifie les fonctionnalités d'informatique confidentielle prises en charge par un GPU NVIDIA. Seul le mode Single GPU Passthrough (SPT) est accepté dans Confidential Space. La valeur est donc toujours SPT.

Pour en savoir plus sur la compatibilité avec NVIDIA Confidential Computing, consultez Solutions de Trusted Computing NVIDIA (PDF).

Exemple
assertion.submods.nvidia_gpu.cc_feature == "SPT"

assertion.submods.nvidia_gpu.cc_mode

Interagit avec :

Enumeration

Vérifie l'état du pilote informatique confidentielle de NVIDIA. Les valeurs valides sont les suivantes :

  • OFF : aucune des fonctionnalités NVIDIA Confidential Computing n'est active.
  • ON : le matériel, le micrologiciel et le logiciel NVIDIA H100 ont entièrement activé les fonctionnalités de confidential computing.
  • DEVTOOLS : le GPU est dans un mode d'informatique confidentielle partielle qui correspond aux workflows du mode ON, mais désactive les protections de sécurité.
Exemple
assertion.submods.nvidia_gpu.cc_mode == "ON"

assertion.submods.nvidia_gpu.gpus

Interagit avec :

Tableau d'objets

Valide les revendications pour chaque GPU NVIDIA attesté. Confidential Space n'accepte qu'une seule revendication de GPU.

Un objet gpus ressemble à ce qui suit :

{
  "hwmodel": "GCP_NVIDIA_H100",
  "ueid": "490457405999046854973671575630853621547794591064",
  "l4_serial_number": "1216669666319372030078",
  "driver_version": "570.00",
  "vbios_version": "96.00.9F.00.01"
}
Exemples

Le code suivant vérifie que le premier modèle de matériel GPU est un NVIDIA H100 exécuté sur Google Cloud :

assertion.submods.nvidia_gpu.gpus[0].hwmodel == "GCP_NVIDIA_H100"

Le code suivant vérifie que la revendication d'attestation comporte des revendications liées au GPU :

has(assertion.submods.nvidia_gpu.gpus)