Données partagées sécurisées utilisées avec Espace confidentiel

1. Présentation

Confidential Space permet le partage et la collaboration sécurisés de données entre plusieurs parties, tout en permettant aux organisations de préserver la confidentialité de leurs données. Cela signifie que les organisations peuvent collaborer entre elles tout en gardant le contrôle de leurs données et en les protégeant contre les accès non autorisés.

Confidential Space permet de dégager mutuellement de la valeur en agrégeant et en analysant des données sensibles, souvent réglementées, tout en conservant un contrôle total dessus. Avec Confidential Space, les entreprises peuvent dégager mutuellement de la valeur en agrégeant et en analysant des données sensibles telles que les informations permettant d'identifier personnellement les utilisateurs, les données de santé protégées, les droits de propriété intellectuelle et les secrets cryptographiques, tout en gardant un contrôle total dessus.

Prérequis

Points abordés

  • Configurer les ressources Cloud nécessaires pour exécuter Confidential Space
  • Exécuter la charge de travail dans une Confidential VM exécutant l'image de VM Confidential Space
  • Comment autoriser l'accès aux ressources protégées en fonction des attributs du code de la charge de travail (quoi), de l'environnement Confidential Space () et du compte qui exécute la charge de travail (qui).

Dans cet atelier de programmation, vous allez configurer un espace confidentiel entre Primus et Secundus Bank pour identifier leurs clients communs sans partager l'intégralité de leurs listes de comptes. Voici les étapes à suivre :

  • Étape 1 : Configurez les ressources cloud requises pour les banques Primus et Secundus. Ces ressources cloud incluent des buckets Cloud Storage, des clés KMS, des pools d'identités de charge de travail et des comptes de service pour les banques Primus et Secundus. Les banques Primus et Secundus stockent les données de leurs clients dans des buckets Cloud Storage et les chiffrent à l'aide de clés Cloud Key Management Service.
  • Étape 2 : Créez un compte de service de charge de travail qui sera utilisé par la VM de charge de travail. Secundus Bank, qui sera l'opérateur de la charge de travail, lancera la VM de charge de travail. Primus Bank est l'auteur du code de charge de travail.
  • Étape 3 : Créez une charge de travail qui inclut deux commandes CLI, l'une pour compter les clients de l'emplacement fourni et l'autre pour trouver les clients communs de Primus et Secundus Bank. La charge de travail sera créée par Primus Bank et packagée sous forme d'image Docker. Cette image Docker sera publiée dans Artifact Registry.
  • Étape 4 : Autorisez une charge de travail. Primus Bank utiliserait un pool d'identités de charge de travail pour autoriser les charges de travail à accéder à ses données client en fonction des attributs de l'utilisateur qui exécute la charge de travail, de ce que fait la charge de travail et de l'endroit où elle s'exécute.
  • Étape 5 : Lorsque la charge de travail s'exécute, elle demande l'accès aux ressources cloud des collaborateurs de données (Primus Bank et Secundus Bank) en proposant un jeton Attestation Verifier service avec des revendications de charge de travail et d'environnement. Si les revendications de mesure de la charge de travail dans le jeton correspondent à la condition d'attribut dans les pools d'identités de charge de travail des banques Primus et Secundus, le jeton d'accès au compte de service autorisé à accéder aux ressources cloud respectives est renvoyé. Les ressources cloud ne seront accessibles qu'à la charge de travail exécutée dans Confidential Space.
  • Étape 5(a) : Exécutez la première charge de travail qui compte les clients de Primus Bank provenant de lieux spécifiques. Pour cette charge de travail, Primus Bank serait un collaborateur de données et un auteur de charge de travail, qui fournirait la liste des clients chiffrée à la charge de travail s'exécutant dans Confidential Space. La banque Secundus est un opérateur de charge de travail qui exécute la charge de travail dans un espace confidentiel.
  • Étape 5(b) : Exécutez la deuxième charge de travail, qui recherche les clients communs aux banques Primus et Secundus. Pour cette charge de travail, Primus Bank et Secundus Bank seraient toutes deux des collaborateurs de données. Ils fournissent les listes de clients chiffrées à la charge de travail exécutée dans Confidential Space. Secundus Bank serait à nouveau un opérateur de charge de travail. Cette charge de travail serait également autorisée par Secundus Bank, car elle doit également accéder aux listes de clients chiffrées de Secundus Bank pour trouver les clients communs. Dans ce cas, Secundus Bank autoriserait la charge de travail à accéder à ses données client en fonction des attributs de la personne qui exécute la charge de travail, de ce que fait la charge de travail et de l'endroit où elle s'exécute, comme indiqué à l'étape 4 pour Primus Bank.

