使用 Cloud KMS Autokey 创建受保护的资源

本页介绍了如何使用 Cloud KMS Autokey 创建的密钥来创建受保护的资源以进行加密。如需详细了解 Autokey,请参阅 Autokey 概览

准备工作

如需使用 Autokey 创建受保护的资源,您必须完成以下步骤进行准备:

  1. 如果您还没有为集中式或委托式密钥管理启用 Autokey 的项目,则必须先完成启用 Cloud KMS Autokey中的设置步骤,然后再返回本文档。
  2. 您需要拥有在所选项目中创建资源的权限。如需查找 每个资源所需的特定角色,请参阅特定于服务的 文档。您可以在 CMEK 集成表中找到该文档,然后访问您要创建的资源类型的链接 。无需其他权限即可使用 Autokey 按需请求密钥。

将 Autokey 与 Compute Engine 资源搭配使用

Autokey 会为每个磁盘、映像和机器映像在创建资源所在的同一位置创建一个新密钥。

Autokey 不会为快照创建新密钥。快照应使用用于加密磁盘的同一密钥。如果您使用 Cloud de Confiance 控制台创建快照,则磁盘使用的加密密钥会自动 应用于快照。 如果您使用 gcloud CLI、Terraform 或 Compute Engine API 创建快照,则必须确定用于加密磁盘的密钥,并使用该密钥加密快照。

如需详细了解如何将 CMEK 与快照搭配使用,请参阅通过使用 CMEK 加密的磁盘创建快照

创建受保护的 Compute Engine 资源

控制台

如需创建磁盘,请完成以下步骤:

  1. 在 Cloud de Confiance 控制台中,前往 磁盘 页面。

    打开“磁盘”

  2. 点击创建磁盘 ,然后输入新磁盘的属性。

  3. 加密 下,选择 Cloud KMS 密钥

  4. 对于密钥类型 ,选择 Cloud KMS with Autokey ,然后点击 请求新密钥 。当密钥成功创建并可供使用时,系统会显示一条消息。

  5. 如需完成磁盘创建,请点击创建

您可以按照类似的过程创建受保护的虚拟机实例、映像和机器映像资源。

Terraform

以下 Terraform 示例会创建一个 密钥句柄,并使用 返回的密钥来保护新的永久性磁盘资源:

resource "google_kms_key_handle" "my_key_handle" {
  provider               = google-beta
  project                = "RESOURCE_PROJECT_ID"
  name                   = "KEY_HANDLE"
  location               = "LOCATION"
  resource_type_selector = "compute.googleapis.com/Disk"
}

resource "google_compute_disk" "persistent_disk" {
  project = "RESOURCE_PROJECT_ID"
  name    = "DISK_NAME"
  type    = "pd-ssd"
  zone    = "ZONE"
  size    = 30
  physical_block_size_bytes = 4096
  disk_encryption_key {
    kms_key_self_link = google_kms_key_handle.my_key_handle.kms_key
  }
}

替换以下内容:

  • RESOURCE_PROJECT_ID:资源项目的项目 ID,您在该项目中启用了 Autokey,并且要在该项目中创建受保护的资源。
  • KEY_HANDLE:用于密钥句柄的 ID。
  • LOCATION:您要在其中创建受保护资源的位置。
  • DISK_NAME:新磁盘的名称。
  • ZONE:受保护资源的可用区。这必须是您在其中创建资源的可用区内的可用区。例如,如果您在 us-central1 位置创建资源,则可用区可以是 us-central1-a

Cloud KMS 不允许您删除 KeyHandle 资源。如果您使用的是创建和销毁模式,则尝试重新创建 KeyHandle 会产生 ALREADY_EXISTS 错误。如需避免此问题,您可以导入之前创建的 KeyHandle。如需了解详情,请参阅本页中的 Terraform 中的创建和销毁模式

