使用客户管理的加密密钥配置加密

Cloud Composer 1 | Cloud Composer 2

本页面介绍如何使用客户管理的加密密钥 (CMEK) 来保护 Cloud Composer 环境。客户管理的加密密钥用于加密/解密环境中的用户数据。

准备工作

  • 您只能在创建环境时配置 CMEK。无法为现有环境启用 CMEK。

  • Cloud Composer 支持使用存储在外部密钥管理器中的密钥进行 CMEK 加密。

  • 您必须在环境所在的区域创建 CMEK 密钥。您不能使用多区域密钥或全局密钥。

  • 如果您希望自己的环境在 VPC Service Controls 边界内运行,则必须将 Cloud Key Management Service API 和 Artifact Registry API 添加到边界中。

  • 启用 Artifact Registry API。

    控制台

    启用 Artifact Registry API。

    启用 API

    gcloud

    启用 Artifact Registry API。

    gcloud services enable artifactregistry.googleapis.com

不受 CMEK 加密保护的用户信息

Cloud Monitoring 不支持 CMEK 加密。您的环境名称和 DAG 名称使用 Google 管理的加密密钥以加密形式存储在 Monitoring 数据库中。

Cloud Composer 会存储以下受 Google 管理的密钥(而非客户管理的密钥)保护的信息:

  • 环境名称
  • Airflow 配置替换
  • 环境变量
  • 允许的 IP 范围的说明
  • IP 范围
  • 标签
  • Cloud Composer 存储的一些参数的名称可以包含环境名称的子字符串。

为您的环境使用客户管理的加密密钥

第 1 步:创建客户管理的加密密钥

按照创建对称加密密钥中列出的步骤,在您的环境所在的区域中创建密钥。

第 2 步:为服务代理授予角色

控制台

跳过此步骤。您可以在为环境指定密钥时向服务代理授予权限。

gcloud

以下服务代理必须在您用于环境的密钥上具有 Cloud KMS CryptoKey Encrypter/Decrypter 角色。

PROJECT_NUMBER 替换为您的项目编号

服务代理 服务帐号电子邮件地址 API 服务名称
Cloud Composer Service Agent service-PROJECT_NUMBER@cloudcomposer-accounts.iam.gserviceaccount.com composer.googleapis.com
Artifact Registry Service Agent service-PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com artifactregistry.googleapis.com
GKE Service Agent service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com container.googleapis.com
Pub/Sub 服务代理 service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com pubsub.googleapis.com
Compute Engine Service Agent service-PROJECT_NUMBER@compute-system.iam.gserviceaccount.com compute.googleapis.com
Cloud Storage 服务代理 service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com 使用 gsutil kms authorize 授予加密/解密权限
  1. (如果需要)如果您的项目中不存在其中某些服务帐号,则表示尚未创建此服务的身份。例如,如果您尚未在项目中创建任何 Cloud Composer 环境时,可能会发生这种情况。

    如需添加这些服务帐号,请使用以下命令为列出的服务创建身份:

    gcloud beta services identity create \
      --service=API_SERVICE_NAME
    

    API_SERVICE_NAME 替换为项目中没有服务帐号的服务的 API 服务名称

    示例:

    gcloud beta services identity create \
      --service=composer.googleapis.com
    
  2. 向服务代理授予权限:

    1. 将该角色授予 Cloud Composer Service Agent:

      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. 将该角色授予 Artifact Registry Service Agent:

      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. 将角色授予 GKE Service Agent:

      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. 向 Pub/Sub Service Agent 授予该角色:

      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. 将该角色授予 Compute Engine Service Agent:

      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. 向 Cloud Storage Service Agent 授予加密/解密权限。

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

    替换:

    • PROJECT_ID 替换为您的项目 ID
    • KEY_PROJECT_ID 替换为存储您客户管理的密钥的项目的 ID。如果您使用其他项目中的密钥,则此值与项目的 ID 不同。如果您使用同一项目中的密钥,则此值是您的项目 ID。
    • PROJECT_NUMBER 替换为您的项目编号
    • KEY_LOCATION 替换为客户管理的密钥位置。此位置必须与您的环境相同。
    • KEY_NAME 替换为您的客户管理的密钥名称。
    • KEY_RING_NAME 替换为用于存储客户管理的密钥的密钥环。

    如需获取这些值,您可以运行 gcloud projects describegcloud kms keyrings listgcloud kms keys describe 命令。

第 3 步:使用 CMEK 创建环境

创建 CMEK 后,您可以使用它来创建 Cloud Composer 环境。

控制台

创建环境时:

  1. 数据加密部分,选择客户管理的加密密钥 (CMEK)

  2. Select a customer-managed key 下拉列表中,选择您的密钥。

  3. 如果需要进行其他设置,系统会显示一则消息来通知您。在这种情况下:

    1. 点击打开向导

    2. 准备 CMEK 密钥以用于 Cloud Composer 对话框中,查看必须对密钥具有 Cloud KMS CryptoKey Encrypter/Decrypter 角色的服务代理列表。

    3. 要授予必要的角色和权限,请点击授予

