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

Sécuriser les données partagées utilisées avec Confidential Space

À propos de cet atelier de programmation

subjectDernière mise à jour : nov. 22, 2024
account_circleRédigé par Priya Pandey, Jiankun Lu, Meetrajsinh Vala

1. Présentation

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

Confidential Space vous 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 des informations permettant d'identifier personnellement l'utilisateur, des données de santé protégées, des droits de propriété intellectuelle et des 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 VM Confidential exécutant l'image de VM Confidential Space
  • 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 afin de déterminer leurs clients communs sans partager leurs listes de comptes complètes. Il comprend les étapes suivantes:

  • É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. Primus Bank et Secundus Bank stockent leurs données client 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. La banque Secundus, qui sera l'opérateur de la charge de travail, lancera la VM de charge de travail. Primus Bank serait l'auteur du code de la charge de travail.
  • Étape 3: Créez une charge de travail qui comprend deux commandes de ligne de commande, l'une pour compter les clients de l'emplacement fourni et l'autre pour trouver les clients communs de Primus et de Secundus Bank. La charge de travail sera créée par Primus Bank et empaqueté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 son objectif et de son emplacement.
  • É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 de service de validation des attestations 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 du 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 la Primus Bank dans des zones géographiques spécifiques. Pour cette charge de travail, Primus Bank serait un collaborateur de données et un auteur de la charge de travail, qui fournirait la liste de clients chiffrée à la charge de travail exécutée dans Confidential Space. Secundus Bank est un opérateur de charge de travail et 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 des banques Primus et Secundus. Pour ce volume de travail, Primus Bank et Secundus Bank sont tous deux des collaborateurs de données. Il fournirait 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 la banque Secundus, car elle doit également accéder aux listes de clients chiffrées de la banque pour trouver les clients communs. Dans ce cas, la banque Secundus autoriserait la charge de travail à accéder à ses données client en fonction des attributs de l'utilisateur qui exécute la charge de travail, de son objectif et de son emplacement, comme indiqué à l'étape 4 pour la banque Primus.

fdef93a6868a976.png

2. Configurer des 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 de 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 de projet et en quoi il diffère du nom et du numéro de 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 des 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 de project-name et une nouvelle ressource cloud est créée dans le cadre des éléments suivants:

$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 (WIP) de Primus Bank qui valide les revendications.

$PRIMUS_WIP_PROVIDER

Le 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 des attestations.

$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 des 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 de project-name et une nouvelle ressource cloud est créée dans le cadre des éléments suivants:

$SECUNDUS_INPUT_STORAGE_BUCKET

Ensemble de données qui stocke le fichier de données client de la banque Secundus

$SECUNDUS_WORKLOAD_IDENTITY_POOL

Le pool d'identités de charge de travail (WIP) de la banque Secundus qui valide les revendications.

$SECUNDUS_WIP_PROVIDER

Le fournisseur de pool d'identités de charge de travail de la banque Secundus, 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 la banque Secundus 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 la banque Secundus.

$SECUNDUS_ENC_KEYRING

Le trousseau de clés KMS utilisé pour créer la clé de chiffrement $SECUNDUS_ENV_KEY pour la banque Secundus.

$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 Confidential qui exécute la charge de travail.

  • Cet atelier de programmation utilise quelques artefacts, comme indiqué ci-dessous:
  • primus_customer_list.csv: fichier contenant les données client de Primus Bank. Voici l'exemple de fichier utilisé dans cet atelier de programmation.
  • secundus_customer_list.csv: fichier contenant les données client de la banque Secundus. Voici 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 du registre d'artefacts, Administrateur du compte de service et Administrateur du pool d'identités de charge de travail IAM.
  • Pour $SECUNDUS_PROJECT_ID, vous avez besoin des rôles Administrateur Compute, Administrateur Storage, Administrateur de compte de service, Administrateur Cloud KMS, Administrateur de pool Workload Identity IAM et Administrateur de sécurité (facultatif).
  • Exécutez le script suivant pour définir les noms de variable restants sur des valeurs basées sur votre ID de projet pour les noms de ressources.
source config_env.sh

Configurer des ressources cloud pour Primus Bank