REST

  1. 通过创建 KeyHandle请求新的 Cloud KMS 密钥:

    curl -H "Content-Type: application/json" \
        -H "X-Goog-User-Project: USER_PROJECT" \
        -H "Authorization: Bearer TOKEN" \
        -X POST https://cloudkms.googleapis.com/v1/projects/RESOURCE_PROJECT_ID/locations/LOCATION/keyHandles \
        -d '{"resource_type_selector": "RESOURCE_TYPE"}'
    

    替换以下内容:

    • USER_PROJECT:将针对与此请求相关的费用进行结算的项目。
    • RESOURCE_PROJECT_ID:资源项目的项目 ID,您在该项目中启用了 Autokey,并且要在该项目中创建受保护的资源。
    • LOCATION:您要在其中创建受保护资源的位置。
    • RESOURCE_TYPE:您要创建的资源类型,例如 compute.googleapis.com/Disk

    输出类似于以下内容:

    {
      "name": "projects/RESOURCE_PROJECT_ID/locations/LOCATION/operations/OPERATION_ID",
      "metadata": {
        "@type": "type.googleapis.com/google.cloud.kms.v1.CreateKeyHandleMetadata"
      }
    }
    

    记下输出中的 OPERATION_ID。您需要此值才能获取所创建密钥的资源 ID。

  2. 查找与密钥句柄关联的 Cloud KMS 密钥:

    curl -H "X-Goog-User-Project: USER_PROJECT" \
        -H "Authorization: Bearer TOKEN" \
        -X GET https://cloudkms.googleapis.com/v1/projects/RESOURCE_PROJECT_ID/locations/LOCATION/operations/OPERATION_ID
    

    替换以下内容:

    • USER_PROJECT:将针对与此请求相关的费用进行结算的项目。
    • RESOURCE_PROJECT_ID:资源项目的项目 ID,您在该项目中启用了 Autokey,并且要在该项目中创建受保护的资源。
    • LOCATION:您要在其中创建受保护资源的位置。
    • OPERATION_ID:上一步输出中密钥句柄请求操作的标识符。

    输出类似于以下内容:

    {
      "name": "projects/RESOURCE_PROJECT_ID/locations/LOCATION/operations/OPERATION_ID",
      "done": true,
      "response": {
        "@type": "type.googleapis.com/google.cloud.kms.v1.KeyHandle",
        "name": "projects/RESOURCE_PROJECT_ID/locations/LOCATION/keyHandles/KEY_HANDLE",
        "kmsKey": "projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/autokey/cryptoKeys/KEY_NAME",
        "resourceTypeSelector": "RESOURCE_TYPE"
      }
    }
    

    输出中 kmsKey 元素的值是 Autokey 为此资源创建的密钥的完整资源 ID。您可以使用此资源 ID,就像使用任何其他 Cloud KMS 资源的资源 ID 一样。

  3. 使用 gcloud compute disks create command 命令和 --kms-key 标志创建加密磁盘:

    gcloud compute disks create DISK_NAME \
      --kms-key projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/autokey/cryptoKeys/KEY_NAME
    

    替换以下内容:

    • DISK_NAME:新磁盘的名称。
    • KEY_PROJECT_ID:创建密钥的项目 ID。
    • LOCATION:您要在其中创建资源的位置。
    • KEY_NAME:上一步输出中返回的密钥的名称。

将 Autokey 与 Cloud Storage 资源搭配使用

Autokey 会在存储桶所在的同一位置创建一个新密钥。Autokey 创建的密钥会分配为存储桶默认密钥。

Autokey 不会为对象创建密钥。默认情况下,在存储桶中创建的对象会使用存储桶默认密钥。如果您想使用存储桶默认密钥以外的密钥来加密对象,可以创建 CMEK,并在创建对象时使用该密钥。

如果您想更改分配给存储桶的默认密钥,可以使用现有的 CMEK,包括 Autokey 创建的密钥。

创建受保护的 Cloud Storage 资源

控制台

  1. 在 Cloud de Confiance 控制台中,前往 创建存储桶 页面。

    转到“创建存储桶”

  2. 按照创建新存储桶 中的说明操作,直到选择如何保护对象数据 说明。

  3. 选择如何保护对象数据 下,展开数据 加密 部分,然后选择 Cloud KMS 密钥

  4. 对于密钥类型 ,选择 Cloud KMS with Autokey ,然后点击 请求新密钥 。当密钥成功创建并可供使用时,系统会显示一条消息。

  5. 如需完成存储桶创建,请点击创建

Terraform

以下 Terraform 示例会创建一个 密钥句柄,并使用 返回的密钥来保护新的存储桶:

resource "google_kms_key_handle" "my_key_handle" {
  provider               = google-beta
  project                = "RESOURCE_PROJECT_ID"
  name                   = "KEY_HANDLE"
  location               = "LOCATION"
  resource_type_selector = "storage.googleapis.com/Bucket"
}