gcloud

--kms-key 参数指定适用于您的环境的客户管理的加密密钥。

如需详细了解如何创建环境,请参阅创建环境。例如,您可能需要为您的环境指定其他参数。

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

替换:

  • ENVIRONMENT_NAME 替换为环境的名称。
  • IMAGE_VERSION 替换为 Cloud Composer 映像的名称。
  • KEY_PROJECT_ID 替换为密钥所在项目的 ID。如果您使用其他项目中的密钥,则此值与项目 ID 不同。如果您使用同一项目中的密钥,则此值是您的项目 ID。
  • LOCATION 替换为环境所在的区域。
  • KEY_LOCATION 替换为客户管理的密钥的位置。此位置必须与您的环境相同。
  • KEY_NAME 替换为您的客户管理的密钥名称。
  • KEY_RING_NAME 替换为用于存储客户管理的密钥的密钥环。

示例:

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

查看环境的加密配置

您可以查看现有环境的加密配置:

控制台

  1. 在 Google Cloud Console 中,转到环境页面。

    转到“环境”

  2. 在环境列表中,点击您的环境名称。环境详情页面会打开。

  3. 转到环境配置标签页。

  4. 数据加密密钥项列出了有关加密的详细信息。

gcloud

运行以下 gcloud 命令以查看加密配置

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

替换:

  • ENVIRONMENT_NAME 替换为环境的名称。
  • LOCATION 替换为环境所在的区域。

示例:

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

将 CMEK 用于 Cloud Composer 日志

如果您希望日志包含敏感数据,则可能需要使用日志路由器将 Cloud Composer 日志重定向到由 CMEK 加密的 Cloud Storage 存储分区。这样做可防止系统将您的日志发送到 Monitoring。

如果您需要 Cloud Customer Care 的支持,则可能需要向 Google 支持工程师授予对存储在 Cloud Storage 中的 Cloud Composer 日志的访问权限。

gcloud

  1. 创建一个新的 Cloud Storage 存储分区来存储日志。

    gsutil mb -l LOCATION gs://BUCKET_NAME
    

    替换:

    • LOCATION 替换为环境所在的区域。
    • BUCKET_NAME 替换为存储分区的名称。

    示例:

    gsutil mb -l us-central1 gs://composer-logs-us-central1-example-environment
    
  2. 使用您的 CMEK 密钥加密存储分区。

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

    替换:

    • KEY_PROJECT_ID 替换为密钥所在项目的 ID。如果您使用其他项目中的密钥,则此值与项目的 ID 不同。如果您使用同一项目中的密钥,则此值是您的项目 ID。
    • KEY_LOCATION 替换为客户管理的密钥的位置。此位置必须与您的环境相同。
    • KEY_RING_NAME 替换为用于存储客户管理的密钥的密钥环。
    • KEY_NAME 替换为您的客户管理的密钥名称。
    • BUCKET_NAME 替换为存储桶的名称。

    示例:

    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. 创建新的日志接收器。

    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"
    

    替换:

    • ENVIRONMENT_NAME 替换为环境的名称。
    • LOCATION 替换为环境所在的区域。
    • BUCKET_NAME 替换为存储桶的名称。

    示例:

    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. 向此存储分区的服务帐号授予 Storage Object Creator 角色。该服务帐号会显示在上一条命令的结果中)。

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

    替换:

    • PROJECT_ID 替换为项目 ID
    • LOGGING_SERVICE_AGENT 替换为此存储分区的 Logging 代理帐号。此帐号的名称可在上一步中获得。

    示例:

    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. 从 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"
    

    替换:

    • ENVIRONMENT_NAME 替换为环境的名称。
    • LOCATION 替换为环境所在的区域。

    示例:

    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. 为日志路由器添加组织级 CMEK 加密。

    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
    

    替换:

    • ORGANIZATION_ID 替换为您的组织 ID
    • KEY_PROJECT_ID 替换为密钥所在项目的 ID。如果您使用其他项目中的密钥,则此值与项目的 ID 不同。如果您使用同一项目中的密钥,则此值是您的项目 ID。
    • KEY_RING_NAME 替换为用于存储客户管理的密钥的密钥环。
    • KEY_LOCATION 替换为客户管理的密钥的位置。此位置必须与您的环境相同。
    • KEY_NAME 替换为您的客户管理的密钥名称。

轮替 Cloud Composer 的 CMEK 密钥

在使用 CMEK 密钥在您的环境中配置加密后,您还应考虑定期轮替这些密钥(如 KMS 文档中所述)。

轮替 CMEK 密钥时,使用旧密钥版本加密的数据不会自动使用新密钥版本重新加密。您可以详细了解如何重新加密数据。具体而言,此要求适用于:

  • 存储在环境存储分区中的对象

  • Airflow 元数据数据库中存储的数据

  • 存储在 Aritfact Registry 代码库中的容器映像

以及在 Cloud Composer 环境中使用 CMEK 加密的所有其他数据对象。

后续步骤