Cloud Composer 3 | Cloud Composer 2 | Cloud Composer 1
本頁說明如何使用客戶管理的加密金鑰 (CMEK) 保護 Cloud Composer 環境。
使用 CMEK 加密保護資料
Cloud Composer 會使用 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 名稱會以加密形式儲存在 Monitoring 資料庫中,並使用 Google-owned and Google-managed encryption keys。
Cloud Composer 會儲存下列受Google-owned and Google-managed encryption keys保護的資訊,而非客戶管理的金鑰:
- 環境名稱
- Airflow 設定覆寫
環境變數
允許的 IP 範圍說明
IP 範圍
標籤
Cloud Composer 儲存的部分參數名稱可以包含環境名稱的子字串。
Cloud Composer 的 CMEK 金鑰輪替
使用 CMEK 金鑰在環境中設定加密後,您可能也會想定期輪替這些金鑰,詳情請參閱 KMS 文件。
輪替 CMEK 金鑰時,系統「不會自動」使用新金鑰版本,重新加密以舊金鑰版本加密的資料。詳情請參閱「重新加密資料」。
具體來說,這項規定適用於:
- 儲存在環境值區中的物件。
- 儲存在 Airflow 資料庫中的資料。
- 在 Cloud Composer 環境中,以 CMEK 加密的所有其他資料物件。
- 儲存在 Artifact Registry 存放區的環境元件容器映像檔。
為環境使用客戶自行管理的加密金鑰
事前準備
您只能在建立環境時設定 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
步驟 1:建立客戶自行管理的加密金鑰
請按照「建立對稱加密金鑰」一文的步驟,在環境所在的區域中建立金鑰。
步驟 2:將角色授予服務代理人
主控台
gcloud
下列服務代理人必須在您用於環境的金鑰上,具備 Cloud KMS CryptoKey Encrypter/Decrypter 角色。
將 PROJECT_NUMBER
替換為專案編號。
服務代理名稱 | 服務帳戶電子郵件地址 | API 服務名稱 |
---|---|---|
Cloud Composer 服務代理人 | service-PROJECT_NUMBER@cloudcomposer-accounts.iam.gserviceaccount.com | composer.googleapis.com |
Artifact Registry 服務代理 | service-PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com | artifactregistry.googleapis.com |
Kubernetes Engine 服務代理人 | 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-PROJECT_NUMBER@compute-system.iam.gserviceaccount.com | compute.googleapis.com |
Cloud Storage 服務代理 | service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com | 使用 gcloud storage service-agent --authorize-cmek 授予加密/解密權限 |
(如有需要) 如果專案中沒有這些服務帳戶,表示該服務的 ID 尚未建立。舉例來說,如果您尚未在專案中建立任何 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 服務代理程式:
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 環境。
主控台
建立環境時:
展開「網路、Airflow 設定覆寫與其他功能」 部分。 在「資料加密」部分,選取「Cloud Key Management Service 金鑰」。
在「選取 Cloud Key Management Service 金鑰」下拉式清單中,選取您的金鑰。
如果需要進行其他設定,系統會顯示訊息通知你。在本例中:
按一下「開啟設定精靈」。
在「準備 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-1.20.12-airflow-1.10.15 \
--kms-key projects/example-project/locations/us-central1/keyRings/example-key-ring/cryptoKeys/example-key
查看環境的加密設定
您可以查看現有環境的加密設定:
主控台
前往 Google Cloud 控制台的「Environments」頁面。
在環境清單中,按一下環境名稱。 「環境詳細資料」頁面隨即開啟。
前往「環境設定」分頁。
加密詳細資料會列在「資料加密金鑰」項目中。
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 金鑰加密記錄,請按照「管理用於保護 Cloud Logging 儲存空間資料的金鑰」一文中的操作說明進行。
將 Cloud Composer 記錄重新導向至 CMEK 加密的 Cloud Storage 值區
如果記錄檔可能含有機密資料,建議使用 Log Router 將 Cloud Composer 記錄重新導向至以 CMEK 加密的 Cloud Storage bucket。這樣一來,系統就不會將記錄傳送至監控服務。
如需 Cloud Customer Care 支援,您可能需要授予 Google 支援工程師存取權,以便查看儲存在 Cloud Storage 中的 Cloud Composer 記錄。
gcloud
建立新的 Cloud Storage bucket 來儲存記錄。
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 金鑰加密 Bucket。
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 物件建立者」角色授予這個 bucket 的服務帳戶。服務帳戶會顯示在上一個指令的結果中。
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
改為您自行管理的金鑰名稱。
- 將