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。
控制台
启用 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-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com | 使用 gsutil kms authorize 授予加密/解密权限 |
(如果需要)如果您的部分服务账号 项目,则表示尚未创建此服务的身份。 例如,如果您尚未创建任何 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 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
将角色授予 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 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
将角色授予 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 服务代理。 如果你使用的是 自定义环境的存储桶。
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 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.8.6-airflow-2.7.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 Composer 日志, Cloud Storage
gcloud
创建新的 Cloud Storage 存储桶来存储日志。
gsutil mb -l LOCATION gs://BUCKET_NAME
您需要将其中的:
LOCATION
替换为环境所在的区域。- 将
BUCKET_NAME
替换为存储桶的名称。
示例:
gsutil mb -l us-central1 gs://composer-logs-us-central1-example-environment
使用您的 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
- 将
创建新的日志接收器。
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
- 将
将新环境的日志从 监控。
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 代码库中的容器映像。
- 使用 CMEK 加密的 Cloud Composer 环境。