fdef93a6868a976.png

2. Configurer les ressources cloud

Avant de commencer

  • Clonez ce dépôt à l'aide de la commande ci-dessous pour obtenir les scripts requis utilisés dans cet atelier de programmation.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
  • Accédez au répertoire de cet atelier de programmation.
cd confidential-space/codelabs/bank_data_analysis_codelab/scripts
  • Assurez-vous d'avoir défini les variables d'environnement du projet requises, comme indiqué ci-dessous. Pour en savoir plus sur la création d'un projet GCP, consultez cet atelier de programmation. Pour savoir comment récupérer l'ID d'un projet et en quoi il diffère du nom et du numéro du projet, consultez cette page.
export PRIMUS_PROJECT_ID=<GCP project id of Primus bank>
export SECUNDUS_PROJECT_ID=<GCP project id of Secundus bank>
  • Activez la facturation pour vos projets.
  • Activez l'API Confidential Computing et les API suivantes pour les deux projets.
gcloud services enable \
    cloudapis.googleapis.com \
    cloudkms.googleapis.com \
    cloudresourcemanager.googleapis.com \
    cloudshell.googleapis.com \
    container.googleapis.com \
    containerregistry.googleapis.com \
    iam.googleapis.com \
    confidentialcomputing.googleapis.com
  • Définissez les variables pour les noms de ressources comme indiqué ci-dessous à l'aide de cette commande. Vous pouvez remplacer les noms de ressources à l'aide de ces variables (par exemple, export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket').
  • Vous pouvez définir les variables suivantes avec les noms de ressources cloud existants dans le projet Primus. Si la variable est définie, la ressource cloud existante correspondante du projet Primus est utilisée. Si la variable n'est pas définie, le nom de la ressource cloud est généré à partir du nom du projet et une nouvelle ressource cloud est créée dans le cadre de ce qui suit :

$PRIMUS_INPUT_STORAGE_BUCKET

Bucket qui stocke le fichier de données client de Primus Bank.

$PRIMUS_WORKLOAD_IDENTITY_POOL

Pool d'identités de charge de travail de Primus Bank qui valide les revendications.

$PRIMUS_WIP_PROVIDER

Fournisseur de pool d'identités de charge de travail de Primus Bank, qui inclut la condition d'autorisation à utiliser pour les jetons signés par le service de validation d'attestation.

$PRIMUS_SERVICE_ACCOUNT

Compte de service de Primus Bank utilisé par $PRIMUS_WORKLOAD_IDENTITY_POOL pour accéder aux ressources protégées. À cette étape, il est autorisé à afficher les données client stockées dans le bucket $PRIMUS_INPUT_STORAGE_BUCKET.

$PRIMUS_ENC_KEY

Clé KMS utilisée pour chiffrer les données stockées dans $PRIMUS_INPUT_STORAGE_BUCKET pour Primus Bank.

$PRIMUS_ENC_KEYRING

Trousseau de clés KMS qui sera utilisé pour créer la clé de chiffrement $PRIMUS_ENC_KEY pour Primus Bank.

$PRIMUS_ARTIFACT_REPOSITORY

Dépôt d'artefacts dans lequel l'image Docker de la charge de travail sera transférée.

  • Vous pouvez définir les variables suivantes avec les noms de ressources cloud existants dans le projet Secundus. Si la variable est définie, la ressource cloud existante correspondante du projet Secundus est utilisée. Si la variable n'est pas définie, le nom de la ressource cloud est généré à partir du nom du projet et une nouvelle ressource cloud est créée comme suit :

$SECUNDUS_INPUT_STORAGE_BUCKET

Bucket qui stocke le fichier de données client de Secundus Bank

$SECUNDUS_WORKLOAD_IDENTITY_POOL

Pool d'identités de charge de travail de Secundus Bank qui valide les revendications.

$SECUNDUS_WIP_PROVIDER

Fournisseur de pool d'identités de charge de travail de Secundus Bank, qui inclut la condition d'autorisation à utiliser pour les jetons signés par le service de validation d'attestation.

$SECUNDUS_SERVICE_ACCOUNT

Compte de service de Secundus Bank utilisé par $SECUNDUS_WORKLOAD_IDENTITY_POOL pour accéder aux ressources protégées. À cette étape, il est autorisé à afficher les données client stockées dans le bucket $SECUNDUS_INPUT_STORAGE_BUCKET.

$SECUNDUS_ENC_KEY

Clé KMS utilisée pour chiffrer les données stockées dans $SECUNDUS_INPUT_STORAGE_BUCKET pour Secundus Bank.

$SECUNDUS_ENC_KEYRING

Porte-clés KMS utilisé pour créer la clé de chiffrement $SECUNDUS_ENV_KEY pour Secundus Bank.

$SECUNDUS_RESULT_STORAGE_BUCKET

Bucket qui stocke les résultats de la charge de travail.

$WORKLOAD_IMAGE_NAME

Nom de l'image du conteneur de charge de travail.

$WORKLOAD_IMAGE_TAG

Tag de l'image du conteneur de charge de travail.

$WORKLOAD_SERVICE_ACCOUNT

Compte de service autorisé à accéder à la VM confidentielle qui exécute la charge de travail.

  • Vous trouverez ci-dessous quelques artefacts utilisés dans cet atelier de programmation :
  • primus_customer_list.csv : fichier contenant les données client de Primus Bank. Cliquez ici pour accéder à l'exemple de fichier utilisé dans cet atelier de programmation.
  • secundus_customer_list.csv : fichier contenant les données client de Secundus Bank. Cliquez ici pour accéder à l'exemple de fichier utilisé dans cet atelier de programmation.
  • Vous aurez besoin de certaines autorisations pour ces deux projets :
  • Pour $PRIMUS_PROJECT_ID, vous aurez besoin des rôles Administrateur Cloud KMS, Administrateur Storage, Administrateur Artifact Registry, Administrateur de compte de service et Administrateur IAM de pools d'identités de charge de travail.
  • Pour $SECUNDUS_PROJECT_ID, vous aurez besoin des rôles Administrateur Compute, Administrateur Storage, Administrateur de compte de service, Administrateur Cloud KMS, Administrateur de pools Workload Identity et Administrateur de la sécurité (facultatif).
  • Exécutez le script suivant pour définir les noms de variables restants sur des valeurs basées sur l'ID de votre projet pour les noms de ressources.
source config_env.sh

Configurer des ressources cloud pour Primus Bank

Les ressources cloud suivantes sont requises pour Primus Bank. Exécutez ce script pour configurer les ressources de Primus Bank :

  • Bucket Cloud Storage ($PRIMUS_INPUT_STORAGE_BUCKET) pour stocker le fichier de données client chiffré de Primus Bank.
  • Clé de chiffrement ($PRIMUS_ENC_KEY) et trousseau de clés ($PRIMUS_ENC_KEYRING) dans KMS pour chiffrer le fichier de données client de Primus Bank.
  • Pool d'identités de charge de travail ($PRIMUS_WORKLOAD_IDENTITY_POOL) pour valider les revendications en fonction des conditions d'attributs configurées sous son fournisseur.
  • Le compte de service ($PRIMUS_SERVICE_ACCOUNT) associé au pool d'identités de charge de travail mentionné ci-dessus ($PRIMUS_WORKLOAD_IDENTITY_POOL) a accès au déchiffrement des données à l'aide de la clé KMS (avec le rôle roles/cloudkms.cryptoKeyDecrypter), à la lecture des données du bucket Cloud Storage (avec le rôle objectViewer) et à la connexion du compte de service au pool d'identités de charge de travail (avec le rôle roles/iam.workloadIdentityUser).
./setup_primus_bank_resources.sh

Configurer des ressources cloud pour Secundus Bank

Pour la banque Secundus, les ressources cloud suivantes sont requises. Exécutez ce script pour configurer les ressources de Secundus Bank. Les ressources mentionnées ci-dessous seront créées au cours de ces étapes :

  • Bucket Cloud Storage ($SECUNDUS_INPUT_STORAGE_BUCKET) pour stocker le fichier de données client chiffrées de Secundus Bank.
  • Clé de chiffrement ($SECUNDUS_ENC_KEY) et trousseau de clés ($SECUNDUS_ENC_KEYRING) dans KMS pour chiffrer le fichier de données de Secundus Bank.
  • Pool d'identités de charge de travail ($SECUNDUS_WORKLOAD_IDENTITY_POOL) pour valider les revendications en fonction des conditions d'attributs configurées sous son fournisseur.
  • Le compte de service ($SECUNDUS_SERVICE_ACCOUNT) associé au pool d'identités de charge de travail mentionné ci-dessus ($SECUNDUS_WORKLOAD_IDENTITY_POOL) a accès au déchiffrement des données à l'aide de la clé KMS (avec le rôle roles/cloudkms.cryptoKeyDecrypter), à la lecture des données du bucket Cloud Storage (avec le rôle objectViewer) et à la connexion du compte de service au pool d'identités de charge de travail (avec le rôle roles/iam.workloadIdentityUser).
  • Bucket Cloud Storage ($SECUNDUS_RESULT_STORAGE_BUCKET) pour stocker le résultat de l'exécution de la charge de travail par Secundus Bank.
./setup_secundus_bank_resources.sh

3. Créer une charge de travail

Créer un compte de service pour la charge de travail

Vous allez maintenant créer un compte de service pour la charge de travail avec les rôles et autorisations requis, comme indiqué ci-dessous. Exécutez le script suivant pour créer un compte de service de charge de travail dans le projet Secundus Bank. La VM qui exécute la charge de travail utiliserait ce compte de service.

Ce compte de service de charge de travail ($WORKLOAD_SERVICE_ACCOUNT) disposera des rôles suivants :

  • Attribuez le rôle confidentialcomputing.workloadUser au compte de service de charge de travail . Cela permettra au compte utilisateur de générer un jeton d'attestation.
  • Attribuez le rôle logging.logWriter à l'autorisation du compte de service de charge de travail. Cela permet à l'environnement Confidential Space d'écrire des journaux dans Cloud Logging en plus de la console série. Les journaux sont donc disponibles une fois la VM arrêtée.
  • objectViewer pour lire les données du bucket Cloud Storage $PRIMUS_INPUT_STORAGE_BUCKET.
  • objectViewer pour lire les données du bucket Cloud Storage $SECUNDUS_INPUT_STORAGE_BUCKET.
  • objectAdmin pour écrire le résultat de la charge de travail dans le bucket Cloud Storage $SECUNDUS_RESULT_STORAGE_BUCKET.
./create_workload_service_account.sh

Créer une charge de travail

Dans cette étape, vous allez créer une image Docker pour la charge de travail utilisée dans cet atelier de programmation. La charge de travail est une application GoLang simple qui :

  • Compte les clients dans une zone géographique spécifiée.
  • Trouve les clients communs de Primus et Secundus Bank à partir des listes de clients stockées dans leurs buckets Cloud Storage respectifs.

Exécutez le script suivant pour créer une charge de travail dans laquelle les étapes suivantes sont effectuées :

  • Créez un dépôt Artifact Registry ($PRIMUS_ARTIFACT_REPOSITORY) appartenant à Primus Bank, dans lequel la charge de travail sera publiée.
  • Générez le code et mettez-le à jour avec les noms de ressources requis. Le code de charge de travail utilisé dans cet atelier de programmation est disponible ici.
  • Créez le code et packagez-le dans une image Docker. Le Dockerfile correspondant est disponible ici.
  • Publiez l'image Docker dans le registre Artifact Registry ($PRIMUS_ARTIFACT_REGISTRY) appartenant à Primus Bank.
  • Accordez au compte de service l'autorisation de lecture $WORKLOAD_SERVICE_ACCOUNT pour Artifact Registry ($PRIMUS_ARTIFACT_REGISTRY).
./create_workload.sh

4. Autoriser et exécuter des charges de travail

Autoriser la charge de travail

Primus Bank souhaite autoriser les charges de travail à accéder à ses données client en fonction des attributs des ressources suivantes :

  • Quoi : code validé
  •  : un environnement sécurisé
  • Qui : un opérateur de confiance

Primus utilise la fédération d'identité de charge de travail pour appliquer une règle d'accès basée sur ces exigences.

La fédération d'identité de charge de travail vous permet de spécifier des conditions d'attribut. Ces conditions limitent les identités qui peuvent s'authentifier avec le pool d'identités de charge de travail. Vous pouvez ajouter le service de validation d'attestation au pool d'identités de charge de travail en tant que fournisseur de pool d'identités de charge de travail pour présenter les mesures et appliquer la stratégie.

Le pool d'identités de charge de travail a déjà été créé lors de l'étape de configuration des ressources cloud. Primus Bank va maintenant créer un fournisseur de pools d'identités de charge de travail OIDC. Le --attribute-condition spécifié autorise l'accès au conteneur de charge de travail. Cela nécessite :

  • Description : la dernière version de $WORKLOAD_IMAGE_NAME a été importée dans le dépôt $PRIMUS_ARTIFACT_REPOSITORY.
  •  : l'environnement d'exécution sécurisé Confidential Space s'exécute sur l'image de VM Confidential Space entièrement compatible.
  • Qui : compte de service Secundus Bank $WORKLOAD_SERVICE_ACCOUNT.
gcloud config set project $PRIMUS_PROJECT_ID
gcloud iam workload-identity-pools providers create-oidc $PRIMUS_WIP_PROVIDER \
  --location="global" \
  --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 == 'CONFIDENTIAL_SPACE' && 
   'STABLE' in assertion.submods.confidential_space.support_attributes &&
   assertion.submods.container.image_reference == 'us-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG' && 
'$WORKLOAD_SERVICE_ACCOUNT@$SECUNDUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"

Comme pour le pool d'identités de charge de travail créé pour Primus Bank, Secundus Bank souhaite autoriser les charges de travail à accéder à ses données client en fonction des éléments suivants :

  • Quoi : la charge de travail.
  •  : environnement Confidential Space.
  • Qui : compte ($WORKLOAD_SERVICE_ACCOUNT) qui exécute la charge de travail.

Primus Bank utilise la revendication image_reference, qui inclut le tag d'image, pour déterminer s'il doit autoriser l'accès. Ils contrôlent le dépôt distant et peuvent donc s'assurer de n'étiqueter que les images qui ne divulguent pas leurs données.

En comparaison, Secundus Bank ne contrôle pas le dépôt à partir duquel elle obtient l'image. Elle ne peut donc pas faire cette hypothèse en toute sécurité. Au lieu de cela, ils choisissent d'autoriser l'accès à la charge de travail en fonction de son image_digest. Contrairement à image_reference, que Primus Bank pourrait modifier pour pointer vers une autre image, Primus Bank ne pourrait pas faire en sorte que image_digest fasse référence à une image autre que celle que Secundus Bank a auditée à l'étape précédente.

Avant de créer des fournisseurs de pool d'identités de charge de travail, nous collectons le image_digest pour l'image de conteneur de charge de travail qui sera utilisé dans les conditions d'attribut du fournisseur.

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 config set project $SECUNDUS_PROJECT_ID
gcloud iam workload-identity-pools providers create-oidc $SECUNDUS_WIP_PROVIDER \
  --location="global" \
  --workload-identity-pool="$SECUNDUS_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 == 'CONFIDENTIAL_SPACE' && 
'STABLE' in assertion.submods.confidential_space.support_attributes && 
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_SERVICE_ACCOUNT@$SECUNDUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"

Exécuter une ou plusieurs charges de travail

Dans cette étape, Secundus Bank exécutera la charge de travail dans Confidential Space. Cette charge de travail obtiendra les jetons d'accès du pool d'identités de charge de travail de Primus et du pool d'identités de charge de travail de Secundus pour lire et déchiffrer les données client de Primus Bank et de Secundus Bank, respectivement.

Les arguments TEE requis sont transmis à l'aide de l'indicateur de métadonnées. Les arguments du conteneur de charge de travail sont transmis à l'aide de la partie "tee-cmd" de l'indicateur. Le résultat de l'exécution de la charge de travail sera publié dans $SECUNDUS_RESULT_STORAGE_BUCKET.

Exécuter la première charge de travail

Lors de la première exécution de la charge de travail, celle-ci comptabilise les clients de Primus Bank à partir de l'emplacement fourni dans les arguments du conteneur de charge de travail. Comme indiqué ci-dessous, la première charge de travail exécutera la commande "count-location" et le résultat sera stocké à l'emplacement $SECUNDUS_RESULT_STORAGE_BUCKET/seattle-result.

gcloud compute instances create ${WORKLOAD_VM1} \
 --project=${SECUNDUS_PROJECT_ID} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=MIGRATE \
 --scopes=cloud-platform \
 --zone=${SECUNDUS_PROJECT_ZONE} \
 --image-project=confidential-space-images \
 --image-family=confidential-space \
--service-account=${WORKLOAD_SERVICE_ACCOUNT}@${SECUNDUS_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-restart-policy=Never~tee-cmd="[\"count-location\",\"Seattle\",\"gs://${SECUNDUS_RESULT_STORAGE_BUCKET}/seattle-result\"]""

Afficher les résultats

Dans le projet Secundus, affichez les résultats de la première charge de travail. Attendez trois à cinq minutes que la charge de travail termine l'exécution et que le résultat soit disponible dans le bucket Cloud Storage.

gcloud config set project $SECUNDUS_PROJECT_ID
gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/seattle-result

Le résultat doit être 3, car il s'agit du nombre de personnes de Seattle listées dans le fichier primus_customer_list.csv.

Exécuter la deuxième charge de travail

Lors de la deuxième exécution de la charge de travail, nous trouverons les clients communs de Primus Bank et Secundus Bank. Comme indiqué ci-dessous, la deuxième charge de travail exécutera la commande "list-common-customers" et le résultat sera stocké à l'emplacement $SECUNDUS_RESULT_STORAGE_BUCKET/list-common-count.

gcloud compute instances create ${WORKLOAD_VM2} \
 --project=${SECUNDUS_PROJECT_ID} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=MIGRATE \
 --scopes=cloud-platform \
 --zone=${SECUNDUS_PROJECT_ZONE} \
 --image-project=confidential-space-images \
 --image-family=confidential-space \
--service-account=${WORKLOAD_SERVICE_ACCOUNT}@${SECUNDUS_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-restart-policy=Never~tee-cmd="[\"list-common-customers\",\"gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result\"]""

Afficher les résultats

Dans le projet Secundus, affichez les résultats de la deuxième charge de travail. Attendez trois à cinq minutes que la charge de travail termine l'exécution et que le résultat soit disponible dans le bucket Cloud Storage.

gcloud config set project $SECUNDUS_PROJECT_ID
gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result

Le résultat doit être la liste suivante, car il s'agit des clients communs à Primus et Secundus Bank.

Résultat :

Eric
Clinton
Ashley
Cooper

Exécuter une charge de travail non autorisée

Le contrat de Primus Bank autorisant Secundus Bank à accéder à ses données expire. La banque Primus met donc à jour la condition d'attribut pour autoriser les VM avec le compte de service de son nouveau partenaire, la banque Tertius.

Primus Bank modifie le fournisseur de pools d'identités de charge de travail

Dans $PRIMUS_PROJECT_ID, mettez à jour la condition d'attribut du fournisseur d'identité Attestation Verifier pour autoriser les charges de travail dans un nouveau lieu.

  1. Définissez le projet sur $PRIMUS_PROJECT_ID.
gcloud config set project $PRIMUS_PROJECT_ID
  1. Exportez l'ID de projet GCP de Tertius Bank à l'aide de la commande ci-dessous. Primus Bank utilisera ensuite cette valeur pour mettre à jour la condition d'attribut du fournisseur de pool d'identités de charge de travail. La banque Primus n'arrêtera pas d'autoriser les comptes de service de charge de travail de la banque Secundus. Il autorisera désormais les comptes de service de charge de travail de Tertius Bank.
export TERTIUS_PROJECT_ID=<GCP project-id of Tertius Bank>
  1. Mettez à jour le fournisseur OIDC dans le pool d'identités de charge de travail. Ici, '$WORKLOAD_SERVICE_ACCOUNT@$SECUNDUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts est remplacé par '$WORKLOAD_SERVICE_ACCOUNT@$TERTIUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts.. Au lieu d'autoriser le compte de service de charge de travail de Secundus Bank, le compte de service de charge de travail de Tertius Bank sera désormais autorisé.
gcloud iam workload-identity-pools providers update-oidc $PRIMUS_WIP_PROVIDER \
  --location="global" \
  --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 == 'CONFIDENTIAL_SPACE' && 
   'STABLE' in assertion.submods.confidential_space.support_attributes &&
   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_SERVICE_ACCOUNT@$TERTIUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"

Réexécuter la charge de travail

Lorsque Secundus Bank tente d'exécuter la charge de travail d'origine, l'opération échoue. Pour afficher l'erreur, supprimez le fichier de résultats et l'instance de VM d'origine, puis essayez d'exécuter à nouveau la charge de travail.

Supprimer le fichier de résultats et l'instance de VM existants

  1. Définissez le projet sur le projet $SECUNDUS_PROJECT_ID.
gcloud config set project $SECUNDUS_PROJECT_ID
  1. Supprimez le fichier de résultats.
gsutil rm gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result
  1. Supprimez l'instance Confidential VM.
gcloud compute instances delete ${WORKLOAD_VM2} --zone=${SECUNDUS_PROJECT_ZONE}

Exécutez la charge de travail non autorisée :

gcloud compute instances create ${WORKLOAD_VM2} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=MIGRATE \
 --scopes=cloud-platform \
 --zone=${SECUNDUS_PROJECT_ZONE}\
 --image-project=confidential-space-images \
 --image-family=confidential-space \
--service-account=${WORKLOAD_SERVICE_ACCOUNT}@${SECUNDUS_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-restart-policy=Never~tee-cmd="[\"list-common-customers\",\"gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result\"]""

Afficher l'erreur

Au lieu des résultats de la charge de travail, une erreur (The given credential is rejected by the attribute condition) s'affiche.

gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result

De même, si la banque Primus modifie secrètement la charge de travail pour envoyer l'intégralité de la liste de clients de la banque Secundus à un bucket appartenant à la banque Primus, cette tentative échouera, car le résumé de la charge de travail malveillante sera différent de celui de l'image autorisée dans le pool d'identité de charge de travail de la banque Secundus.

5. Effectuer un nettoyage

Voici le script qui peut être utilisé pour nettoyer les ressources que nous avons créées dans cet atelier de programmation. Dans le cadre de ce nettoyage, les ressources suivantes seront supprimées :

  • Bucket Cloud Storage d'entrée de la banque Primus ($PRIMUS_INPUT_STORAGE_BUCKET)).
  • Un compte de service de la banque Primus ($PRIMUS_SERVICE_ACCOUNT).
  • Registre d'artefacts de la banque Primus contenant les signatures d'images ($PRIMUS_COSIGN_REPOSITORY).
  • Pool d'identités de charge de travail de la banque Primus($PRIMUS_WORKLOAD_IDENTITY_POOL).
  • Compte de service de charge de travail de la banque Secundus ($WORKLOAD_SERVICE_ACCOUNT).
  • Bucket Cloud Storage d'entrée de la banque Secundus ($SECUNDUS_INPUT_STORAGE_BUCKET)).
  • Un compte de service de la banque Secundus ($SECUNDUS_SERVICE_ACCOUNT).
  • Un registre d'artefacts de la banque Secundus contenant des signatures d'images ($SECUNDUS_COSIGN_REPOSITORY).
  • Pool d'identités de charge de travail de Secundus Bank($SECUNDUS_WORKLOAD_IDENTITY_POOL).
  • Compte de service de charge de travail de Secundus Bank ($WORKLOAD_SERVICE_ACCOUNT).
  • Instances de calcul de charge de travail.
  • Bucket de stockage des résultats de Secundus Bank ($SECUNDUS_RESULT_STORAGE_BUCKET).
  • Dépôt d'artefacts de Primus Bank ($PRIMUS_ARTIFACT_REPOSITORY).
./cleanup.sh

Si vous avez terminé l'exploration, pensez à supprimer votre projet.

  • Accédez à la console Cloud Platform.
  • Sélectionnez le projet que vous souhaitez arrêter, puis cliquez sur "Supprimer" en haut de la page. Le projet sera alors programmé pour suppression.

Félicitations

Bravo ! Vous avez terminé cet atelier de programmation.

Vous avez appris à sécuriser les données partagées tout en préservant leur confidentialité à l'aide de Confidential Space.

Et ensuite ?

Découvrez quelques-uns de ces ateliers de programmation similaires :

Complément d'informations