使用客戶自行管理的加密金鑰 (CMEK)

您可以使用 Cloud Key Management Service 中的加密編譯金鑰,透過客戶自行管理的加密金鑰 (CMEK) 保護 Cloud SQL 靜態資料。自行控管金鑰有助於滿足法規遵循要求,並直接監督金鑰存取政策和輪替排程。

您可以設定服務帳戶和 Cloud KMS 金鑰,然後建立使用手動建立 CMEK 的 Cloud SQL 執行個體。如要進一步瞭解如何搭配使用客戶自行管理的加密金鑰與 Cloud SQL,請參閱「客戶自行管理的加密金鑰總覽」。

事前準備

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Google Cloud project.

  3. Install the gcloud CLI.

  4. Configure the gcloud CLI to use your federated identity.

    For more information, see Sign in to the gcloud CLI with your federated identity.

  5. To initialize the gcloud CLI, run the following command:

    gcloud init
  6. 確認使用者帳戶具備 Cloud SQL 管理員角色。

    前往「IAM」頁面

  7. 啟用 Cloud Key Management Service API (如果尚未啟用)。

    啟用 API 所需的角色

    您必須具備 serviceusage.services.enable 權限,才能啟用 API。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「Service Usage 管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。

    啟用 API

  8. 啟用 Cloud SQL Admin API (如果尚未啟用)。

    啟用 API 所需的角色

    您必須具備 serviceusage.services.enable 權限,才能啟用 API。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「Service Usage 管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。

    啟用 API

使用 CMEK 建立 Cloud SQL 執行個體的工作流程

  1. 僅限 gcloud 和 API 使用者:針對需要客戶自行管理加密金鑰的各項專案,建立服務帳戶。
  2. 在要建立執行個體的 Google Cloud 區域中,建立金鑰環和金鑰。
  3. 僅限 gcloud 和 API 使用者: 將金鑰存取權授予服務帳戶。
  4. 記下金鑰 ID (KMS_KEY_ID)、金鑰環位置 (GCP_REGION) 和金鑰環 ID (KMS_KEYRING_ID)。
  5. 前往專案,並使用下列選項建立 Cloud SQL 執行個體:
    1. 與客戶自行管理的加密金鑰相同的位置
    2. 客戶自行管理的金鑰設定
    3. 客戶自行管理的加密金鑰 ID

Cloud SQL 執行個體現已啟用 CMEK。

建立服務帳戶

您必須為每個需要客戶自行管理的加密金鑰的專案建立服務帳戶。

如要允許使用者管理服務帳戶,請授予下列其中一個角色:

  • 服務帳戶使用者 (roles/iam.serviceAccountUser):包含列出服務帳戶、取得服務帳戶詳細資料,以及模擬服務帳戶的權限。
  • 服務帳戶管理員 (roles/iam.serviceAccountAdmin):包含列出服務帳戶及取得服務帳戶詳細資料的權限。此外,也包含建立、更新和刪除服務帳戶,以及查看或變更服務帳戶 SQL Server 適用的 Cloud SQL 政策的權限。

您只能使用 gcloud CLI 指令,建立客戶自行管理的加密金鑰所需的服務帳戶類型。如果您使用Google Cloud 控制台,Cloud SQL 會自動為您建立這個服務帳戶。

gcloud

gcloud beta services identity create \
--service=sqladmin.googleapis.com \
--project=PROJECT_ID

Terraform

如要建立服務帳戶,請使用 Terraform 資源。

resource "google_project_service_identity" "gcp_sa_cloud_sql" {
  provider = google-beta
  service  = "sqladmin.googleapis.com"
}

套用變更

如要在 Google Cloud 專案中套用 Terraform 設定,請完成下列各節的步驟。

準備 Cloud Shell

  1. 啟動 Cloud Shell。
  2. 設定要套用 Terraform 設定的預設 Google Cloud 專案。

    每個專案只需執行這個指令一次,而且可以在任何目錄中執行。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    如果您在 Terraform 設定檔中設定明確的值,環境變數就會遭到覆寫。

準備目錄

