Configurer le chiffrement avec des clés de chiffrement gérées par le client

Cloud Composer 1 | Cloud Composer 2

Cette page explique comment protéger les environnements Cloud Composer à l'aide des clés de chiffrement gérées par le client (CMEK). Les clés de chiffrement gérées par le client permettent de chiffrer/déchiffrer les données utilisateur dans l'environnement.

Avant de commencer

  • Vous ne pouvez configurer les CMEK que lorsque vous créez un environnement. Il n'est pas possible d'activer CMEK pour un environnement existant.

  • Cloud Composer accepte le chiffrement CMEK à l'aide de clés stockées dans des gestionnaires de clés externes.

  • Vous devez créer une clé CMEK dans la même région que celle de vos environnements. Vous ne pouvez pas utiliser de clés multirégionales ou globales.

  • Si vous souhaitez que votre environnement s'exécute à l'intérieur d'un périmètre VPC Service Controls, vous devez ajouter les API Cloud Key Management Service et Artifact Registry au périmètre.

  • Activez l'API Artifact Registry.

    Console

    Activez l'API Artifact Registry

    Activer l'API

    gcloud

    Activer l'API Artifact Registry :

    gcloud services enable artifactregistry.googleapis.com

Informations utilisateur non protégées par le chiffrement CMEK

Cloud Monitoring n'est pas compatible avec le chiffrement CMEK. Le nom de votre environnement et celui des DAG sont stockés dans la base de données Monitoring sous forme chiffrée à l'aide de clés de chiffrement gérées par Google.

Cloud Composer stocke les informations suivantes protégées par des clés gérées par Google, et non par des clés gérées par le client:

  • Nom de l'environnement
  • Remplacements de configuration Airflow
  • Variables d'environnement
  • Descriptions des plages d'adresses IP autorisées
  • Plages d'adresses IP
  • Étiquettes
  • Les noms de certains paramètres stockés par Cloud Composer peuvent inclure une sous-chaîne du nom de l'environnement.

Utiliser une clé de chiffrement gérée par le client pour votre environnement

Étape 1. Créer une clé de chiffrement gérée par le client

Suivez la procédure décrite dans la section Créer des clés de chiffrement symétriques pour créer une clé dans la région où se trouve votre environnement.

Étape 2. Attribuer des rôles aux agents de service

Console

Ignorez cette étape. Vous accordez des autorisations aux agents de service lorsque vous spécifiez une clé pour votre environnement.

gcloud

Les agents de service suivants doivent disposer du rôle Chiffreur/Déchiffreur de CryptoKeys Cloud KMS sur la clé que vous utilisez pour votre environnement.

Remplacez PROJECT_NUMBER par le numéro de votre projet.