resource "google_storage_bucket" "simple_bucket_name" {
  name                        = "BUCKET_NAME"
  location                    = "LOCATION"
  force_destroy               = true
  project                     = "RESOURCE_PROJECT_ID"
  uniform_bucket_level_access = true
  encryption {
    default_kms_key_name      = google_kms_key_handle.my_key_handle.kms_key
  }
}

替换以下内容:

  • RESOURCE_PROJECT_ID:资源项目的项目 ID,您在该项目中启用了 Autokey,并且要在该项目中创建受保护的资源。
  • KEY_HANDLE:用于密钥句柄的 ID。
  • LOCATION:您要在其中创建受保护资源的位置。
  • BUCKET_NAME:新存储桶的名称。

Cloud KMS 不允许您删除 KeyHandle 资源。如果您使用的是创建和销毁模式,则尝试重新创建 KeyHandle 会产生 ALREADY_EXISTS 错误。如需避免此问题,您可以导入之前创建的 KeyHandle。如需了解详情,请参阅本页中的 Terraform 中的创建和销毁模式

REST

  1. 通过创建 KeyHandle请求新的 Cloud KMS 密钥:

    curl -H "Content-Type: application/json" \
        -H "X-Goog-User-Project: USER_PROJECT" \
        -H "Authorization: Bearer TOKEN" \
        -X POST https://cloudkms.googleapis.com/v1/projects/RESOURCE_PROJECT_ID/locations/LOCATION/keyHandles \
        -d '{"resource_type_selector": "RESOURCE_TYPE"}'
    

    替换以下内容:

    • USER_PROJECT:将针对与此请求相关的费用进行结算的项目。
    • RESOURCE_PROJECT_ID:资源项目的项目 ID,您在该项目中启用了 Autokey,并且要在该项目中创建受保护的资源。
    • LOCATION:您要在其中创建受保护资源的位置。
    • RESOURCE_TYPE:您要创建的资源类型,例如 storage.googleapis.com/Bucket

    输出类似于以下内容:

    {
      "name": "projects/RESOURCE_PROJECT_ID/locations/LOCATION/operations/OPERATION_ID",
      "metadata": {
        "@type": "type.googleapis.com/google.cloud.kms.v1.CreateKeyHandleMetadata"
      }
    }
    

    记下输出中的 OPERATION_ID。您需要此值才能获取所创建密钥的资源 ID。

  2. 查找与密钥句柄关联的 Cloud KMS 密钥:

    curl -H "X-Goog-User-Project: USER_PROJECT" \
        -H "Authorization: Bearer TOKEN" \
        -X GET https://cloudkms.googleapis.com/v1/projects/RESOURCE_PROJECT_ID/locations/LOCATION/operations/OPERATION_ID
    

    替换以下内容:

    • USER_PROJECT:将针对与此请求相关的费用进行结算的项目。
    • RESOURCE_PROJECT_ID:资源项目的项目 ID,您在该项目中启用了 Autokey,并且要在该项目中创建受保护的资源。
    • LOCATION:您要在其中创建受保护资源的位置。
    • OPERATION_ID:上一步输出中密钥句柄请求操作的标识符。

    输出类似于以下内容:

    {
      "name": "projects/RESOURCE_PROJECT_ID/locations/LOCATION/operations/OPERATION_ID",
      "done": true,
      "response": {
        "@type": "type.googleapis.com/google.cloud.kms.v1.KeyHandle",
        "name": "projects/RESOURCE_PROJECT_ID/locations/LOCATION/keyHandles/KEY_HANDLE",
        "kmsKey": "projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/autokey/cryptoKeys/KEY_NAME",
        "resourceTypeSelector": "RESOURCE_TYPE"
      }
    }
    

    输出中 kmsKey 元素的值是 Autokey 为此资源创建的密钥的完整资源 ID。您可以使用此资源 ID,就像使用任何其他 Cloud KMS 资源的资源 ID 一样。

  3. 使用 gcloud storage buckets create command 命令和 --default-encryption-key 标志创建加密存储桶:

    gcloud storage buckets create gs://BUCKET_NAME \
        --location=LOCATION \
        --default-encryption-key=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/autokey/cryptoKeys/KEY_NAME
    

    替换以下内容:

    • BUCKET_NAME:新存储桶的名称。存储桶名称必须符合 存储桶命名要求
    • LOCATION:您要在其中创建存储桶的位置。
    • KEY_PROJECT_ID:创建密钥的项目 ID。
    • LOCATION:您要在其中创建资源的位置。
    • KEY_NAME:上一步输出中返回的密钥的名称。

