Les collaborateurs doivent configurer les ressources suivantes pour que leurs données confidentielles soient accessibles par une charge de travail :
Données chiffrées, stockées dans Google Cloud.
Un pool d'identités de charge de travail (WIP) pour autoriser la charge de travail. Une fois qu'une charge de travail a été autorisée par un WIP, elle peut accéder aux données confidentielles des collaborateurs et les exploiter.
De plus, les collaborateurs de données doivent choisir l'emplacement de stockage des résultats de la charge de travail Confidential Space, et si ces résultats sont uniques pour chaque collaborateur ou partagés. Vous pouvez, par exemple, choisir de générer le même résultat dans plusieurs buckets Cloud Storage appartenant à chaque collaborateur de données.
Stocker vos données chiffrées
Vous pouvez utiliser n'importe quel service Google Cloud qui stocke des données pour héberger vos données confidentielles. Par exemple, vous pouvez utiliser l'un des services suivants :
Vous devez vous assurer que ces données sont chiffrées au repos, que ce soit à l'aide de fonctionnalités intégrées ou d'un service tel que Cloud Key Management Service (Cloud KMS).
Autoriser la charge de travail avec un pool d'identités de charge de travail
Un WIP est le mécanisme utilisé par Confidential Space pour permettre à une charge de travail externe d'accéder à vos données confidentielles et de les utiliser en tant qu'identité fédérée. Une identité fédérée est une entité externe traitée comme s'il s'agissait d'un compte principal dans votre propre projet. Vous pouvez ainsi lui attribuer des rôles IAM pour lui donner accès à des ressources spécifiques, ou emprunter l'identité de comptes de service pour faire de même.
En tant que collaborateur de données, vous configurez un fournisseur dans un WIP qui définit les règles pour les entités s'authentifiant en tant qu'identité fédérée. Pour Confidential Space, vous devez définir les éléments suivants dans un fournisseur :
Un service d'attestation : ce service vérifie que la charge de travail est une instance Confidential VM et renvoie un jeton d'attestation OpenID Connect (OIDC) au fournisseur WIP. L'opérateur de charge de travail définit le service d'attestation utilisé, qui doit correspondre au service d'attestation ajouté au fournisseur WIP pour que l'accès soit accordé.
Mappages d'attributs : attributs des jetons d'accès Security Token Service qui sont mappés aux assertions effectuées par l'entité d'authentification (dans ce cas, l'instance de VM qui exécute la charge de travail). Les assertions sont effectuées par l'instance de VM elle-même, l'image Confidential Space et le conteneur de charge de travail, puis transmises au fournisseur WIP par la charge de travail. Ces attributs sont utilisés pour des éléments tels que les pistes d'audit dans Cloud Logging et pour accorder des rôles via IAM sur la base d'assertions d'entités d'authentification, telles que les condensés de conteneurs d'images de charge de travail. En savoir plus sur les mappages d'attributs
Une règle d'attestation : série de conditions que les entités d'authentification doivent remplir pour obtenir l'accès, en fonction des assertions qu'elles effectuent.
Lorsqu'une charge de travail démarre, le lanceur Confidential Space envoie son rapport d'attestation à un service d'attestation défini par l'opérateur de la charge de travail, qui vérifie l'instance Confidential VM, puis renvoie un jeton d'attestation OIDC. Ce jeton dure une heure et est automatiquement actualisé.
Le jeton d'attestation est ensuite transmis au fournisseur WIP par la charge de travail, et le fournisseur l'utilise pour vérifier que les assertions respectent la règle d'attestation définie dans le fournisseur. Si c'est le cas, la charge de travail est autorisée à accéder aux ressources confidentielles.
Accès aux charges de travail externes
Avant de configurer un pool d'identité de charge de travail et un fournisseur, vous devez choisir comment la charge de travail va accéder à vos ressources : accès direct aux ressources ou emprunt d'identité d'un compte de service.
Accès direct aux ressources
Nous recommandons la méthode d'accès direct aux ressources pour les charges de travail.
Cette méthode implique de configurer une identité fédérée dans un fournisseur de pool d'identités de charge de travail associé aux assertions d'une entité d'authentification. De cette façon, une charge de travail peut être autorisée à accéder aux ressources directement via des liaisons IAM, en fonction d'attributs tels que le condensé de l'image de conteneur de la charge de travail.
L'accès direct aux ressources présente les avantages suivants :
La configuration d'un environnement Confidential Space nécessite moins d'étapes, car les collaborateurs de données n'ont pas besoin de configurer des comptes de service pour qu'un compte de service de charge de travail emprunte leur identité.
La charge de travail n'est autorisée à accéder qu'à des ressources spécifiques, déterminées par IAM. Cette méthode est plus sécurisée que l'emprunt d'identité d'un compte de service, où des comptes de service disposant d'autorisations excessives ou des droits d'emprunt d'identité peuvent fournir à un acteur malveillant un accès plus étendu que prévu.
Chaque accès aux ressources est consigné avec l'identité fédérée d'une instance de VM de charge de travail, au lieu de l'identité d'un compte de service emprunté qui peut être partagée par plusieurs charges de travail. L'identité d'une instance de VM de charge de travail peut inclure des détails tels que le condensé de l'image d'un conteneur, le numéro du projet à partir duquel la charge de travail est exécutée et l'ID de l'instance de VM exécutant la charge de travail, ce qui fournit une piste d'audit plus détaillée.
Vous n'avez pas besoin de mapper la propriété d'instance de VM
selfLinkà l'attributgoogle.subjectdans un fournisseur WIP. Les valeursselfLinktrès longues peuvent dépasser la limite de 127 octets de cet attribut, ce qui entraîne l'échec de l'authentification du fournisseur WIP.
Emprunter l'identité d'un compte de service
La méthode d'emprunt d'identité d'un compte de service implique que chaque collaborateur de données configure un compte de service pour déchiffrer ses données privées, puis associe ce compte de service à son propre WIP. Ils spécifient également le compte de service de la charge de travail dans leur fournisseur WIP, ce qui permet au compte de service de la charge de travail d'emprunter l'identité des comptes de service des collaborateurs de données afin de récupérer leurs données confidentielles et d'effectuer des opérations sur celles-ci.
L'emprunt d'identité d'un compte de service ne doit être utilisé que dans les scénarios suivants :
Lorsque vous devez utiliser des signatures d'image comme identifiants d'authentification, car la syntaxe utilisée par les signatures ne fonctionne pas avec les mappages d'attributs.
Lorsque vous accédez à des API qui ne sont pas compatibles avec les identités fédérées.
La méthode d'emprunt d'identité d'un compte de service peut échouer à s'authentifier auprès d'un fournisseur WIP si une instance de VM possède une propriété selfLink très longue. En effet, la revendication sub du jeton d'attestation, qui est définie sur la valeur selfLink, est mappée dans le fournisseur WIP à l'attribut google.subject, qui est limité à 127 octets.
Pour les valeurs selfLink d'instance de VM qui dépassent 127 octets, vous devez renommer vos instances de VM pour raccourcir le selfLink ou utiliser la méthode d'accès direct aux ressources.
Configurer un pool d'identités de charge de travail et un fournisseur
La procédure de configuration d'un fournisseur varie selon que vous utilisez l'accès direct aux ressources ou l'emprunt d'identité d'un compte de service.
Accès direct aux ressources
La méthode d'accès direct aux ressources implique de configurer un WIP et un fournisseur, puis de configurer des rôles IAM en fonction d'un condensé d'image de conteneur de charge de travail spécifique.
Configurer un pool d'identités de charge de travail et un fournisseur
Pour configurer un pool d'identités de charge de travail et un fournisseur, procédez comme suit :
Créez le pool d'identités de charge de travail :
gcloud iam workload-identity-pools create DATA_COLLABORATOR_POOL_NAME \ --location=globalCréez un fournisseur OIDC dans le pool d'identités de charge de travail :
gcloud iam workload-identity-pools providers create-oidc attestation-verifier \ --location=global \ --workload-identity-pool=DATA_COLLABORATOR_POOL_NAME \ --issuer-uri="ISSUER_URI" \ --allowed-audiences="https://sts.googleapis.com" \ --attribute-mapping="google.subject=\"gcpcs::\"+assertion.submods.container.image_digest+\"::\"+assertion.submods.gce.project_number+\"::\"+assertion.submods.gce.instance_id,attribute.image_digest=assertion.submods.container.image_digest" \ --attribute-condition="assertion.swname == 'CONFIDENTIAL_SPACE' \ && 'STABLE' in assertion.submods.confidential_space.support_attributes"Cet exemple utilise les valeurs suivantes :
Un
issuer-uriqui correspond au service d'attestation que vous utilisez :Google Cloud Attestation :
https://confidentialcomputing.googleapis.comIntel Trust Authority :
https://portal.trustauthority.intel.com
allowed-audiencesdehttps://sts.googleapis.com. Il s'agit du Security Token Service de Google, qui échange des identifiants contre des jetons d'accès.Un
attribute-mappingdegoogle.subject, avec la valeur suivante :\"gcpcs::\"+assertion.submods.container.image_digest+\"::\"+assertion.submods.gce.project_number+\"::\"+assertion.submods.gce.instance_id,attribute.image_digest=assertion.submods.container.image_digestCette valeur est construite à l'aide du langage CEL (Common Expression Language). Les valeurs suivantes sont attribuées à l'attribut
gcpcset s'affichent dans Cloud Logging chaque fois que la charge de travail accède aux ressources :assertion.submods.container.image_digest: condensé de l'image du conteneur de charge de travail.assertion.submods.gce.project_number: numéro de projet de l'instance de VM.assertion.submods.gce.instance_id: ID de l'instance de VM.
De plus,
attribute.image_digestest défini surassertion.submods.container.image_digest, le condensé de l'image du conteneur de charge de travail. Cet attribut est mappé afin que vous puissiez attribuer des rôles IAM à l'identité fédérée en fonction d'un condensé d'image spécifique.Vous pouvez mapper n'importe quelle assertion de charge de travail disponible, à condition que la longueur totale de la valeur
google.subjectsoit inférieure à 127 octets.Les
attribute-conditionssuivants, qui forment une règle d'attestation. Si ces conditions correspondent aux assertions de la charge de travail, celle-ci est autorisée à accéder aux ressources confidentielles en tant qu'identité fédérée :assertion.swname == 'CONFIDENTIAL_SPACE': vérifie que Confidential Space est le logiciel exécuté sur la VM, avec toutes ses garanties de sécurité intégrées.'STABLE' in assertion.submods.confidential_space.support_attributes: vérifie que l'image de production Confidential Space est utilisée et qu'elle possède l'attribut de compatibilitéSTABLE.
Pour en savoir plus sur les conditions d'attribut que vous pouvez utiliser, consultez Créer une règle d'attestation.
Attribuer des rôles IAM à l'identité fédérée
Après avoir créé un fournisseur WIP, vous pouvez attribuer un rôle IAM à l'identité fédérée selon que le condensé du conteneur d'image de charge de travail de l'identité correspond ou non à une valeur attendue.
L'exemple suivant montre comment accorder à une identité fédérée la possibilité de déchiffrer une clé Cloud Key Management Service spécifique :
gcloud kms keys add-iam-policy-binding \
projects/DATA_COLLABORATOR_PROJECT_ID/locations/global/keyRings/DATA_COLLABORATOR_KEYRING_NAME/cryptoKeys/DATA_COLLABORATOR_KEY_NAME \
--member="principalSet://iam.googleapis.com/projects/DATA_COLLABORATOR_PROJECT_NUMBER/locations/global/workloadIdentityPools/DATA_COLLABORATOR_POOL_NAME/attribute.image_digest/WORKLOAD_CONTAINER_IMAGE_DIGEST" \
--role=roles/cloudkms.cryptoKeyDecrypter
Emprunter l'identité d'un compte de service
La méthode d'emprunt d'identité d'un compte de service implique les éléments suivants :
Créer des comptes de service dans chacun des projets des collaborateurs de données et leur accorder l'autorisation de déchiffrer les données confidentielles.
Créer des pools d'identités de charge de travail dans chacun des projets des collaborateurs de données, puis associer le compte de service de chaque projet qui vient d'être créé à son pool d'identités de charge de travail.
Créer des fournisseurs WIP dans chaque WIP, qui spécifient le compte de service de la charge de travail comme compte autorisé à emprunter l'identité des comptes de service des collaborateurs de données.
Configurer des comptes de service pour déchiffrer des données confidentielles
Créez les comptes de service dans les projets des collaborateurs de données :
gcloud iam service-accounts create DATA_COLLABORATOR_SERVICE_ACCOUNT_NAMEAccordez aux comptes de service les autorisations requises pour déchiffrer les données confidentielles. Par exemple, vous pouvez chiffrer des fichiers confidentiels dans Cloud Storage avec Cloud KMS. Vous devez donc autoriser le compte de service à déchiffrer ces données :
gcloud kms keys add-iam-policy-binding \ projects/DATA_COLLABORATOR_PROJECT_ID/locations/global/keyRings/DATA_COLLABORATOR_KEYRING_NAME/cryptoKeys/DATA_COLLABORATOR_KEY_NAME \ --member=serviceAccount:DATA_COLLABORATOR_SERVICE_ACCOUNT_NAME@DATA_COLLABORATOR_PROJECT_ID.iam.gserviceaccount.com \ --role=roles/cloudkms.cryptoKeyDecrypter
Configurer un pool d'identités de charge de travail et un fournisseur
Pour configurer un pool d'identité de charge de travail et un fournisseur, suivez les instructions ci-dessous dans chaque projet de collaborateur de données :
Créez le pool d'identités de charge de travail :
gcloud iam workload-identity-pools create DATA_COLLABORATOR_POOL_NAME \ --location=globalAssociez le compte de service dont l'identité sera empruntée au pool d'identité de charge de travail, avec le rôle
roles/iam.workloadIdentityUser:gcloud iam service-accounts add-iam-policy-binding \ DATA_COLLABORATOR_SERVICE_ACCOUNT_NAME@DATA_COLLABORATOR_PROJECT_ID.iam.gserviceaccount.com \ --member="principalSet://iam.googleapis.com/projects/DATA_COLLABORATOR_PROJECT_NUMBER/locations/global/workloadIdentityPools/DATA_COLLABORATOR_POOL_NAME/*" \ --role=roles/iam.workloadIdentityUserCréez un fournisseur OIDC dans le pool d'identités de charge de travail et définissez-y le compte de service de la charge de travail afin qu'il puisse emprunter l'identité du compte de service du collaborateur de données :
gcloud iam workload-identity-pools providers create-oidc attestation-verifier \ --location=global \ --workload-identity-pool=DATA_COLLABORATOR_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 == 'WORKLOAD_CONTAINER_IMAGE_DIGEST' \ && 'WORKLOAD_SERVICE_ACCOUNT_NAME@WORKLOAD_OPERATOR_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts \ && assertion.swname == 'CONFIDENTIAL_SPACE' \ && 'STABLE' in assertion.submods.confidential_space.support_attributes"Cet exemple utilise les valeurs suivantes :
Un
issuer-uridehttps://confidentialcomputing.googleapis.com/, ce qui signifie que Google Cloud Attestation est utilisé comme service d'attestation.allowed-audiencesdehttps://sts.googleapis.com. Il s'agit du Security Token Service de Google, qui échange des identifiants contre des jetons d'accès.Un
attribute-mappingdegoogle.subject, avec la valeurassertion.sub. Il s'agit de l'selfLinkde l'instance de VM, tel que défini dans la revendicationsubdu jeton d'attestation.L'instance de VM
selfLinks'affiche dans Cloud Logging chaque fois que la charge de travail accède à des ressources.Les
attribute-conditionssuivants, qui forment une règle d'attestation. Si ces conditions correspondent aux assertions de la charge de travail, celle-ci est autorisée à accéder aux ressources en tant qu'identité fédérée :assertion.submods.container.image_digest == 'WORKLOAD_CONTAINER_IMAGE_DIGEST': vérifie que le condensé de l'image de conteneur de la charge de travail correspond à la valeur attendue.'WORKLOAD_SERVICE_ACCOUNT_NAME@WORKLOAD_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts: vérifie que le compte de service associé à la charge de travail correspond au compte de service attendu, puis l'utilise pour emprunter l'identité du compte de service du collaborateur de données.assertion.swname == 'CONFIDENTIAL_SPACE': vérifie que Confidential Space est le logiciel exécuté sur la VM, avec toutes ses garanties de sécurité intégrées.'STABLE' in assertion.submods.confidential_space.support_attributes: vérifie que l'image de production Confidential Space est utilisée et qu'elle possède l'attribut de compatibilitéSTABLE.
Pour en savoir plus sur les conditions d'attribut que vous pouvez utiliser, consultez Créer une règle d'attestation.
Créer une règle d'attestation
Lorsque vous créez un WIP, vous devez créer une règle d'attestation. Les assertions d'une entité d'authentification doivent correspondre à votre stratégie pour pouvoir accéder à vos données.
Les règles sont écrites en Common Expression Language (CEL) et sont constituées d'une série d'instructions pouvant être associées à l'opérateur &&.
Les instructions utilisent des assertions de l'image Confidential Space, de l'image de conteneur de charge de travail ou de l'instance de VM comme variables, et la valeur que vous avez spécifiée comme expression.
Par exemple, voici une règle qui impose que la charge de travail utilise Confidential Space, qu'elle utilise une image Confidential Space STABLE et que la zone dans laquelle l'instance de VM de charge de travail s'exécute soit us-central1-a :
assertion.swname == 'CONFIDENTIAL_SPACE' \
&& 'STABLE' in assertion.submods.confidential_space.support_attributes" \
&& assertion.submods.gce.zone == "us-central1-a"
Pour en savoir plus, consultez Assertions d'attestation.
Assertions 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 effectuées par l'image Confidential Space, le conteneur de charge de travail et l'instance de VM.
Assertions d'image
| Assertion | Type | Description | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Interagit avec :
|
Enumeration |
Vérifie que l'image Confidential Space est la version de débogage ou la version en production. Les valeurs valides sont les suivantes :
ExemplesLe code suivant vérifie que la version de débogage de l'image Confidential Space est utilisée : Le code suivant vérifie que la version en production de l'image Confidential Space est utilisée : |
||||||||||
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.
Nous vous recommandons de maintenir votre image Confidential Space à jour. Pour savoir comment mettre à jour votre image Confidential Space, consultez Mettre à jour les images Confidential Space. ExempleLe code suivant vérifie qu'une version stable de l'image Confidential Space est utilisée : |
||||||||||
assertion.swname |
Enumeration |
Vérifie le logiciel exécuté sur l'entité de test. La valeur est toujours Exemple |
||||||||||
assertion.swversion |
Tableau de chaînes |
Vérifie la version logicielle de l'image Confidential Space. Nous vous recommandons d'utiliser Exemple |
Assertions pour les conteneurs
| Assertion | Type | Description |
|---|---|---|
|
Interagit avec :
|
Tableau de chaînes |
Vérifie les commandes et les paramètres CMD utilisés dans l'image de charge de travail. ExemplesLe code suivant vérifie que l'objet CMD de l'image de charge de travail n'a pas été écrasé :
Le code suivant vérifie que |
|
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 |
|
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 Le code suivant vérifie que l'opérateur de charge de travail n'a écrasé aucune variable d'environnement : |
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_id |
Chaîne |
Vérifie l'ID d'image du conteneur de charge de travail. Exemple |
|
Interagit avec :
|
Chaîne |
Vérifie l'emplacement du conteneur de charge de travail exécuté sur l'image Confidential Space. Exemple |
|
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 :
Exemple |
|
Interagit avec :
|
Enumeration |
Vérifie la stratégie de redémarrage du lanceur de conteneurs lorsque la charge de travail s'arrête. Les valeurs valides sont les suivantes :
Exemple |
Assertions de VM
| Assertion | Type | Description |
|---|---|---|
|
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 Exemple |
assertion.hwmodel |
Chaîne |
Vérifie la technologie d'informatique confidentielle sous-jacente. Les plates-formes compatibles sont les suivantes :
Exemple |
|
Interagit avec :
|
Booléen |
Vérifie l'état de la surveillance sur l'entité d'attestation. Exemple |
assertion.submods.gce.instance_id |
Chaîne |
Vérifie l'ID de l'instance de VM. Exemple |
assertion.submods.gce.instance_name |
Chaîne |
Vérifie le nom de l'instance de VM. Exemple |
assertion.submods.gce.project_id |
Chaîne |
Vérifie que la VM exécute un projet Google Cloud avec l'ID du projet spécifié. Exemple |
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 |
|
Interagit avec :
|
Chaîne |
Vérifie que la VM est en cours d'exécution dans la zone spécifiée. Exemple |
|
Interagit avec :
|
Enumeration |
Vérifie les fonctionnalités d'informatique confidentielle compatibles avec un GPU NVIDIA. Seul le mode de transfert GPU unique (SPT) est compatible avec Confidential Space. La valeur est donc toujours Pour en savoir plus sur la compatibilité de l'informatique confidentielle NVIDIA, consultez NVIDIA Trusted Computing Solutions (PDF). Exemple |
|
Interagit avec :
|
Enumeration |
Vérifie l'état du pilote informatique confidentielle de NVIDIA. Les valeurs valides sont les suivantes :
Exemple |
|
Interagit avec :
|
Tableau d'objets |
Vérifie les revendications pour chaque GPU NVIDIA attesté. Confidential Space n'accepte qu'une seule revendication de GPU. Un objet { "hwmodel": "GCP_NVIDIA_H100", "ueid": "490457405999046854973671575630853621547794591064", "l4_serial_number": "1216669666319372030078", "driver_version": "570.00", "vbios_version": "96.00.9F.00.01" } ExemplesLe code suivant vérifie que le premier modèle de matériel GPU est un NVIDIA H100 exécuté sur Google Cloud : Le code suivant vérifie que la revendication d'attestation comporte des revendications liées au GPU : |