Nom de l'agent de service Adresse e-mail du compte de service Nom de service de l'API
Agent de service Cloud Composer service-PROJECT_NUMBER@cloudcomposer-accounts.iam.gserviceaccount.com composer.googleapis.com
Agent de service Artifact Registry service-PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com artifactregistry.googleapis.com
Agent de service Kubernetes Engine service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com container.googleapis.com
Agent de service Pub/Sub service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com pubsub.googleapis.com
Agent de service Compute Engine service-PROJECT_NUMBER@compute-system.iam.gserviceaccount.com compute.googleapis.com
Agent de service Cloud Storage service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com Accorder des autorisations de chiffrement/déchiffrement avec gsutil kms authorize
  1. (Si nécessaire) Si certains de ces comptes de service ne sont pas présents dans votre projet, cela signifie qu'aucune identité n'a encore été créée pour ce service. Cela peut se produire, par exemple, si vous n'avez pas encore créé d'environnement Cloud Composer dans votre projet.

    Pour ajouter ces comptes de service, créez des identités pour les services répertoriés à l'aide de la commande suivante:

    gcloud beta services identity create \
      --service=API_SERVICE_NAME
    

    Remplacez API_SERVICE_NAME par le nom de service de l'API d'un service qui n'a pas de compte de service dans votre projet.

    Exemple :

    gcloud beta services identity create \
      --service=composer.googleapis.com
    
  2. Accordez des autorisations aux agents de service:

    1. Attribuez le rôle à l'agent de service Cloud Composer:

      gcloud kms keys add-iam-policy-binding KEY_NAME \
        --location KEY_LOCATION \
        --keyring KEY_RING_NAME \
        --member=serviceAccount:service-PROJECT_NUMBER@cloudcomposer-accounts.iam.gserviceaccount.com \
        --role=roles/cloudkms.cryptoKeyEncrypterDecrypter \
        --project KEY_PROJECT_ID
      
    2. Attribuez le rôle à l'agent de service Artifact Registry:

      gcloud kms keys add-iam-policy-binding KEY_NAME \
        --location KEY_LOCATION \
        --keyring KEY_RING_NAME \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com \
        --role=roles/cloudkms.cryptoKeyEncrypterDecrypter \
        --project KEY_PROJECT_ID
      
    3. Attribuez le rôle à l'agent de service GKE:

      gcloud kms keys add-iam-policy-binding KEY_NAME \
        --location KEY_LOCATION \
        --keyring KEY_RING_NAME \
        --member=serviceAccount:service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com \
        --role=roles/cloudkms.cryptoKeyEncrypterDecrypter \
        --project KEY_PROJECT_ID
      
    4. Attribuez le rôle à l'agent de service Pub/Sub:

      gcloud kms keys add-iam-policy-binding KEY_NAME \
        --location KEY_LOCATION \
        --keyring KEY_RING_NAME \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/cloudkms.cryptoKeyEncrypterDecrypter \
        --project KEY_PROJECT_ID
      
    5. Attribuez le rôle à l'agent de service Compute Engine:

      gcloud kms keys add-iam-policy-binding KEY_NAME \
        --location KEY_LOCATION \
        --keyring KEY_RING_NAME \
        --member=serviceAccount:service-PROJECT_NUMBER@compute-system.iam.gserviceaccount.com \
        --role=roles/cloudkms.cryptoKeyEncrypterDecrypter \
        --project KEY_PROJECT_ID
      
    6. Accordez des autorisations de chiffrement/déchiffrement à l'agent de service Cloud Storage. Vous pouvez ignorer cette étape si vous utilisez un bucket d'environnement personnalisé.

      gsutil kms authorize -k \
        projects/KEY_PROJECT_ID/locations/KEY_LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/KEY_NAME
      

    Remplacez :

    • PROJECT_ID par l'ID de votre projet.
    • KEY_PROJECT_ID par l'ID du projet dans lequel votre clé gérée par le client est stockée ; Si vous utilisez une clé d'un autre projet, cette valeur est différente de l'ID de votre projet. Si vous utilisez une clé d'un même projet, cette valeur correspond à l'ID de votre projet.
    • PROJECT_NUMBER par le numéro de votre projet.
    • KEY_LOCATION par l'emplacement de la clé gérée par le client. Cet emplacement doit être identique à celui de votre environnement.
    • KEY_NAME par le nom de votre clé gérée par le client ;
    • KEY_RING_NAME par le trousseau qui stocke votre clé gérée par le client ;

    Pour obtenir ces valeurs, vous pouvez exécuter les commandes gcloud projects describe, gcloud kms keyrings list et gcloud kms keys describe.

Étape 3. Créer un environnement avec CMEK

Une fois que vous avez créé une clé de chiffrement gérée par le client, vous pouvez l'utiliser pour créer des environnements Cloud Composer.

Console

Lorsque vous créez un environnement:

  1. Dans la section Chiffrement des données, sélectionnez Clé de chiffrement gérée par le client (CMEK).

  2. Dans la liste déroulante Sélectionner une clé gérée par le client, choisissez votre clé.

  3. Si une configuration supplémentaire est requise, un message s'affiche pour vous en informer. Dans ce cas:

    1. Cliquez sur Ouvrir l'assistant.

    2. Dans la boîte de dialogue Préparer la clé CMEK à utiliser dans Cloud Composer, affichez la liste des agents de service qui doivent disposer du rôle Chiffreur/Déchiffreur de CryptoKeys Cloud KMS sur la clé.

    3. Pour attribuer les rôles et les autorisations requis, cliquez sur Attribuer.

gcloud

L'argument --kms-key spécifie une clé de chiffrement gérée par le client pour votre environnement.

Pour en savoir plus sur la création d'environnements, consultez Créer des environnements. Par exemple, vous pouvez spécifier d'autres paramètres pour votre environnement.

gcloud composer environments create ENVIRONMENT_NAME \
  --location LOCATION \
  --image-version IMAGE_VERSION \
  --kms-key projects/KEY_PROJECT_ID/locations/KEY_LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/KEY_NAME

