Utiliser les clés de chiffrement gérées par le client

Cet article explique comment protéger les images de conteneur déployées sur les services Cloud Run à l'aide des clés de chiffrement gérées par le client (CMEK) de Cloud KMS. Vous pouvez utiliser cette fonctionnalité pour protéger les conteneurs importés par Cloud Run avec une clé CMEK au repos.

Vous devez tenir compte des points suivants :

  • Les métadonnées des fichiers, tels que le chemin d'accès, ne sont pas chiffrées.
  • Les métadonnées du service Cloud Run, telles que les variables de nom ou d'environnement, ne sont pas chiffrées à l'aide de la clé fournie, mais avec une clé appartenant à Google et gérée par Google.
  • Lors de l'exécution, la mémoire et le contenu des fichiers ne sont pas chiffrés.
  • Si une clé CMEK est désactivée, les nouvelles instances de révisions Cloud Run existantes qui utilisent cette clé ne démarrent pas.
  • Si une clé CMEK est désactivée, le déploiement d'une nouvelle révision Cloud Run échouera, sauf si une nouvelle clé valide est utilisée.

Étant donné que la clé CMEK est sous votre contrôle et n'est pas contrôlée par Google, personne, y compris Google, ne peut accéder aux données protégées par ces clés de chiffrement lorsque les clés sont désactivées ou détruites.

L'utilisation de CMEK génère des journaux d'audit. Pour en savoir plus, consultez la page Comprendre les journaux d'audit et les messages d'erreur.

Quotas Cloud KMS et Cloud Run

Vous pouvez définir votre CMEK sur l'un des niveaux de protection disponibles pour indiquer comment les opérations de chiffrement sont effectuées. Lorsque vous utilisez des clés de chiffrement gérées par le client (CMEK) dans Cloud Run, vos projets peuvent consommer des quotas de requêtes de chiffrement Cloud KMS. Par exemple, les dépôts chiffrés par CMEK peuvent utiliser ces quotas pour chaque importation ou téléchargement.

Les opérations de chiffrement et de déchiffrement utilisant des clés CMEK affectent les quotas de Cloud KMS de différentes manières :

  • Pour les clés CMEK logicielles générées dans Cloud KMS, aucun quota Cloud KMS n'est consommé.
  • Pour les clés CMEK matérielles, parfois appelées clés Cloud HSM, les opérations de chiffrement et de déchiffrement sont comptabilisées dans les quotas Cloud HSM dans le projet qui contient la clé.
  • Pour les clés CMEK externes (parfois appelées clés Cloud EKM), les opérations de chiffrement et de déchiffrement sont comptabilisées dans les quotas Cloud EKM du projet qui contient la clé.

Pour en savoir plus, consultez la page Quotas Cloud KMS.

Impact de la fonctionnalité CMEK sur le comportement de l'autoscaling

Le comportement d'autoscaling attendu pour votre service Cloud Run peut être affecté lorsque vous utilisez des clés de chiffrement gérées par le client. Par exemple, la latence de démarrage des nouvelles instances peut augmenter en raison des délais de communication avec les systèmes de gestion de clés externes pour les opérations de clés.

Le tableau suivant montre les changements de comportement possibles liés à l'utilisation de la fonctionnalité CMEK :

Opération CMEK Comportement d'autoscaling
Clé désactivée/détruite/révoquée Les nouvelles instances ne démarrent pas.
Impossible de contacter le gestionnaire de clés externe Si la requête de clé peut être relancée, aucune instance n'est arrêtée lors des nouvelles tentatives et aucune nouvelle instance ne démarre. Le scaling horizontal peut prendre plus de temps que prévu.
Si la requête de clé ne peut pas être relancée, aucune nouvelle instance n'est démarrée et les instances en cours d'exécution sont arrêtées après un délai d'attente.
Quota KMS dépassé Si ce quota est dépassé, des erreurs RESOURCE_EXHAUSTED sont consignées et les nouvelles instances ne démarrent pas. Pour résoudre ce problème, vous pouvez demander un quota supplémentaire.

Avant de commencer