每個 Terraform 設定檔都必須有自己的目錄 (也稱為根模組)。

  1. 在 Cloud Shell 中建立目錄,並在該目錄中建立新檔案。檔案名稱必須有 .tf 副檔名,例如 main.tf。在本教學課程中,這個檔案稱為 main.tf。
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. 如果您正在進行教學課程,可以複製每個章節或步驟中的程式碼範例。

    將程式碼範例複製到新建立的 main.tf。

    您也可以從 GitHub 複製程式碼。如果 Terraform 程式碼片段是端對端解決方案的一部分,建議您採用這種做法。

  3. 請查看並修改範例參數,以便套用至您的環境。
  4. 儲存變更。
  5. 初始化 Terraform。每個目錄只需執行一次這項操作。
    terraform init

    如要使用最新版 Google 供應商,請視需要加入 -upgrade 選項:

    terraform init -upgrade

套用變更

  1. 查看設定,確認 Terraform 要建立或更新的資源符合預期:
    terraform plan

    視需要修正設定。

  2. 執行下列指令,並在提示中輸入 yes,套用 Terraform 設定:
    terraform apply

    等待 Terraform 顯示「Apply complete!」訊息。

  3. 開啟 Google Cloud 專案即可查看結果。在 Google Cloud 控制台的使用者介面中,前往資源頁面,確認 Terraform 已建立或更新資源。

前一個指令會傳回服務帳戶名稱。在授予服務帳戶金鑰存取權程序中,您會用到這個服務帳戶名稱。

建立金鑰

您可以在 Cloud SQL 執行個體所在的 Google Cloud 專案中建立金鑰,也可以在其他使用者專案中建立。Cloud KMS 金鑰環位置必須與您要建立 Cloud SQL 執行個體的區域相符。多區域或全域金鑰不適用。如果區域不相符,Cloud SQL 執行個體建立要求就會失敗。

如要建立 Cloud KMS 金鑰,請按照下列步驟操作:

控制台

  1. 前往 Google Cloud 控制台的「Key management」(金鑰管理) 頁面。

    前往「金鑰管理」

  2. 按一下 [Create key ring] (建立金鑰環)。
  3. 新增「Key ring name」(金鑰環名稱)。請記下這個名稱,因為您需要這個名稱,才能將金鑰存取權授予服務帳戶。
  4. 選取「Key ring location」(金鑰環位置)。
  5. 點選「建立」。「Create key」(建立金鑰) 頁面隨即開啟。
  6. 新增金鑰名稱。
  7. 針對「目的」,選取「Symmetric encrypt/decrypt」。
  8. 選取「輪替週期」和「開始日期」。
  9. 點選「建立」。
  10. 在「Keys」(金鑰) 表格中,按一下最後一欄的三點圖示,然後選取「Copy Resource ID」(複製資源 ID) 或記下 ID。這就是 KMS_KEY_ID。將金鑰存取權授予服務帳戶時,您需要 KMS_KEY_ID。

gcloud

  1. 建立新的金鑰環。
    gcloud kms keyrings create KMS_KEYRING_ID \
    --location=GCP_REGION
      
    請記下這個名稱,因為您需要將金鑰存取權授予服務帳戶。
  2. 在金鑰環中建立金鑰。
    gcloud kms keys create KMS_KEY_ID \
    --location=GCP_REGION \
    --keyring=KMS_KEYRING_ID \
    --purpose=encryption
      
    請記下這個名稱,因為您需要將金鑰存取權授予服務帳戶。

Terraform

如要建立金鑰環,請使用 Terraform 資源。

resource "google_kms_key_ring" "keyring" {
  provider = google-beta
  name     = "keyring-name"
  location = "us-central1"
}

如要建立金鑰,請使用 Terraform 資源。

resource "google_kms_crypto_key" "key" {
  provider = google-beta
  name     = "crypto-key-name"
  key_ring = google_kms_key_ring.keyring.id
  purpose  = "ENCRYPT_DECRYPT"
}

套用 Terraform 設定:

terraform apply

授予服務帳戶金鑰存取權

使用 CMEK 建立 Cloud SQL 執行個體時,必須將金鑰存取權授予專案的服務帳戶,該專案將包含您的執行個體。如果您使用 Google Cloud 控制台建立執行個體,系統會在建立執行個體時,自動授予服務帳戶金鑰存取權。如果您使用 gcloud CLI 或 API 建立執行個體,或在建立執行個體後遇到權限錯誤,請完成下列程序。