Remplacez :

  • ENVIRONMENT_NAME par le nom de l'environnement.
  • IMAGE_VERSION par le nom de l'image Cloud Composer.
  • KEY_PROJECT_ID par l'ID du projet dans lequel se trouve la clé ; Si vous utilisez une clé d'un autre projet, cette valeur est différente de l'ID de votre projet. Si vous utilisez une clé du même projet, cette valeur correspond à l'ID de votre projet.
  • LOCATION par la région dans laquelle se trouve l'environnement.
  • KEY_LOCATION par l'emplacement de votre clé gérée par le client ; Cet emplacement doit être identique à celui de votre environnement.
  • KEY_NAME par le nom de votre clé gérée par le client ;
  • KEY_RING_NAME par le trousseau qui stocke votre clé gérée par le client ;

Exemple :

gcloud composer environments create example-environment \
  --location us-central1 \
  --image-version composer-2.6.6-airflow-2.6.3 \
  --kms-key projects/example-project/locations/us-central1/keyRings/example-key-ring/cryptoKeys/example-key

Afficher la configuration du chiffrement de l'environnement

Vous pouvez afficher la configuration du chiffrement pour un environnement existant:

Console

  1. Dans la console Google Cloud, accédez à la page Environnements.

    Accéder à la page Environnements

  2. Dans la liste des environnements, cliquez sur le nom de votre environnement. La page Détails de l'environnement s'ouvre.

  3. Accédez à l'onglet Configuration de l'environnement.

  4. Pour en savoir plus sur le chiffrement, consultez l'article Clé de chiffrement des données.

gcloud

Exécutez la commande gcloud suivante pour afficher la configuration du chiffrement

gcloud composer environments describe \
  ENVIRONMENT_NAME \
  --location LOCATION \
  --format="value(config.encryptionConfig)"

Remplacez :

  • ENVIRONMENT_NAME par le nom de l'environnement.
  • LOCATION par la région dans laquelle se trouve l'environnement.

Exemple :

gcloud composer environments describe \
  example-environment \
  --location us-central1 \
  --format="value(config.encryptionConfig)"

Utiliser CMEK pour les journaux Cloud Composer

Cloud Logging permet de chiffrer le stockage de journaux à l'aide de clés CMEK. Nous vous recommandons de suivre la procédure CMEK standard pour chiffrer les journaux à l'aide de clés CMEK.

Pour chiffrer les journaux à l'aide de clés CMEK, suivez les instructions de la section Gérer les clés qui protègent les données de stockage Logging.

Rediriger les journaux Cloud Composer vers un bucket Cloud Storage chiffré par CMEK

Si vous pensez que vos journaux contiennent des données sensibles, vous pouvez rediriger les journaux Cloud Composer vers un bucket Cloud Storage chiffré par CMEK à l'aide du routeur de journaux. Cela empêche l'envoi de journaux à Monitoring.

Si vous avez besoin de l'aide de Cloud Customer Care, vous devrez peut-être accorder aux ingénieurs de l'assistance Google l'accès aux journaux Cloud Composer stockés dans Cloud Storage.