Les ressources cloud suivantes sont requises pour la 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 ($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 dans son fournisseur.
  • Le compte de service ($PRIMUS_SERVICE_ACCOUNT) associé au pool d'identités de charges de travail ($PRIMUS_WORKLOAD_IDENTITY_POOL) mentionné ci-dessus a accès au déchiffrement des données à l'aide de la clé KMS (à l'aide du rôle roles/cloudkms.cryptoKeyDecrypter), à la lecture des données du bucket Cloud Storage (à l'aide du rôle objectViewer) et à la connexion du compte de service au pool d'identités de charges de travail (à l'aide de 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 la banque Secundus. Les ressources suivantes seront créées au cours de ces étapes:

  • Bucket Cloud Storage ($SECUNDUS_INPUT_STORAGE_BUCKET) pour stocker le fichier de données client chiffré de la banque Secundus.
  • Clé de chiffrement ($SECUNDUS_ENC_KEY) et trousseau de clés ($SECUNDUS_ENC_KEYRING) dans KMS pour chiffrer le fichier de données de la banque Secundus.
  • Pool d'identités de charge de travail ($SECUNDUS_WORKLOAD_IDENTITY_POOL) pour valider les revendications en fonction des conditions d'attributs configurées dans son fournisseur.
  • Le compte de service ($SECUNDUS_SERVICE_ACCOUNT) associé au pool d'identités de charge de travail ($SECUNDUS_WORKLOAD_IDENTITY_POOL) mentionné ci-dessus a accès au déchiffrement des données à l'aide de la clé KMS (à l'aide du rôle roles/cloudkms.cryptoKeyDecrypter), à la lecture des données du bucket Cloud Storage (à l'aide du rôle objectViewer) et à la connexion du compte de service au pool d'identités de charge de travail (à l'aide du 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 de charge de travail

Vous allez maintenant créer un compte de service pour la charge de travail avec les rôles et les 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 de la banque Secundus. La VM qui exécute la charge de travail utilisera 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 la charge de travail . Le compte utilisateur pourra ainsi générer un jeton d'attestation.
  • Attribuez le rôle logging.logWriter à l'autorisation du compte de service de la 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 ainsi 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

Au cours de 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.
  • Recherche les clients communs de Primus et de 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, où la charge de travail sera publiée.
  • Générez le code et remplacez-le par les noms de ressources requis. Vous trouverez le code de la charge de travail utilisé dans cet atelier de programmation sur cette page.
  • Créez le code et empaquetez-le dans une image Docker. Le Dockerfile correspondant est disponible sur cette page.
  • Publiez l'image Docker dans Artifact Registry ($PRIMUS_ARTIFACT_REGISTRY) appartenant à Primus Bank.
  • Accordez au compte de service $WORKLOAD_SERVICE_ACCOUNT l'autorisation de lecture pour Artifact Registry ($PRIMUS_ARTIFACT_REGISTRY).
./create_workload.sh

4. Autoriser et exécuter une ou plusieurs 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é
  • : environnement sécurisé
  • Who: opérateur de confiance

Primus utilise la fédération d'identité de charge de travail pour appliquer une stratégie 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 pouvant s'authentifier avec le pool d'identités de charge de travail (WIP). Vous pouvez ajouter le service de validation des attestations au WIP 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 crée maintenant un fournisseur de pool d'identités de charge de travail OIDC. L'--attribute-condition spécifié autorise l'accès au conteneur de la charge de travail. Cela nécessite :

  • Description: dernière $WORKLOAD_IMAGE_NAME 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 $WORKLOAD_SERVICE_ACCOUNT de la banque Secundus.
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 WIP 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.
  • : dans l'environnement Confidential Space.
  • Who: compte ($WORKLOAD_SERVICE_ACCOUNT) qui exécute la charge de travail.

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

En revanche, la banque Secundus 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, il choisit d'autoriser l'accès à la charge de travail en fonction de son image_digest. Contrairement à image_reference, que Primus Bank peut modifier pour qu'il pointe vers une autre image, Primus Bank ne peut pas faire en sorte que image_digest fasse référence à une autre image 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 l'image_digest de l'image du conteneur de charge de travail qui sera utilisée 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

Au cours de cette étape, Secundus Bank exécutera la charge de travail sur 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 compte 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é dans $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 pour 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 originaires de Seattle listées dans le fichier primus_customer_list.csv.

Exécuter une deuxième charge de travail

Lors de la deuxième exécution de la charge de travail, nous trouverons les clients communs de la Primus Bank et de la 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é dans $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 pour 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 devrait être la liste suivante, car il s'agit des clients communs entre Primus et Secundus Bank.

Sortie :

Eric
Clinton
Ashley
Cooper

Exécuter une charge de travail non autorisée

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

Primus Bank modifie le fournisseur du pool 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 à un nouvel emplacement.

  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 l'utilisera plus tard pour mettre à jour la condition d'attribut du fournisseur de pool d'identités de charge de travail. La banque Primus ne cessera pas d'autoriser les comptes de service de la charge de travail de la banque Secundus. Il autorisera désormais les comptes de service de charge de travail de la 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 la charge de travail de la banque Secundus, le compte de service de la charge de travail de la banque Tertius sera 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 la banque Secundus tente d'exécuter la charge de travail d'origine, elle échoue. Pour afficher l'erreur, supprimez le fichier de résultats d'origine et l'instance de VM, puis réessayez d'exécuter 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 de VM Confidential.
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 dans un bucket appartenant à la banque Primus, cette tentative échouera, car le récapitulatif de la charge de travail malveillante sera différent du récapitulatif de l'image autorisé dans le pool d'identités de charge de travail de la banque Secundus.

5. Effectuer un nettoyage

Voici le script que vous pouvez utiliser pour nettoyer les ressources que nous avons créées dans cet atelier de programmation. Lors de ce nettoyage, les ressources suivantes seront supprimées:

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

Si vous avez terminé votre exploration, envisagez de 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 être supprimé.

Félicitations

Félicitations, vous avez terminé l'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 ces ateliers de programmation similaires :

Complément d'informations