Autoriser Cloud Run à accéder à une clé

Pour utiliser CMEK pour Cloud Run, procédez comme suit :

  1. Configurez Artifact Registry pour utiliser CMEK.

  2. En utilisant le guide de démarrage rapide pour Docker d'Artifact Registry comme référence, créez un dépôt Docker pour y transférer une image.

  3. Utilisez une clé symétrique Cloud KMS existante ou créez une clé symétrique.

  4. Pour autoriser Cloud Run à accéder à la clé, accordez à l'agent de service Cloud Run le rôle Chiffreur/Déchiffreur de CryptoKeys Cloud KMS :

    Console

    1. Accédez à la page Clés de chiffrement.

    2. Cliquez sur le trousseau de clés pour ouvrir la page de la liste des clés.

    3. Sélectionnez la clé, puis cliquez sur Ajouter une entité principale dans l'onglet des autorisations situé à droite.

    4. Dans le champ Nouvelles entités principales, copiez l'adresse e-mail de l'agent de service Cloud Run. Elle porte le suffixe suivant :

      PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com.

    5. Dans le champ Sélectionner un rôle, sélectionnez Chiffreur/Déchiffreur de CryptoKeys Cloud KMS.

    6. Cliquez sur Enregistrer.

    gcloud

    Exécutez la commande gcloud kms suivante :

    gcloud kms keys add-iam-policy-binding KEY_NAME \
    --keyring=KEYRING \
    --location=LOCATION) \
    --member serviceAccount:PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com \
    --role='roles/cloudkms.cryptoKeyEncrypterDecrypter'

    Remplacer

    • KEY_NAME par le nom de votre clé.
    • KEYRING par le nom de votre trousseau de clés.
    • LOCATION par le nom de votre région.
    • PROJECT_NUMBER par le numéro du projet dans lequel vous souhaitez déployer le service Cloud Run.

    Vous devez disposer des autorisations nécessaires pour administrer les ressources Cloud KMS du projet Google Cloud afin d'accorder le rôle IAM roles/cloudkms.cryptoKeyEncrypterDecrypter. Seuls les membres IAM dotés du rôle de propriétaire (roles/owner) ou d'administrateur Cloud KMS (roles/cloudkms.admin) peuvent accorder ou révoquer l'accès aux ressources Cloud KMS.

Configurer le chiffrement CMEK pour un service Cloud Run

Tout changement de configuration entraîne la création d'une révision. Les révisions ultérieures obtiennent aussi automatiquement le même paramètre de configuration, à moins que vous ne le mettiez explicitement à jour.

Console

  1. Dans la console Google Cloud, accédez à Cloud Run :

    Accédez à Cloud Run

  2. Cliquez sur Déployer un conteneur et sélectionnez Service pour configurer un nouveau service. Si vous configurez un service existant, cliquez sur celui-ci puis sur Modifier et déployer la nouvelle révision.

  3. Si vous configurez un nouveau service, remplissez la page initiale des paramètres du service, puis cliquez sur Conteneur(s), volumes, mise en réseau et sécurité pour développer la page de configuration du service.

  4. Cliquez sur l'onglet Sécurité.

    image

    • Sous Chiffrement :
      1. Sélectionnez Clé de chiffrement gérée par le client (CMEK).
      2. Dans le menu Sélectionner une clé gérée par le client, choisissez l'une des options suivantes :
        • Sélectionnez Changer de projet si vous devez utiliser une clé provenant d'un autre projet. Vous pouvez référencer une clé d'un autre projet si le compte de service de votre projet peut accéder à la clé pour les opérations de chiffrement et de déchiffrement.

        • Sélectionnez Saisir la clé manuellement pour saisir le secret d'un projet, au format suivant : projects/PROJECT_NAME/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME.

        Pour copier et coller le nom de la ressource d'un autre projet auquel vous avez accès, procédez comme suit :

        • Accédez à la page Clés de chiffrement.
        • Cliquez sur le trousseau de clés.
        • Sélectionnez le nom du trousseau de clés choisi, puis cliquez sur Actions.
        • Sélectionnez Copier le nom de la ressource dans le menu et collez-le dans le champ Nom de ressource de la clé à l'étape précédente.

      3. Dans le menu du Action en cas de révocation de clé, choisissez l'une des options suivantes :
        • Empêcher la nouvelle instance de conteneur : aucune nouvelle instance ne démarre après la révocation de la clé CMEK.

        • Arrêter dès que possible : aucune nouvelle instance ne démarre et les instances existantes s'arrêtent après la révocation de la clé CMEK.

        • Délai d'arrêt personnalisé : spécifiez le nombre d'heures avant l'arrêt du service.

  5. Cliquez sur Créer ou Déployer.