将 Autokey 与 BigQuery 资源搭配使用

Cloud KMS 在多个 BigQuery 版本中提供。在尝试使用 Autokey 保护 BigQuery 资源之前,请确保您使用的 BigQuery 版本与 Cloud KMS 兼容。如需详细了解 BigQuery 版本,请参阅了解 BigQuery 版本

对于每个新数据集,Autokey 会在资源本身所在的同一位置创建一个新密钥,该密钥将成为数据集默认密钥。

Autokey 不会为表、查询、临时表或模型创建密钥。默认情况下,这些资源受数据集默认密钥保护。如果您想使用数据集默认密钥以外的密钥来保护数据集中的资源,可以手动创建 CMEK,并在创建资源时使用该密钥。

对于不在数据集中的查询和临时表,请使用项目默认密钥。对于包含 BigQuery 资源的项目中的每个位置,请使用不同的项目默认密钥。如需详细了解如何 使用项目默认密钥,请参阅 设置项目默认密钥

如需详细了解如何将 CMEK 与 BigQuery 搭配使用,请参阅 客户管理的 Cloud KMS 密钥

创建受保护的 BigQuery 资源

控制台

在尝试使用 Autokey 创建 BigQuery 数据集之前,请确保您拥有所需的权限。如需详细了解如何创建数据集,请参阅创建数据集

  1. 在 Cloud de Confiance 控制台中,前往 BigQuery 页面。

    转到 BigQuery

  2. 按照创建数据集中的说明操作,直到 您到达高级选项 > 加密

  3. 加密 下,选择 Cloud KMS 密钥

  4. 对于密钥类型 ,选择 Cloud KMS with Autokey ,然后点击 请求新密钥 。当密钥成功创建并可供使用时,系统会显示一条消息。

  5. 如需完成数据集创建,请点击创建数据集

Terraform

以下 Terraform 示例会创建一个 密钥句柄,并使用 返回的密钥来保护新数据集:

resource "google_kms_key_handle" "my_key_handle" {
  provider               = google-beta
  project                = "RESOURCE_PROJECT_ID"
  name                   = "test-key-handle"
  location               = "LOCATION"
  resource_type_selector = "bigquery.googleapis.com/Dataset"
}

resource "google_bigquery_dataset" "dataset" {
  project                     = "RESOURCE_PROJECT_ID"
  dataset_id                  = "DATASET_ID"
  friendly_name               = "DATASET_NAME"
  description                 = "DATASET_DESCRIPTION"
  location                    = "LOCATION"
  default_table_expiration_ms = 3600000

  default_encryption_configuration {
    kms_key_name = google_kms_key_handle.my_key_handle.kms_key
  }
}

替换以下内容:

  • RESOURCE_PROJECT_ID:资源项目的项目 ID,您在该项目中启用了 Autokey,并且要在该项目中创建受保护的资源。
  • LOCATION:您要在其中创建受保护资源的位置。
  • DATASET_ID:用于新数据集的 ID。
  • DATASET_NAME:新数据集的直观易记名称。
  • DATASET_DESCRIPTION:新数据集的说明。

Cloud KMS 不允许您删除 KeyHandle 资源。如果您使用的是创建和销毁模式,则尝试重新创建 KeyHandle 会产生 ALREADY_EXISTS 错误。如需避免此问题,您可以导入之前创建的 KeyHandle。如需了解详情,请参阅本页中的 Terraform 中的创建和销毁模式