如要授予服務帳戶存取權,請按照下列步驟操作:

控制台

  1. 前往 Google Cloud 控制台的「Key management」(金鑰管理) 頁面。

    前往「金鑰管理」

  2. 使用專案選取器,選取託管金鑰的專案。
  3. 按一下金鑰環名稱。
  4. 按一下金鑰名稱。
  5. 按一下「Permissions」(權限) 分頁標籤。
  6. 如要開啟面板,請按一下「授予存取權」。
  7. 輸入服務帳戶做為主體,並選取「Cloud KMS CryptoKey 加密者/解密者」做為角色。
  8. 按一下 [儲存]。

您也可以在專案 IAM 頁面授予這項權限。

前往專案 IAM 頁面

gcloud

gcloud kms keys add-iam-policy-binding KMS_KEY_ID \
--location=GCP_REGION \
--keyring=KMS_KEYRING_ID \
--member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloud-sql. \
--role=roles/cloudkms.cryptoKeyEncrypterDecrypter

Terraform

如要授予金鑰存取權,請使用 Terraform 資源。

resource "google_kms_crypto_key_iam_binding" "crypto_key" {
  provider      = google-beta
  crypto_key_id = google_kms_crypto_key.key.id
  role          = "roles/cloudkms.cryptoKeyEncrypterDecrypter"

  members = [
    "serviceAccount:${google_project_service_identity.gcp_sa_cloud_sql.email}",
  ]
}

套用 Terraform 設定:

terraform apply

建立 Cloud SQL 執行個體並啟用 CMEK

如要建立使用客戶自行管理的加密金鑰的執行個體,請按照下列步驟操作:

控制台

  1. 前往 Google Cloud 控制台的「Cloud SQL Instances」(Cloud SQL 執行個體) 頁面。

    前往「Cloud SQL Instances」(Cloud SQL 執行個體) 頁面

  2. 點選「建立執行個體」。
  3. 選擇資料庫引擎。
  4. 輸入執行個體名稱。請勿在執行個體名稱中加入敏感或個人識別資訊,因為這類資訊會對外公開。執行個體名稱不需包含專案 ID。系統會在適當位置 (例如記錄檔) 自動建立這項資訊。
  5. 輸入 'root'@'%' 使用者的密碼。
  6. 設定執行個體的區域。 將執行個體放在與存取資源相同的區域。在多數情況下,您不需要指定可用區。
  7. 在「Configuration options」(設定選項) 部分,選取所有設定選項,直到「Machine type and storage」(機器類型和儲存空間)。
  8. 展開「機型和儲存空間」。
  9. 在「加密」部分,選取「客戶自行管理的金鑰」。
  10. 從下拉式選單中選取 KMS 金鑰,或手動輸入 KMS_KEY_ID。系統只會顯示與執行個體位於相同專案和區域的 KMS 金鑰。系統會使用金鑰的主要金鑰版本,因此如果金鑰名稱中提供金鑰版本,系統會將其刪除。如要選擇屬於不同專案但位於相同區域的 KMS 金鑰,請選取「找不到金鑰嗎?輸入金鑰資源 ID,然後輸入先前擷取的 KMS_KEY_ID。
  11. 如果服務帳戶沒有使用所選金鑰進行加密/解密的權限,系統會顯示訊息。如果發生這種情況,請按一下「Grant」(授予),將所選 KMS 金鑰的 roles/cloudkms.cryptoKeyEncrypterDecrypter> IAM 角色授予服務帳戶。
  12. 選取設定選項後,按一下「建立」。
  13. 您會看到一則訊息,說明使用客戶自行管理的加密金鑰會有哪些影響。請詳閱並確認,以便繼續建立執行個體。

gcloud

gcloud sql instances create INSTANCE_NAME \
--project=PROJECT_ID \
--disk-encryption-key=KMS_KEY_ID \
--database-version=VERSION \
--cpu=NUMBER_CPUS \
--memory=MEMORY_SIZE \
--region=REGION \
--root-password=INSERT-PASSWORD-HERE

Terraform

