Managed Airflow(第 3 代) | Managed Airflow(第 2 代) | Managed Airflow(旧版第 1 代)
本页面介绍如何使用 客户管理的加密密钥 (CMEK) 来保护 Managed Airflow 环境。
客户管理的加密密钥 (CMEK) 简介
默认情况下,Managed Service for Apache Airflow 会静态加密客户内容 。Managed Airflow 会为您处理加密,无需您执行任何其他操作。此选项称为“Google 默认加密” 。
如果您想要控制加密密钥,则可以将 Cloud KMS 中客户管理的加密密钥 (CMEK) 与集成 CMEK 的服务(包括 Managed Airflow)结合使用。使用 Cloud KMS 密钥时,您可以控制其保护 级别、位置、轮替时间表、使用和访问权限以及加密边界。此外,您还可使用 Cloud KMS 查看审核日志并控制密钥生命周期。这样您就可以在 Cloud KMS 中控制和管理用于保护数据的对称 密钥加密密钥 (KEK),而不是由 Google 拥有和管理这些密钥。
使用 CMEK 设置资源后,访问您的 Managed Airflow 资源的体验与使用 Google 默认加密功能类似。 如需详细了解加密 选项,请参阅客户管理的加密密钥 (CMEK)。
受 CMEK 加密保护的数据
Managed Airflow 使用 CMEK 加密保护以下数据:
- Airflow 数据库的内容和架构
- Cloud Logging 中的环境和 Airflow 任务日志
- 环境存储桶的内容
- 存储在环境集群中的密文
- 任务队列使用的永久性磁盘
- 存储在 Artifact Registry 仓库中的环境组件的容器映像
如需详细了解数据的加密方式,请参阅:
- Cloud SQL 文档中的 客户管理的加密密钥 (CMEK) 简介。
- Google Kubernetes Engine 文档中的 使用客户管理的加密密钥 (CMEK)和 在应用层加密密文。
- Cloud Storage 文档中的 客户管理的加密密钥。
- Cloud Logging 文档中的 为 Cloud Logging 配置 CMEK。
不受 CMEK 加密保护的数据
Cloud Monitoring 不支持 CMEK 加密。您的环境名称和 DAG 名称使用 Google-owned and Google-managed encryption keys加密形式存储在 Monitoring 数据库中。
Managed Airflow 存储的以下信息受 Google-owned and Google-managed encryption keys保护,而不是客户管理的密钥:
- 环境名称
- Airflow 配置替换
环境变量
标签
Managed Airflow 存储的某些参数的名称可以包含环境名称的子字符串。
Managed Airflow 的 CMEK 密钥轮替
使用 CMEK 密钥在环境中配置加密后,您 可能还需要考虑定期轮替这些密钥,如 KMS 文档中所述。
轮替 CMEK 密钥时,使用先前密钥版本加密的数据不会自动使用新密钥版本重新加密 。 如需了解详情,请参阅重新加密数据。
具体而言,这适用于:
- 存储在环境存储桶中的对象。
- 存储在 Airflow 数据库中的数据。
- Managed Airflow 环境中使用 CMEK 加密的所有其他数据对象。
- 存储在 Artifact Registry 仓库中的环境组件的容器映像。
为环境使用客户管理的加密密钥
准备工作
您只能在创建环境时配置 CMEK。无法为现有环境启用 CMEK。
Managed Airflow 支持使用 存储在外部密钥管理器中的密钥进行 CMEK 加密。
您必须在环境所在的同一区域中创建 CMEK 密钥。您不能使用多区域密钥或全局密钥。
如果您希望您的环境在 VPC Service Controls 边界内运行,则必须将 Cloud Key Management Service API 添加到边界。
第 1 步:创建客户管理的加密密钥
按照 创建对称加密密钥中所述的步骤,在 环境所在的区域中创建密钥。
第 2 步:为服务代理授予角色
控制台
gcloud
以下 服务代理 必须对您用于环境的密钥具有 Cloud KMS CryptoKey Encrypter/Decrypter 角色。
将 PROJECT_NUMBER 替换为您的
项目编号。
| 服务代理名称 | 服务账号电子邮件地址 | API 服务名称 |
|---|---|---|
| Managed Airflow Service Agent | service-PROJECT_NUMBER@cloudcomposer-accounts.iam.gserviceaccount.com | composer.googleapis.com |
| Cloud Storage Service Agent | service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com | 使用 gcloud storage service-agent --authorize-cmek 授予加密/解密权限 |
(如果需要)如果您的项目中缺少某些服务账号,则表示尚未为此服务创建身份。 例如,如果您尚未在项目中创建任何 Managed Airflow 环境,则可能会发生这种情况。
如需添加这些服务账号,请使用以下命令为列出的服务创建身份:
gcloud beta services identity create \ --service=API_SERVICE_NAME将
API_SERVICE_NAME替换为项目中没有服务帐号的服务的 API 服务名称 。示例:
gcloud beta services identity create \ --service=composer.googleapis.com向服务代理授予权限:
向 Managed Airflow 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向 Cloud Storage Service Agent 授予加密/解密权限。如果您使用 自定义环境的存储桶,则可以跳过此步骤。
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 创建环境
创建客户管理的加密密钥后,您可以使用 它来创建 Managed Airflow 环境。
控制台
展开高级配置 部分。 在数据加密 部分中,选择 Cloud Key Management Service 密钥 。
在选择 Cloud Key Management Service 密钥 下拉列表中,选择您的密钥。
如果需要进行其他设置,系统会显示一条消息来通知您。在这种情况下:
点击打开向导 。
在准备在 Managed Airflow 中使用的 CMEK 密钥 对话框中,查看必须对密钥具有 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替换为 Managed Airflow 映像的名称。 - 将
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-3-airflow-2.10.5-build.34 \
--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 用于 Managed Airflow 日志
Cloud Logging 支持使用 CMEK 密钥加密日志存储。我们建议使用标准 CMEK 程序来使用 CMEK 密钥加密日志。
如需使用 CMEK 密钥加密日志,请按照 管理用于保护 Logging 存储数据的密钥中所述的说明操作。
将 Managed Airflow 日志重定向到 CMEK 加密的 Cloud Storage 存储桶
如果您预计日志会包含敏感数据,则可能需要使用 日志路由器将 Managed Airflow 日志重定向到 CMEK 加密的 Cloud Storage 存储桶。这样做可以防止日志发送到 Monitoring。
如果您需要 Cloud Customer Care 的支持,则可能需要向 Google 支持工程师授予对存储在 Cloud Storage 中的 Managed Airflow 日志的访问权限。
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_IDgcloud 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_NAMEgcloud 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替换为客户管理的密钥名称。
- 将