gcloud

Pour définir une clé sur un service, utilisez l'une des commandes suivantes :

gcloud run deploy SERVICE \
--image IMAGE_URL \
--key KEY \
--post-key-revocation-action-type KEY_REVOCATION_ACTION
--encryption-key-shutdown-hours SHUTDOWN_HOURS
gcloud run services update SERVICE --key KEY
--post-key-revocation-action-type KEY_REVOCATION_ACTION
--encryption-key-shutdown-hours SHUTDOWN_HOURS

Remplacer

  • SERVICE par le nom de votre service.
  • IMAGE_URL par une référence à l'image de conteneur, par exemple us-docker.pkg.dev/cloudrun/container/hello:latest. Si vous utilisez Artifact Registry, le dépôt REPO_NAME doit déjà être créé. L'URL se présente sous la forme suivante : LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
  • KEY par le nom complet de la clé, au format suivant : projects/PROJECT_NAME/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME.
  • KEY_REVOCATION_ACTION par shut-down ou prevent-new, en fonction de vos préférences de révocation de clé.
  • SHUTDOWN_HOURS par le délai d'arrêt avant la fermeture du service après la révocation.

YAML

  1. Si vous créez un service, ignorez cette étape. Si vous mettez à jour un service existant, téléchargez sa configuration YAML :

    gcloud run services describe SERVICE --format export > service.yaml
  2. Mettez à jour les annotations CMEK suivantes avec les valeurs souhaitées :

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/encryption-key: projects/PROJECT_NAME/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME
            run.googleapis.com/post-key-revocation-action-type: KEY_REVOCATION_ACTION
            run.googleapis.com/encryption-key-shutdown-hours: SHUTDOWN_HOURS
          name: REVISION

    Remplacer

    • SERVICE par le nom de votre service Cloud Run ;
    • PROJECT_NAME par le nom du projet dans lequel la clé a été créée.
    • LOCATION par l'emplacement dans lequel la clé a été créée. Doit correspondre à l'emplacement du service Cloud Run.
    • KEYRING_NAME par le nom du trousseau de clés.
    • KEY_NAME par le nom de la clé.
    • KEY_REVOCATION_ACTION par shut-down ou prevent-new, en fonction de vos préférences de révocation de clé.
    • SHUTDOWN_HOURS par le délai d'arrêt avant la fermeture du service après la révocation.
    • REVISION par un nouveau nom de révision ou supprimez-le (le cas échéant). Si vous indiquez un nouveau nom de révision, il doit répondre aux critères suivants :
      • Commencer par SERVICE-
      • Ne contenir que des lettres minuscules, des chiffres et -
      • Ne pas se terminer par -
      • Ne pas dépasser 63 caractères
  3. Remplacez la configuration du service en utilisant la commande suivante :

    gcloud run services replace service.yaml

Afficher les paramètres de sécurité

Pour afficher les paramètres actuels de sécurité pour votre service Cloud Run, procédez comme suit :

Console

  1. Dans la console Google Cloud, accédez à Cloud Run :

    Accédez à Cloud Run

  2. Cliquez sur le service qui vous intéresse pour ouvrir la page Informations sur le service.

  3. Cliquez sur l'onglet Révisions.

  4. Dans le panneau de détails situé à droite, le paramètre de sécurité est répertorié sous l'onglet Sécurité.

gcloud

  1. Exécutez la commande suivante :

    gcloud run services describe SERVICE
  2. Recherchez le paramètre de sécurité dans la configuration renvoyée.