如要建立具備 CMEK 的執行個體,請使用 Terraform 資源。

resource "google_sql_database_instance" "default" {
  name                = "sqlserver-instance-cmek"
  provider            = google-beta
  region              = "us-central1"
  database_version    = "SQLSERVER_2019_STANDARD"
  root_password       = "INSERT-PASSWORD-HERE "
  encryption_key_name = google_kms_crypto_key.key.id
  settings {
    tier = "db-custom-2-7680"
  }
}

刪除變更

如要刪除變更,請按照下列步驟操作:

  1. 如要停用防刪除功能,請在 Terraform 設定檔中將 deletion_protection 引數設為 false。
    deletion_protection =  "false"
  2. 執行下列指令,並在提示中輸入 yes,套用更新後的 Terraform 設定:
    terraform apply
  1. 執行下列指令,並在提示中輸入 yes,移除先前使用 Terraform 設定套用的資源:

    terraform destroy

REST v1

如要建立具有客戶自行管理加密金鑰的執行個體,請將 diskEncryptionConfiguration 傳遞至指令。

使用任何要求資料之前,請先修改下列項目的值:

  • project-id:專案 ID
  • instance-id:執行個體 ID
  • region:區域
  • database-version:列舉版本字串 (例如 SQLSERVER_2017_STANDARD)
  • kms-resource-id:建立金鑰時收到的 ID。

HTTP 方法和網址:

POST https://sqladmin.googleapis.com/v1/projects/project-id/instances

JSON 要求主體:

{
  "name":"instance-id",
  "region":"region",
  "databaseVersion": "database-version",
  "diskEncryptionConfiguration" :
  {
      "kmsKeyName" : "kms-resource-id"
  },
  "settings":
  {
     "backupConfiguration":
      {
         
         "enabled":true
      }
   }
}

請展開以下其中一個選項,以傳送要求:

您應該會收到如下的 JSON 回覆:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/project-id/instances",
  "status": "PENDING",
  "user": "user@example.com",
  "insertTime": "2020-01-16T02:32:12.281Z",
  "operationType": "UPDATE",
  "name": "operation-id",
  "targetId": "instance-id",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/project-id/operations/operation-id",
  "targetProject": "project-id"
}
這個範例使用 instances:insert。

REST v1beta4

如要建立具有客戶自行管理加密金鑰的執行個體,請將 diskEncryptionConfiguration 傳遞至指令。

使用任何要求資料之前,請先修改下列項目的值:

  • project-id:專案 ID
  • instance-id:執行個體 ID
  • region:區域
  • database-version:列舉版本字串 (例如 SQLSERVER_2017_STANDARD)
  • kms-resource-id:建立金鑰時收到的 ID。

HTTP 方法和網址:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances

JSON 要求主體:

{
  "name":"instance-id",
  "region":"region",
  "databaseVersion": "database-version",
  "diskEncryptionConfiguration" :
  {
      "kmsKeyName" : "kms-resource-id"
  },
  "settings":
  {
     "backupConfiguration":
      {
         
         "enabled":true
      }
   }
}

請展開以下其中一個選項,以傳送要求:

您應該會收到如下的 JSON 回覆:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances",
  "status": "PENDING",
  "user": "user@example.com",
  "insertTime": "2020-01-16T02:32:12.281Z",
  "operationType": "UPDATE",
  "name": "operation-id",
  "targetId": "instance-id",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/operations/operation-id",
  "targetProject": "project-id"
}
這個範例使用 instances:insert。

為已啟用 CMEK 的執行個體建立備份

建立 Cloud SQL 執行個體的備份時,備份會使用與主要執行個體客戶自行管理金鑰相同的主金鑰版本進行加密。如果執行個體使用 Cloud KMS Autokey 建立的 CMEK,備份仍會使用與主要執行個體相同的金鑰,Autokey 不會為備份建立金鑰。

請參閱「建立及管理隨選和自動備份」。

「建立備份」表單會顯示以下訊息:「系統將使用這個執行個體的客戶管理加密金鑰主版本,對您的備份進行加密。如有任何人刪除或停用這個金鑰版本,透過此金鑰版本加密的所有備份資料都會永久遺失。您可以在 Cloud KMS 中查看金鑰的主要版本。

