使用客户管理的加密密钥

本页面介绍如何使用客户管理的加密密钥 (CMEK) 来保护 Cloud Composer 环境。启用 CMEK 后,您将可以提供自己的加密密钥来加密/解密环境数据。

不支持资源位置限制的区域

Cloud Composer 不支持华沙 (europe-central2) 区域中的资源位置限制。

前提条件

  1. 启用 Artifact Registry API。

        gcloud services enable artifactregistry.googleapis.com
      

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

为 Cloud Composer 配置 CMEK 支持

控制台

在创建环境期间,在 Cloud Console 中配置 CMEK 加密的步骤如下:

  1. 在 Cloud Console 中,转到“创建环境”页面。 打开“创建环境”页面

  2. 展开网络、Airflow 配置替换及其他功能部分。

  3. 数据加密下,选择客户管理的密钥

  4. 选择客户管理的密钥下方,从下拉菜单中选择您的密钥。

  5. 如果需要更多设置,系统就会显示一条消息,通知您。然后,您可以选择打开向导来引导您完成该过程。

创建环境后,您可以验证其加密配置:

  1. 转到“环境列表”页面。打开“环境列表”页面

  2. 在页面右上方的“刷新”按钮下方,点击列显示选项按钮。

  3. 列显示选项下拉菜单中,选择数据加密

  4. 此时应显示新列,每个环境的数据加密均显示为“Google 管理的密钥”或“客户管理的密钥”。

  5. 如需验证客户管理的密钥是否可用,请从列表中选择新的环境来访问环境详情页面。选择环境配置标签页,然后查找数据加密行。

gcloud

打开 Cloud Console 并使用以下命令为 Cloud Composer 配置 CMEK 加密:

  1. 设置项目变量。

    export environmentName=ENVIRONMENT_NAME
    export project=PROJECT_ID
    export location=LOCATION
    export keyRing=KEY_RING
    export keyName=KEY_NAME
    export keyProject=${project} # Change if you are using a key from another project.
    export projectNumber=$(gcloud projects describe ${project} | grep projectNumber | cut -f2 -d" " | sed "s/'//g" )
    
  2. 在 KMS 中创建 CMEK 密钥(如果尚无密钥)。

    gcloud config set project ${project}
    gcloud kms keyrings create ${keyRing} --location=${location} --project ${keyProject}
    gcloud kms keys create ${keyName} --location=${location} \
    --keyring=${keyRing} --purpose=encryption --project ${keyProject}
    

    您必须在环境所在的同一区域中创建 CMEK 密钥。

  3. 向 Composer 服务代理服务帐号授予权限。

    gcloud kms keys add-iam-policy-binding ${keyName} \
      --location ${location} \
      --keyring ${keyRing} \
      --member=serviceAccount:$(gcloud beta services identity create \
      --service=composer.googleapis.com 2>&1 | awk '{print $4}') \
      --role=roles/cloudkms.cryptoKeyEncrypterDecrypter \
      --project ${keyProject}
    
  4. 向 Artifact Registry 服务帐号授予权限。

    gcloud kms keys add-iam-policy-binding ${keyName} \
      --location ${location} \
      --keyring ${keyRing} \
      --member=serviceAccount:$(gcloud beta services \
    identity create --service=artifactregistry.googleapis.com 2>&1 | awk \
    '{print $4}') --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
    
  5. 向 GKE 服务帐号授予权限。

    gcloud kms keys add-iam-policy-binding ${keyName} \
      --location ${location} --keyring ${keyRing} \
      --member=serviceAccount:$(gcloud beta services identity create \
      --service=container.googleapis.com 2>&1 | awk '{print $4}') \
      --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
    
  6. 向 Pub/Sub 服务帐号授予权限。

    gcloud kms keys add-iam-policy-binding ${keyName} \
      --location ${location} \
      --keyring ${keyRing} \
      --member=serviceAccount:$(gcloud beta services identity create \
      --service=pubsub.googleapis.com 2>&1 | awk '{print $4}') \
      --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
    
  7. 向 Cloud Storage 服务帐号授予权限。

    gsutil kms authorize -k projects/${keyProject}/locations/${location}/keyRings/${keyRing}/cryptoKeys/${keyName}
    
  8. 向 Compute Engine 服务帐号授予权限。

    gcloud kms keys add-iam-policy-binding ${keyName} \
      --location ${location} \
      --keyring ${keyRing} \
      --member=serviceAccount:service-${projectNumber}@compute-system.iam.gserviceaccount.com \
      --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
    
  9. 创建一个 Cloud Composer 环境。

    gcloud composer environments create ${environmentName} \
      --location=${location} \
      --kms-key projects/${keyProject}/locations/${location}/keyRings/${keyRing}/cryptoKeys/${keyName}
    

适用于 Cloud Composer 日志的 CMEK

如果您预计日志可能包含敏感数据,还可以选择通过日志路由器重定向 Cloud Composer 记录 CMEK 加密的 Cloud Storage 存储分区。这样可防止日志发送到 Monitoring。如果您需要 Google Cloud 支持团队的支持,则需要向 Google 支持工程师授予对存储在 Cloud Storage 中的 Cloud Composer 日志的访问权限。

gcloud

  1. 创建新的 Cloud Storage 存储分区(例如 composer-logs-${location}-${environmentName})。

    gsutil mb -l ${location} gs://${bucket_name}
    
  2. 使用您的 CMEK 密钥进行加密。

    gsutil kms encryption -k projects/${project}/locations/${location}/keyRings/${keyRing}/cryptoKeys/${keyName} gs://${bucket_name}
    
  3. 创建新的日志接收器。

    gcloud logging sinks create composer-log-sink-${environmentName} storage.googleapis.com/${bucket_name}
      --log-filter "resource.type=cloud_composer_environment AND resource.labels.environment_name=${envname} AND resource.labels.location=${location}"
    
  4. 将适当的角色授予此存储分区的服务帐号(显示在上一个命令的结果中)。

    gcloud projects add-iam-policy-binding ${project} --member="serviceAccount:${serviceAccountNumber}@gcp-sa-logging.iam.gserviceaccount.com" --role='roles/storage.objectCreator' --condition=None
    
  5. 从 Monitoring 中排除新环境的日志。

    gcloud beta logging sinks update _Default --add-exclusion name=${environmentName}-exclusion,filter="resource.type=cloud_composer_environment AND resource.labels.environment_name=${envname} AND resource.labels.location=${location}"
    
  6. 向日志路由器添加组织级 CMEK 加密。

    gcloud beta logging cmek-settings describe --organization=[ORGANIZATION_ID]
    gcloud kms keys add-iam-policy-binding \
      --project=[KMS_PROJECT_ID] \
      --member [SERVICE_ACCOUNT_ID]@gcp-sa-logging.iam.gserviceaccount.com \
      --role roles/cloudkms.cryptoKeyEncrypterDecrypter \
      --location=[KMS_KEY_LOCATION] \
      --keyring=[KMS_KEY_RING] \
      [KMS_KEY]
    gcloud beta logging cmek-settings update \
      --organization=[ORGANIZATION_ID] --kms-key-name=[KMS_KEY_NAME]
    

受 Google 提供的加密密钥保护的 Cloud Composer 数据

Cloud Monitoring 不支持 CMEK 加密,这意味着您的 Cloud Composer 环境和 DAG 的名称将使用 Google 加密密钥以加密形式存储在 Monitoring 数据库中。

Cloud Composer 后端数据库还会使用 Google 加密密钥以加密形式存储环境元数据。