REST

  1. 通过创建 KeyHandle请求新的 Cloud KMS 密钥:

    curl -H "Content-Type: application/json" \
        -H "X-Goog-User-Project: USER_PROJECT" \
        -H "Authorization: Bearer TOKEN" \
        -X POST https://cloudkms.googleapis.com/v1/projects/RESOURCE_PROJECT_ID/locations/LOCATION/keyHandles \
        -d '{"resource_type_selector": "RESOURCE_TYPE"}'
    

    替换以下内容:

    • USER_PROJECT:将针对与此请求相关的费用进行结算的项目。
    • RESOURCE_PROJECT_ID:资源项目的项目 ID,您在该项目中启用了 Autokey,并且要在该项目中创建受保护的资源。
    • LOCATION:您要在其中创建受保护资源的位置。
    • RESOURCE_TYPE:您要创建的资源类型,例如 bigquery.googleapis.com/Dataset

    输出类似于以下内容:

    {
      "name": "projects/RESOURCE_PROJECT_ID/locations/LOCATION/operations/OPERATION_ID",
      "metadata": {
        "@type": "type.googleapis.com/google.cloud.kms.v1.CreateKeyHandleMetadata"
      }
    }
    

    记下输出中的 OPERATION_ID。您需要此值才能获取所创建密钥的资源 ID。

  2. 查找与密钥句柄关联的 Cloud KMS 密钥:

    curl -H "X-Goog-User-Project: USER_PROJECT" \
        -H "Authorization: Bearer TOKEN" \
        -X GET https://cloudkms.googleapis.com/v1/projects/RESOURCE_PROJECT_ID/locations/LOCATION/operations/OPERATION_ID
    

    替换以下内容:

    • USER_PROJECT:将针对与此请求相关的费用进行结算的项目。
    • RESOURCE_PROJECT_ID:资源项目的项目 ID,您在该项目中启用了 Autokey,并且要在该项目中创建受保护的资源。
    • LOCATION:您要在其中创建受保护资源的位置。
    • OPERATION_ID:上一步输出中密钥句柄请求操作的标识符。

    输出类似于以下内容:

    {
      "name": "projects/RESOURCE_PROJECT_ID/locations/LOCATION/operations/OPERATION_ID",
      "done": true,
      "response": {
        "@type": "type.googleapis.com/google.cloud.kms.v1.KeyHandle",
        "name": "projects/RESOURCE_PROJECT_ID/locations/LOCATION/keyHandles/KEY_HANDLE",
        "kmsKey": "projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/autokey/cryptoKeys/KEY_NAME",
        "resourceTypeSelector": "RESOURCE_TYPE"
      }
    }
    

    输出中 kmsKey 元素的值是 Autokey 为此资源创建的密钥的完整资源 ID。您可以使用此资源 ID,就像使用任何其他 Cloud KMS 资源的资源 ID 一样。

  3. 使用 bq mk command--destination_kms_key 标志创建加密数据集。

    bq --location=LOCATION mk \
        --dataset \
        --default_kms_key=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/autokey/cryptoKeys/KEY_NAME \
        --default_table_expiration=TABLE_EXPIRATION \
        --description="DATASET_DESCRIPTION" \
        RESOURCE_PROJECT_ID:DATASET_ID
    

    替换以下内容:

    • LOCATION:您要在其中创建数据集的位置。
    • KEY_PROJECT_ID:创建密钥的项目 ID。
    • KEY_NAME:上一步输出中返回的密钥的名称。
    • TABLE_EXPIRATION:此数据集中新表的默认生命周期(以秒为单位)。
    • DATASET_DESCRIPTION:新数据集的说明。
    • RESOURCE_PROJECT_ID:资源项目的项目 ID,您在该项目中启用了 Autokey,并且要在该项目中创建受保护的资源。
    • DATASET_ID:您要创建的数据集的 ID。

    如需详细了解 bq 工具,请参阅 探索 bq 命令行工具

将 Autokey 与 Secret Manager 资源搭配使用

Autokey 会创建一个密钥来保护同一项目和位置中的所有 Secret。当密钥轮替时,添加到项目中的新 Secret 会使用密钥的新主要版本。

只有在使用 Terraform 或 REST API 创建资源时,Secret Manager 才与 Cloud KMS Autokey 兼容。

创建受保护的 Secret Manager 资源

Terraform

以下 Terraform 示例会创建一个 密钥句柄,并使用 返回的密钥来保护具有自动复制功能的新 Secret:

resource "google_kms_key_handle" "my_key_handle" {
  provider               = google-beta
  project                = "RESOURCE_PROJECT_ID"
  name                   = "test-key-handle"
  location               = "global"
  resource_type_selector = "secretmanager.googleapis.com/Secret"
}