在備份頁面中,啟用客戶自行管理加密金鑰的備份清單會多出兩個資料欄。一欄顯示備份是針對已啟用 CMEK 的執行個體,另一欄則顯示用於加密備份的金鑰版本。

查看已啟用 CMEK 的執行個體金鑰資訊

成功建立 Cloud SQL 執行個體後,您可以查看執行個體清單或執行個體總覽頁面,確認該執行個體是使用客戶自行管理的加密金鑰建立。詳細資料也會顯示用於建立執行個體的金鑰。

  1. 前往 Google Cloud 控制台的「Cloud SQL Instances」(Cloud SQL 執行個體) 頁面。

    前往「Cloud SQL Instances」(Cloud SQL 執行個體) 頁面

  2. 在執行個體清單中,向右捲動,直到看見「Encryption」(加密) 欄。這一欄會顯示「Google-managed」(Google 代管) 和「Customer-managed」(客戶自行管理)。
  3. 按一下執行個體名稱,開啟「總覽」頁面。客戶自行管理的加密金鑰會列在「Configuration」(設定) 窗格中。

重新加密已啟用 CMEK 的現有執行個體或副本

您可以使用最新的主金鑰版本,重新加密現有的 Cloud SQL 執行個體和副本。如果重新加密的執行個體使用 Persistent Disk 做為儲存空間,則重新加密作業不會造成任何停機時間。

如要進一步瞭解如何重新加密已啟用 CMEK 的現有執行個體或副本,請參閱「關於金鑰」。

取得新的主金鑰版本

  • 如要使用新版本重新加密執行個體或副本,您需要新的主要金鑰版本。如要為執行個體取得新的金鑰版本,請使用 Cloud Key Management Service 輪替金鑰。如要輪替主金鑰,請參閱「輪替金鑰」。

  • 金鑰輪替完成後,請等待主鍵變更生效,再重新加密執行個體。如果金鑰版本變更不一致,執行個體在重新加密後會繼續使用舊金鑰版本。詳情請參閱「金鑰版本的一致性」。

重新加密已啟用 CMEK 的執行個體

金鑰輪替完成後,請重新加密已啟用 CMEK 的現有執行個體或副本。只有使用 Google Cloud Hyperdisk Balanced 儲存空間選項的執行個體,才需要停機才能重新加密。

控制台

  1. 前往 Google Cloud 控制台的「Cloud SQL Instances」(Cloud SQL 執行個體) 頁面。

    前往「Cloud SQL Instances」(Cloud SQL 執行個體) 頁面

  2. 點選執行個體名稱,開啟執行個體的「總覽」頁面。
  3. 在「設定」部分,按一下「重新加密執行個體」。
  4. 在隨即顯示的對話方塊中,按一下「Re-encrypt」(重新加密) 確認所選項目。

gcloud

如要重新加密執行個體或副本,請執行下列指令:

gcloud sql instances reencrypt INSTANCE_NAME
將 INSTANCE_NAME 替換為要重新加密的執行個體或副本名稱。

REST v1

如要使用新金鑰重新加密執行個體或副本,請執行下列指令:

    POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID/reencrypt

使用任何要求資料之前,請先修改下列項目的值:

  • PROJECT_ID:專案 ID
  • INSTANCE_ID:執行個體 ID

HTTP 方法和網址:

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID/reencrypt

請展開以下其中一個選項,以傳送要求:

您應該會收到如下的 JSON 回覆:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id",
  "status": "PENDING",
  "user": "user@example.com",
  "insertTime": "2023-06-28T21:19:09.503Z",
  "operationType": "REENCRYPT",
  "name": "operation-id",
  "targetId": "instance-id",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/project-id/operations/operation-id",
  "targetProject": "project-id"
}

REST v1beta4

如要使用新金鑰重新加密執行個體或副本,請執行下列指令:
    POST https://sqladmin.googleapis.com/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID/reencrypt

使用任何要求資料之前,請先修改下列項目的值:

  • PROJECT_ID:專案 ID
  • INSTANCE_ID:執行個體 ID

HTTP 方法和網址:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID/reencrypt

請展開以下其中一個選項,以傳送要求:

