Cloud Composer 1 |Cloud Composer 2 |Cloud Composer 3
本页将介绍如何使用 由客户管理的加密密钥 (CMEK) 可保护 Cloud Composer 环境。客户管理的加密密钥 用于加密/解密环境中的用户数据。
准备工作
只有在创建环境时才能配置 CMEK。不是 为现有环境启用 CMEK。
Cloud Composer 支持使用存储在外部密钥管理器中的密钥进行 CMEK 加密。
您必须在您的环境所在的同一区域中创建 CMEK 密钥 资源。您不能使用多区域密钥或全球密钥。
如果您希望自己的环境在 VPC Service Controls 边界,您必须添加 Cloud Key Management Service API 和 Artifact Registry API 添加到边界
启用 Artifact Registry API。
控制台
Enable the Artifact Registry API.
gcloud
Enable the Artifact Registry API:
gcloud services enable artifactregistry.googleapis.com
用户信息未受 CMEK 加密保护
Cloud Monitoring 不支持 CMEK 加密。您的 环境和 DAG 的名称存储在 Cloud Monitoring 中 使用 Google 拥有的密钥和由 Google 管理的密钥以加密形式存储数据库。
Cloud Composer 会存储以下受 Google 拥有和 Google 管理的密钥(而非客户管理的密钥)保护的信息:
- 环境名称
- Airflow 配置替换
- 环境变量
- 允许的 IP 地址范围的说明
- IP 范围
- 标签
- Cloud Composer 存储的某些参数的名称可能包括 环境名称的子字符串。
为您的环境使用客户管理的加密密钥
第 1 步:创建客户管理的加密密钥
按照创建对称加密密钥中介绍的步骤,在环境所在的区域创建密钥。
第 2 步:向服务代理授予角色
控制台
跳过此步骤。您将权限授予 Service 代理 为您的环境指定密钥。
gcloud
以下服务代理必须对您为环境使用的密钥拥有 Cloud KMS CryptoKey Encrypter/Decrypter 角色。
服务代理名称 | 服务账号电子邮件地址 | 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 |
Kubernetes Engine 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 Agent | service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com | 使用 gcloud storage service-agent --authorize-cmek 授予加密/解密权限 |
(如果需要)如果您的部分服务账号 项目,则表示尚未创建此服务的身份。 例如,如果您尚未在项目中创建任何 Cloud Composer 环境,就可能会发生这种情况。
如需添加这些服务账号,请使用以下命令为所列服务创建身份:
gcloud beta services identity create \ --service=API_SERVICE_NAME
将
API_SERVICE_NAME
替换为 服务的 API 服务名称 。示例:
gcloud beta services identity create \ --service=composer.googleapis.com
向服务代理授予权限:
向 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
向 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
向 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
向 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
向 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
向以下对象授予加密/解密权限: Cloud Storage 服务代理。 如果你使用的是 自定义环境的存储桶。
gcloud storage service-agent \ --authorize-cmek=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 describe
,gcloud kms keyrings list
和gcloud kms keys describe
命令。
第 3 步:创建使用 CMEK 的环境
创建客户管理的加密密钥后,您可以使用 以创建 Cloud Composer 环境
控制台
创建环境时:
在数据加密部分,选择 客户管理的加密密钥 (CMEK)。
在选择客户管理的密钥下拉列表中,选择您的密钥。
如果需要更多设置,系统就会显示一条消息,通知您。在 在本例中:
点击打开向导。
在准备 CMEK 密钥以在 Cloud Composer 中使用 对话框中,查看服务代理列表 必须具有 Cloud KMS CryptoKey Encrypter/Decrypter 角色 键。
如需授予所需的角色和权限,请点击授予。
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.9.7-airflow-2.9.3 \
--kms-key projects/example-project/locations/us-central1/keyRings/example-key-ring/cryptoKeys/example-key
查看环境的加密配置
您可以查看现有环境的加密配置:
控制台
在 Google Cloud 控制台中,前往环境页面。
在环境列表中,点击您的环境名称。环境详情页面会打开。
转到环境配置标签页。
有关加密的详细信息,请参阅数据加密密钥项。
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 Logging 支持使用 CMEK 密钥加密日志存储空间。我们建议 使用标准 CMEK 过程来通过 CMEK 密钥加密日志。
如需使用 CMEK 密钥加密日志,请按照管理用于保护 Logging 存储数据的密钥中的说明操作。
将 Cloud Composer 日志重定向到由 CMEK 加密的 Cloud Storage 存储桶
如果您预计日志包含敏感数据,则可能需要执行以下操作: 将 Cloud Composer 日志重定向到由 CMEK 加密的 Cloud Storage 存储分区 日志路由器。这样可防止日志发送到 Monitoring。
如果您需要 Cloud Customer Care 的支持,则可能需要向 Google 支持工程师授予对存储在 Cloud Storage 中的 Cloud Composer 日志的访问权限。
gcloud
创建一个新的 Cloud Storage 存储桶来存储日志。
gcloud storage buckets create gs://BUCKET_NAME --location=LOCATION
您需要将其中的:
LOCATION
替换为环境所在的区域。- 将
BUCKET_NAME
替换为存储桶的名称。
示例:
gcloud storage buckets create gs://composer-logs-us-central1-example-environment --location=us-central1
使用您的 CMEK 密钥对存储桶进行加密。
gcloud storage buckets update gs://BUCKET_NAME \ --default-encryption-key=projects/KEY_PROJECT_ID/locations/KEY_LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/KEY_NAME
您需要将其中的:
- 将
KEY_PROJECT_ID
替换为密钥所在的项目的 ID。如果您使用其他项目中的密钥,则此值不同于 项目 ID如果您使用的是同一项目中的密钥,则此值为项目的 ID。 - 将
KEY_LOCATION
替换为您的客户管理的密钥的位置。这个 位置必须与环境的位置相同。 - 将
KEY_RING_NAME
替换为存储客户管理的密钥的密钥环。 - 将
KEY_NAME
替换为您的客户管理的密钥名称。 BUCKET_NAME
替换为存储桶的名称。
示例:
gcloud storage buckets update gs://composer-logs-us-central1-example-environment \ --default-encryption-key=projects/example-project/locations/us-central1/keyRings/example-key-ring/cryptoKeys/example-key
- 将
创建新的日志接收器。
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"
向此存储桶的服务账号授予 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
- 将
从 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"
为日志路由器添加组织级 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 数据库中存储的 Cata 数据。
- 存储在 Artifact Registry 仓库中的容器映像。
- 在 Cloud Composer 环境中使用 CMEK 加密的所有其他数据对象。