resource "google_secret_manager_secret" "my_secret" {
  project   = "RESOURCE_PROJECT_ID"
  secret_id = "SECRET_ID"

  replication {
    auto {
      customer_managed_encryption {
        kms_key_name = google_kms_key_handle.my_key_handle.kms_key
      }
    }
  }
}

替换以下内容:

  • RESOURCE_PROJECT_ID:资源项目的项目 ID,您在该项目中启用了 Autokey,并且要在该项目中创建受保护的资源。
  • SECRET_ID:用于新 Secret 的 ID。

如果您尝试为密钥句柄已存在的同一项目和位置中的 Secret 创建密钥句柄,则错误消息会返回现有密钥句柄的详细信息。如果发生这种情况,请确保您只有一个用于创建密钥句柄的代码块。您可以使用密钥句柄的 ID (KEY_HANDLE) 重复使用该密钥句柄,以创建应共享该密钥的其他 Secret。

Cloud KMS 不允许您删除 KeyHandle 资源。如果您使用的是创建和销毁模式,则尝试重新创建 KeyHandle 会产生 ALREADY_EXISTS 错误。如需避免此问题,您可以导入之前创建的 KeyHandle。如需了解详情,请参阅本页中的 Terraform 中的创建和销毁模式

REST

  1. 通过创建 KeyHandle请求新的 Cloud KMS 密钥:

    curl -H "Content-Type: application/json" \
        -H "X-Goog-User-Project: USER_PROJECT" \
        -H "Authorization: Bearer TOKEN" \
        -X POST https://cloudkms.googleapis.com/v1/projects/RESOURCE_PROJECT_ID/locations/LOCATION/keyHandles \
        -d '{"resource_type_selector": "RESOURCE_TYPE"}'
    

    替换以下内容:

    • USER_PROJECT:将针对与此请求相关的费用进行结算的项目。
    • RESOURCE_PROJECT_ID:资源项目的项目 ID,您在该项目中启用了 Autokey,并且要在该项目中创建受保护的资源。
    • LOCATION:您要在其中创建受保护资源的位置。
    • RESOURCE_TYPE:您要创建的资源类型,例如 secretmanager.googleapis.com/Secret

    输出类似于以下内容:

    {
      "name": "projects/RESOURCE_PROJECT_ID/locations/LOCATION/operations/OPERATION_ID",
      "metadata": {
        "@type": "type.googleapis.com/google.cloud.kms.v1.CreateKeyHandleMetadata"
      }
    }
    

    记下输出中的 OPERATION_ID。您需要此值才能获取所创建密钥的资源 ID。

    如果您尝试为密钥句柄已存在的同一项目和位置中的 Secret 创建密钥句柄,则错误消息会返回现有密钥句柄的详细信息。在这种情况下,请跳过下一步,并使用 existingKmsKey 字段中的密钥资源 ID 来保护您的新 Secret。

  2. 查找与密钥句柄关联的 Cloud KMS 密钥:

    curl -H "X-Goog-User-Project: USER_PROJECT" \
        -H "Authorization: Bearer TOKEN" \
        -X GET https://cloudkms.googleapis.com/v1/projects/RESOURCE_PROJECT_ID/locations/LOCATION/operations/OPERATION_ID
    

    替换以下内容:

    • USER_PROJECT:将针对与此请求相关的费用进行结算的项目。
    • RESOURCE_PROJECT_ID:资源项目的项目 ID,您在该项目中启用了 Autokey,并且要在该项目中创建受保护的资源。
    • LOCATION:您要在其中创建受保护资源的位置。
    • OPERATION_ID:上一步输出中密钥句柄请求操作的标识符。

    输出类似于以下内容:

    {
      "name": "projects/RESOURCE_PROJECT_ID/locations/LOCATION/operations/OPERATION_ID",
      "done": true,
      "response": {
        "@type": "type.googleapis.com/google.cloud.kms.v1.KeyHandle",
        "name": "projects/RESOURCE_PROJECT_ID/locations/LOCATION/keyHandles/KEY_HANDLE",
        "kmsKey": "projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/autokey/cryptoKeys/KEY_NAME",
        "resourceTypeSelector": "RESOURCE_TYPE"
      }
    }
    

    输出中 kmsKey 元素的值是 Autokey 为此资源创建的密钥的完整资源 ID。您可以使用此资源 ID,就像使用任何其他 Cloud KMS 资源的资源 ID 一样。

  3. 使用 gcloud secrets create命令--kms-key-name标志创建具有自动复制功能的加密 Secret。

    gcloud secrets create "SECRET_ID" \
        --replication-policy "automatic" \
        --kms-key-name "projects/KEY_PROJECT_ID/locations/global/keyRings/autokey/cryptoKeys/KEY_NAME" \
        --project "RESOURCE_PROJECT_ID"
    

    替换以下内容:

    • SECRET_ID:用于新 Secret 的 ID。
    • KEY_PROJECT_ID:创建密钥的项目 ID。
    • KEY_NAME:上一步输出中返回的密钥的名称。
    • RESOURCE_PROJECT_ID:资源项目的项目 ID,您在该项目中启用了 Autokey,并且要在该项目中创建受保护的资源。