您應該會收到如下的 JSON 回覆:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id",
  "status": "PENDING",
  "user": "user@example.com",
  "insertTime": "2023-06-28T21:22:13.663Z",
  "operationType": "REENCRYPT",
  "name": "operation-id",
  "targetId": "instance-id",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/operations/operation-id",
  "targetProject": "project-id"
}

自動重新加密備份

如果主要執行個體使用 Google Cloud Hyperdisk Balanced 儲存空間選項,當您重新加密該執行個體時,Cloud SQL 會自動建立隨選備份,稱為重新加密備份。如果執行個體使用 Persistent Disk 做為儲存空間,系統不會建立重新加密備份。

在 Cloud SQL 執行個體的備份清單中,重新加密備份會列為 on-demand 類型,並標示為 backup created automatically for data before CMEK re-encryption。

與其他隨選備份一樣,重新加密備份會一直存在,直到您刪除備份或執行個體為止。

重新加密限制

重新加密執行個體時,請注意下列限制:

  • 重新加密作業進行期間,您無法對執行個體執行任何其他管理作業。
  • 如果執行個體使用 Google Cloud Hyperdisk Balanced 儲存空間選項,重新加密作業會觸發停機時間,具體時間取決於執行個體或副本大小。
  • 執行個體加密時,執行個體的副本不會重新加密。您必須分別重新加密每個副本。
  • 重新加密執行個體時,備份不會自動以新的金鑰版本重新加密。如要將備份或時間點復原作業還原至備份建立後的時間點,您必須保留用於加密備份的 Cloud KMS 金鑰版本。
  • 如果執行個體加密使用的 Cloud KMS 金鑰已輪替,則輪替後建立的備份會自動使用該金鑰的主要金鑰版本,即使執行個體並非使用這個金鑰版本加密也一樣。

如需疑難排解,請參閱重新加密疑難排解表格。

進階級備份

使用強化備份功能保護已啟用 CMEK 的執行個體時,備份會自動使用與執行個體相同的 CMEK。您只能將已啟用 CMEK 的執行個體備份至已啟用 CMEK 的 backup vault,但 backup vault 中的 Cloud SQL 備份會使用從執行個體繼承的 CMEK 加密,而非 vault 金鑰。

您必須先完成「將 Cloud SQL 執行個體備份至備份保存庫」一文列出的步驟,才能為執行個體啟用進階級備份。

使用 Cloud External Key Manager (Cloud EKM)

如要保護 Cloud SQL 執行個體中的資料,您可以使用透過支援的外部金鑰管理合作夥伴代管的金鑰。詳情請參閱「Cloud External Key Manager」,包括「注意事項」一節。

準備好建立 Cloud EKM 金鑰時,請參閱「管理 Cloud EKM 金鑰」。建立金鑰後,請在建立 Cloud SQL 執行個體時提供金鑰名稱。

您可以將金鑰存取依據做為 Cloud EKM 的一部分。您可以使用金鑰存取依據,查看每項 Cloud EKM 要求的原因。此外,您也可以根據提供的理由,自動核准或拒絕要求。詳情請參閱「金鑰存取依據總覽」。

因此,金鑰存取依據會針對每次解密資料的嘗試提供依據,進一步控管資料。

Google 無法控管外部金鑰管理合作夥伴系統中的金鑰可用性。

停用並重新啟用金鑰版本

請參閱下列主題:

疑難排解

本節說明在設定或使用啟用 CMEK 的執行個體時,如果收到錯誤訊息,可以嘗試的做法。

Cloud SQL 系統管理員作業 (例如建立、複製或更新) 可能會因 Cloud KMS 錯誤、缺少角色或權限而失敗。常見的失敗原因包括:缺少 Cloud KMS 金鑰版本、Cloud KMS 金鑰版本已停用或刪除、IAM 權限不足,無法存取 Cloud KMS 金鑰版本,或 Cloud KMS 金鑰版本與 Cloud SQL 執行個體位於不同區域。請參閱下方的疑難排解表格,診斷及解決常見問題。

客戶自行管理的加密金鑰疑難排解表格

如果發生這項錯誤... 問題可能出在... 不如說
找不到各項產品和專案的服務帳戶 服務帳戶名稱不正確。 請確認您為正確的使用者專案建立了服務帳戶。