Tester la révocation des CMEK

  1. Exécutez la commande suivante pour vérifier que le service est accessible :

    curl SERVICE_URL

    Remplacez SERVICE_URL par l'URL du service. Vous pouvez la trouver dans l'interface utilisateur de la console après le déploiement : l'URL du conteneur s'affiche à côté du texte URL :.

  2. Désactivez la version de clé

  3. Attendez que s'écoule le délai que vous avez spécifié pour SHUTDOWN_HOURS. Si vous ne l'avez pas spécifié, réactivez votre clé, puis modifiez ou redéployez votre service en définissant la valeur sur le minimum d'une heure.

  4. Après avoir attendu la durée spécifiée pour SHUTDOWN_HOURS, exécutez à nouveau la commande suivante et vérifiez que le service n'est plus accessible :

curl SERVICE_URL

Comprendre les journaux d'audit et les messages d'erreur

Si vous êtes responsable de la surveillance des journaux d'audit, l'une de vos tâches peut consister à vérifier les opérations CMEK dans votre service Cloud Run. Dans ce cas, vous devez comprendre les journaux d'audit associés.

Si vous êtes responsable du traitement et de la correction des erreurs d'exécution pour votre service Cloud Run, vous devrez peut-être résoudre les erreurs CMEK consignées lors du fonctionnement du service Cloud Run.

Les sections suivantes fournissent les informations nécessaires pour effectuer les tâches ci-dessus.

Journaux d'audit

Les journaux d'audit KMS fournissent une piste d'audit pour chaque opération effectuée avec une clé. Pour les services Cloud Run sur lesquels l'option CMEK est activée, Cloud Run ajoute un contexte d'appelant spécifique à Cloud Run qui détaille la raison pour laquelle le système a accédé à la clé client. Le tableau suivant répertorie les contextes que vous pouvez rencontrer dans les journaux d'audit :

Motif de l'accès à la clé Description
Decrypting CMEK-encrypted layer during container clone start. Consigné chaque fois qu'une nouvelle instance est démarrée.
Encrypting a newly created data-encryption-key w/ the customer-managed-encryption-key. Consigné lors du déploiement d'un service avec CMEK, lorsque la clé CMEK est encapsulée par une clé KMS.
Decrypting an existing encrypted data-encryption-key, under the same customer-managed-encryption-key, to be used to encrypt container contents. Consigné au démarrage d'une nouvelle instance, ce qui nécessite un déchiffrement de l'image.
Performing an encrypt operation on dummy data to check the customer-managed-encryption-key status and access. Consigné chaque fois qu'une vérification de validation est effectuée sur la clé, ce qui arrive régulièrement.
Performing a decrypt operation on dummy data to check the customer-managed-encryption-key status and access. Consigné chaque fois qu'une vérification de validation est effectuée sur la clé, ce qui arrive régulièrement.

Pour en savoir plus sur le format et le contenu des journaux d'audit, consultez la page Journaux d'audit KMS.

Messages d'erreur

Notez que les messages d'erreur fournis par un gestionnaire de clés externe sont directement transmis aux journaux Cloud Run de votre service.

Le tableau suivant répertorie les messages d'erreur liés aux CMEK que vous pouvez rencontrer, accompagnés de descriptions et de solutions possibles.

Message Description
User's service account does not have CMEK decrypter permission. Service account: %s Solution : Autorisez le service à accéder à la clé.
User's KMS operation quota has been exceeded. CMEK key: %s Le service avec CMEK a dépassé les quotas KMS. Solution : Demandez un quota KMS plus élevé
User's CMEK key has been disabled. CMEK key: %s La clé CMEK a été révoquée. Solution : Modifiez la clé CMEK du service et redéployez-le.
User's CMEK key has been destroyed. CMEK key: %s La clé CMEK a été supprimée. Solution : Modifiez la clé CMEK du service et redéployez-le.
User's CMEK key has been scheduled for deletion. CMEK Key: %s La suppression de la clé CMEK a été programmée. Solution : Modifiez la clé CMEK du service et redéployez-le.

Étape suivante