将 Autokey 与 Dataflow 资源搭配使用

Autokey 可用于为每个 Dataflow 作业创建一个密钥。

REST

  1. 通过创建 KeyHandle请求新的 Cloud KMS 密钥:

    curl -H "Content-Type: application/json" \
        -H "X-Goog-User-Project: USER_PROJECT" \
        -H "Authorization: Bearer TOKEN" \
        -X POST https://cloudkms.googleapis.com/v1/projects/RESOURCE_PROJECT_ID/locations/LOCATION/keyHandles \
        -d '{"resource_type_selector": "dataflow.googleapis.com/Job"}'
    

    替换以下内容:

    • USER_PROJECT:将针对与此请求相关的费用进行结算的项目。
    • RESOURCE_PROJECT_ID:资源项目的项目 ID,您在该项目中启用了 Autokey,并且要在该项目中创建受保护的资源。
    • LOCATION:您要在其中创建受保护资源的位置。

    输出类似于以下内容:

    {
      "name": "projects/RESOURCE_PROJECT_ID/locations/LOCATION/operations/OPERATION_ID",
      "metadata": {
        "@type": "type.googleapis.com/google.cloud.kms.v1.CreateKeyHandleMetadata"
      }
    }
    

    记下输出中的 OPERATION_ID。您需要此值才能获取所创建密钥的资源 ID。

  2. 查找与密钥句柄关联的 Cloud KMS 密钥:

    curl -H "X-Goog-User-Project: USER_PROJECT" \
        -H "Authorization: Bearer TOKEN" \
        -X GET https://cloudkms.googleapis.com/v1/projects/RESOURCE_PROJECT_ID/locations/LOCATION/operations/OPERATION_ID
    

    替换以下内容:

    • USER_PROJECT:将针对与此请求相关的费用进行结算的项目。
    • RESOURCE_PROJECT_ID:资源项目的项目 ID,您在该项目中启用了 Autokey,并且要在该项目中创建受保护的资源。
    • LOCATION:您要在其中创建受保护资源的位置。
    • OPERATION_ID:上一步输出中密钥句柄请求操作的标识符。

    输出类似于以下内容:

    {
      "name": "projects/RESOURCE_PROJECT_ID/locations/LOCATION/operations/OPERATION_ID",
      "done": true,
      "response": {
        "@type": "type.googleapis.com/google.cloud.kms.v1.KeyHandle",
        "name": "projects/RESOURCE_PROJECT_ID/locations/LOCATION/keyHandles/KEY_HANDLE",
        "kmsKey": "projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/autokey/cryptoKeys/KEY_NAME",
        "resourceTypeSelector": "RESOURCE_TYPE"
      }
    }
    

    输出中 kmsKey 元素的值是 Autokey 为此资源创建的密钥的完整资源 ID。您可以使用此资源 ID,就像使用任何其他 Cloud KMS 资源的资源 ID 一样。

Terraform 中的创建和销毁模式

Cloud KMS 不允许您删除 KeyHandle 资源。如果您使用的是 Terraform 和创建和销毁模式,则尝试重新创建 KeyHandle 会产生 ALREADY_EXISTS 错误。您可以使用 import代码块来避免此问题。在 google_kms_key_handle 资源的 resource 代码块之前插入以下代码块:

import {
  to = google_kms_key_handle.KEY_HANDLE
  id = "projects/RESOURCE_PROJECT_ID/locations/LOCATION/keyHandles/KEY_HANDLE"
}

后续步骤