前往「服務帳戶」頁面。

無法將存取權授予服務帳戶 使用者帳戶沒有權限,無法授予這個金鑰版本的存取權。 將組織管理員角色新增至使用者或服務帳戶。

前往「IAM 帳戶」頁面

Cloud KMS 金鑰版本已刪除 金鑰版本已刪除。 如果金鑰版本已刪除,就無法用來加密或解密資料。
Cloud KMS 金鑰版本已停用 金鑰版本已停用。 重新啟用 Cloud KMS 金鑰版本。

前往「加密金鑰」頁面

權限不足,無法使用 Cloud KMS 金鑰 您用來在 Cloud SQL 執行個體上執行作業的使用者或服務帳戶缺少 cloudkms.cryptoKeyEncrypterDecrypter 角色,或 Cloud KMS 金鑰版本不存在。 在託管金鑰的 Google Cloud 專案中,將cloudkms.cryptoKeyEncrypterDecrypter角色新增至使用者或服務帳戶。

前往「IAM 帳戶」頁面


如果您的帳戶已具備該角色,請參閱建立金鑰,瞭解如何建立新的金鑰版本。請參閱附註。
找不到 Cloud KMS 金鑰 金鑰版本不存在。 建立新的金鑰版本。請參閱「建立金鑰」。 請參閱附註。
無法連上 EKM 金鑰 無法連上外部金鑰管理工具 (EKM) 金鑰,即使多次重試,仍無法連上 EKM 金鑰。

如果執行個體因金鑰無法使用而遭到停權,但金鑰在 Google Cloud 控制台中顯示為有效且可用,則問題可能出在 EKM 連線或驗證。
請驗證 EKM 連線狀態,並與 EKM 供應商合作排解問題。
  • 確認專案已啟用 Cloud KMS 資料存取稽核記錄。
  • 如要查看 EKM 供應商傳回的特定錯誤,請在 Cloud 稽核記錄中搜尋失敗的 Decrypt 作業。
  • 請檢查外部金鑰管理工具的內部記錄 (例如 Thales 設備記錄),確認是否有連線中斷或 JSON Web Token (JWT) 驗證失敗的情況。請檢查網路防火牆規則,確保 EKM 可連線至網際網路,下載 Google 的公開驗證憑證。

前往「加密金鑰」頁面

Cloud SQL 執行個體和 Cloud KMS 金鑰版本位於不同區域 Cloud KMS 金鑰版本和 Cloud SQL 執行個體必須位於相同區域。如果 Cloud KMS 金鑰版本位於全域區域或多區域,則不適用。 在要建立執行個體的區域中,建立金鑰版本。請參閱「建立金鑰」。請參閱附註。
Cloud KMS 金鑰版本已還原,但執行個體在幾分鐘後仍處於停權狀態。 執行個體的內部驗證程序最多可能需要 10 分鐘,執行個體才會再次可用。 等待 10 分鐘,讓執行個體可供使用。
Cloud KMS 金鑰版本已還原,但執行個體在 10 分鐘後仍處於停權狀態。 金鑰版本已停用或未授予適當權限。 重新啟用金鑰版本,並在託管金鑰的 Google Cloud 專案中,將cloudkms.cryptoKeyEncrypterDecrypter角色授予使用者或服務帳戶。

重新加密疑難排解表格

如果發生這項錯誤... 問題可能出在... 不如說
無法存取 Cloud KMS 金鑰,因此無法重新加密 CMEK 資源。請確認主要金鑰版本已啟用,且已正確授予權限。 金鑰版本已停用或未授予適當權限。

重新啟用 Cloud KMS 金鑰版本:

前往「Crypto Keys」(加密編譯金鑰) 頁面

在託管金鑰的 Google Cloud 專案中,確認您的使用者或服務帳戶已獲派cloudkms.cryptoKeyEncrypterDecrypter角色:

前往「IAM 帳戶」頁面

伺服器發生內部錯誤,因此無法重新加密 CMEK 資源。請稍後再試 伺服器發生內部錯誤。 請重新加密。詳情請參閱「重新加密已啟用 CMEK 的現有執行個體或副本」

後續步驟