gcloud

  1. Créer un bucket Cloud Storage pour stocker les journaux

    gsutil mb -l LOCATION gs://BUCKET_NAME
    

    Remplacez :

    • LOCATION par la région dans laquelle se trouve l'environnement.
    • BUCKET_NAME par le nom du bucket ;

    Exemple :

    gsutil mb -l us-central1 gs://composer-logs-us-central1-example-environment
    
  2. Chiffrez le bucket avec votre clé CMEK.

    gsutil kms encryption \
      -k projects/KEY_PROJECT_ID/locations/KEY_LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/KEY_NAME \
      gs://BUCKET_NAME
    

    Remplacez :

    • KEY_PROJECT_ID par l'ID du projet dans lequel se trouve la clé ; Si vous utilisez une clé d'un autre projet, cette valeur est différente de l'ID de votre projet. Si vous utilisez une clé du même projet, cette valeur correspond à l'ID de votre projet.
    • KEY_LOCATION par l'emplacement de votre clé gérée par le client ; Cet emplacement doit être identique à celui de votre environnement.
    • KEY_RING_NAME par le trousseau qui stocke votre clé gérée par le client ;
    • KEY_NAME par le nom de votre clé gérée par le client ;
    • BUCKET_NAME par le nom du bucket.

    Exemple :

    gsutil kms encryption \
      -k projects/example-project/locations/us-central1/keyRings/example-key-ring/cryptoKeys/example-key \
      gs://composer-logs-us-central1-example-environment
    
  3. Créez un récepteur de journaux.

    gcloud logging sinks create \
    composer-log-sink-ENVIRONMENT_NAME \
    storage.googleapis.com/BUCKET_NAME \
    --log-filter "resource.type=cloud_composer_environment AND resource.labels.environment_name=ENVIRONMENT_NAME AND resource.labels.location=LOCATION"
    

    Remplacez :

    • ENVIRONMENT_NAME par le nom de l'environnement.
    • LOCATION par la région dans laquelle se trouve l'environnement.
    • BUCKET_NAME par le nom du bucket.

    Exemple :

    gcloud logging sinks create \
    composer-log-sink-example-environment \
    storage.googleapis.com/composer-logs-us-central1-example-environment \
    --log-filter "resource.type=cloud_composer_environment AND resource.labels.environment_name=example-environment AND resource.labels.location=us-central1"
    
  4. Attribuez au compte de service le rôle Créateur des objets Storage sur ce bucket. Le compte de service apparaît dans le résultat de la commande précédente).

    gcloud projects add-iam-policy-binding \
      PROJECT_ID \
      --member="serviceAccount:LOGGING_SERVICE_AGENT" \
      --role="roles/storage.objectCreator" \
      --condition=None
    

    Remplacez :

    • PROJECT_ID par l'ID du projet.
    • LOGGING_SERVICE_AGENT par le compte de l'agent de service Logging pour ce bucket. Le nom de ce compte est obtenu à l'étape précédente.

    Exemple :

    gcloud projects add-iam-policy-binding \
      example-project \
      --member="serviceAccount:example-sa@gcp-sa-logging.iam.gserviceaccount.com" \
      --role="roles/storage.objectCreator" \
      --condition=None
    
  5. Excluez les journaux de votre nouvel environnement de Monitoring.

    gcloud beta logging sinks update _Default \
      --add-exclusion name=ENVIRONMENT_NAME-exclusion,filter="resource.type=cloud_composer_environment AND resource.labels.environment_name=ENVIRONMENT_NAME AND resource.labels.location=LOCATION"
    

    Remplacez :

    • ENVIRONMENT_NAME par le nom de l'environnement.
    • LOCATION par la région dans laquelle se trouve l'environnement.

    Exemple :

    gcloud beta logging sinks update _Default \
      --add-exclusion name=example-environment-exclusion,filter="resource.type=cloud_composer_environment AND resource.labels.environment_name=example-environment AND resource.labels.location=us-central1"
    
  6. Ajoutez le chiffrement CMEK au niveau de l'organisation au routeur de journaux.

    gcloud logging cmek-settings describe \
      --organization=ORGANIZATION_ID
    
    gcloud kms keys add-iam-policy-binding \
          --project=KEY_PROJECT_ID \
          --member LOGGING_SERVICE_AGENT \
          --role roles/cloudkms.cryptoKeyEncrypterDecrypter \
          --location=KEY_LOCATION \
          --keyring=KEY_RING_NAME \
          KEY_NAME
    
    gcloud logging cmek-settings update \
      --organization=ORGANIZATION_ID \
      --kms-project=KEY_PROJECT_ID \
      --kms-keyring=KEY_RING_NAME \
      --kms-location=KEY_LOCATION \
      --kms-key-name=KEY_NAME
    

    Remplacez :

    • ORGANIZATION_ID par votre ID d'organisation.
    • KEY_PROJECT_ID par l'ID du projet dans lequel se trouve la clé ; Si vous utilisez une clé d'un autre projet, cette valeur est différente de l'ID de votre projet. Si vous utilisez une clé du même projet, cette valeur correspond à l'ID de votre projet.
    • KEY_RING_NAME par le trousseau qui stocke votre clé gérée par le client ;
    • KEY_LOCATION par l'emplacement de votre clé gérée par le client ; Cet emplacement doit être identique à celui de votre environnement.
    • KEY_NAME par le nom de votre clé gérée par le client ;

Rotation de la clé CMEK pour Cloud Composer

Une fois que vous avez configuré le chiffrement dans votre environnement à l'aide de clés CMEK, vous devez également envisager d'alterner régulièrement ces clés, comme décrit dans la documentation KMS.

Lorsque vous effectuez la rotation d'une clé CMEK, les données chiffrées à l'aide d'une version de clé précédente ne sont pas automatiquement chiffrées à nouveau avec la nouvelle version. Pour en savoir plus sur le rechiffrement des données, cliquez ici. Cela s'applique plus particulièrement aux services suivants:

  • objets stockés dans le bucket de l'environnement

  • données stockées dans la base de données de métadonnées Airflow

  • des images de conteneurs stockées dans des dépôts Artifact Registry

et tous les autres objets de données chiffrés avec CMEK dans l'environnement Cloud Composer.

Étapes suivantes