Les collaborateurs de données 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, workload identity pool) pour autoriser la charge de travail. Une fois qu'une charge de travail a été autorisée par un pool d'identités de charge de travail, elle peut accéder aux données confidentielles des collaborateurs et les traiter.
De plus, les collaborateurs de données doivent choisir où stocker les résultats de la charge de travail Confidential Space et indiquer si ces résultats sont propres à chaque collaborateur ou partagés. Par exemple, vous pouvez choisir d'envoyer le même résultat à 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 stockant 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 un compte principal dans votre propre projet. Vous pouvez lui attribuer des rôles IAM pour lui donner accès à des ressources spécifiques ou lui permettre d'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 pool d'identités de charge de travail 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 :
Service d'attestation : ce service vérifie que la charge de travail est une instance de VM confidentielle 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é. Il doit correspondre au service d'attestation ajouté au fournisseur de pool d'identités de charge de travail pour que l'accès soit accordé.
Mappages d'attributs : attributs des jetons d'accès Security Token Service mappés aux assertions effectuées par l'entité d'authentification (dans le cas présent, 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 journaux d'audit dans Cloud Logging et pour accorder des rôles via IAM sur la base des assertions d'entité d'authentification, telles que les digests de conteneur d'image 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 qui s'authentifient doivent remplir pour obtenir l'accès, en fonction des assertions qu'elles font.
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 charge de travail, qui vérifie l'instance de VM confidentielle, 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. Le fournisseur l'utilise pour vérifier que les assertions respectent la règle d'attestation définie dans le fournisseur. Si tel 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és 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 consiste à configurer une identité fédérée dans un fournisseur WIP associé aux assertions d'une entité d'authentification. De cette façon, une charge de travail peut être autorisée à accéder directement aux ressources 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 de 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, comme déterminé 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 donner à un utilisateur malintentionné 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 dont l'identité peut être empruntée et qui peut être partagé 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 de projet à partir duquel la charge de travail fonctionne et l'ID de l'instance de VM exécutant la charge de travail, ce qui fournit un journal d'audit plus détaillé.
Vous n'avez pas besoin de mapper la propriété
selfLink
de l'instance de VM à l'attributgoogle.subject
dans un fournisseur WIP. Les valeursselfLink
trè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é de 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 pool d'identités de charge de travail. Ils spécifient également le compte de service de charge de travail dans leur fournisseur WIP, ce qui permet au compte de service de charge de travail d'emprunter l'identité des comptes de service des collaborateurs de données afin de pouvoir récupérer et traiter leurs données confidentielles.
L'emprunt d'identité d'un compte de service ne doit être utilisé que dans les cas suivants :
Lorsque vous devez utiliser des signatures d'image comme identifiant 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.
Il est possible que la méthode d'emprunt d'identité du compte de service ne parvienne pas à 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 consiste à configurer un pool d'identités de charge de travail et un fournisseur, puis à 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, suivez les instructions ci-dessous :
Créez le WIP :
gcloud iam workload-identity-pools create DATA_COLLABORATOR_POOL_NAME \ --location=global
Cré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="https://confidentialcomputing.googleapis.com/" \ --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 :
issuer-uri
surhttps://confidentialcomputing.googleapis.com/
, ce qui signifie que Google Cloud Attestation est utilisé comme service d'attestation.allowed-audiences
surhttps://sts.googleapis.com
. Il s'agit du service de jetons de sécurité de Google, qui échange des identifiants contre des jetons d'accès.Un
attribute-mapping
degoogle.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_digest
Cette valeur est construite à l'aide du CEL (Common Expression Language). Les valeurs suivantes sont attribuées à l'attribut
gcpcs
et s'affichent dans Cloud Logging chaque fois que la charge de travail accède à des 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_digest
est défini surassertion.submods.container.image_digest
, le condensé de l'image du conteneur de charge de travail. Cet attribut est mappé pour vous permettre d'accorder 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.subject
soit inférieure à 127 octets.Les
attribute-conditions
suivants, qui constituent 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 découvrir d'autres conditions d'attributs que vous pouvez utiliser, consultez Créer une règle d'attestation.
Accorder les rôles IAM à l'identité fédérée
Une fois que vous avez créé un fournisseur de pool d'identités de charge de travail, vous pouvez accorder à l'identité fédérée un rôle IAM en fonction de la correspondance entre le résumé du conteneur d'image de charge de travail de l'identité et 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é de compte de service implique les éléments suivants :
Créez des comptes de service dans chacun des projets de collaborateurs de données, puis accordez-leur l'autorisation de déchiffrer les données confidentielles.
Créez des pools d'identités de charge de travail dans chacun des projets de collaborateurs de données, puis associez le compte de service de chaque projet qui vient d'être créé à son pool d'identités de charge de travail.
Créez des fournisseurs d'identité de charge de travail dans chaque pool d'identités de charge de travail, en spécifiant le compte de service de charge de travail comme compte autorisé à emprunter l'identité des comptes de service de collaborateurs de données.
Configurer des comptes de service pour déchiffrer les données confidentielles
Créez les comptes de service dans les projets de collaborateurs de données :
gcloud iam service-accounts create DATA_COLLABORATOR_SERVICE_ACCOUNT_NAME
Accordez aux comptes de service les autorisations nécessaires pour déchiffrer les données confidentielles. Par exemple, vous pouvez chiffrer des fichiers confidentiels dans Cloud Storage avec Cloud KMS. Vous devez donc accorder au compte de service l'autorisation de 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 fournisseur et un WIP, suivez les instructions ci-dessous dans chaque projet de collaborateur de données :
Créez le WIP :
gcloud iam workload-identity-pools create DATA_COLLABORATOR_POOL_NAME \ --location=global
Associez le compte de service qui sera utilisé pour l'usurpation d'identité au pool d'identités 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.workloadIdentityUser
Créez un fournisseur OIDC dans le pool d'identités de charge de travail et définissez-y le compte de service de 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 :
issuer-uri
surhttps://confidentialcomputing.googleapis.com/
, ce qui signifie que Google Cloud Attestation est utilisé comme service d'attestation.allowed-audiences
surhttps://sts.googleapis.com
. Il s'agit du service de jetons de sécurité de Google, qui échange des identifiants contre des jetons d'accès.Un
attribute-mapping
degoogle.subject
, avec la valeurassertion.sub
. Il s'agit de l'selfLink
de l'instance de VM, tel que défini dans la revendicationsub
du jeton d'attestation.L'instance de VM
selfLink
s'affiche dans Cloud Logging chaque fois que la charge de travail accède à des ressources.Les
attribute-conditions
suivants, qui constituent 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 du conteneur de 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 découvrir d'autres conditions d'attributs que vous pouvez utiliser, consultez Créer une règle d'attestation.
Créer une règle d'attestation
Pour créer un pool d'identités de charge de travail, vous devez créer une règle d'attestation. Les assertions d'une entité d'authentification doivent correspondre à votre règle 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 du 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 doit utiliser une image Confidential Space STABLE
et que la zone dans laquelle l'instance de VM de charge de travail s'exécute doit être 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 faites par l'image Confidential Space, le conteneur de charge de travail et l'instance de VM.
Affirmations concernant les images
Assertion | Type | Description |
---|---|---|
Interagit avec :
|
Chaîne définie |
Vérifie que l'image Confidential Space est la version de débogage ou de 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 de 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. Il existe trois attributs de compatibilité :
ExempleLe code suivant vérifie qu'une version stable de l'image Confidential Space est utilisée :
|
assertion.swname |
Chaîne définie |
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 de conteneur
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. ExempleLe 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. ExemplesLe 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 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 :
|
Chaîne définie |
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 :
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 |
Valide 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 |
Permet de vérifier que la VM exécute un projet Google Cloud avec l'ID de 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 :
|
Chaîne définie |
Vérifie l'état du pilote informatique confidentielle de NVIDIA. Les valeurs valides sont les suivantes :
Exemple
|