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

本页面介绍了如何使用由 用于加密的 Cloud KMS Autokey。如需详细了解 Autokey,请参阅 Autokey 概览

准备工作

为了获得使用 Autokey 创建受保护的资源所需的权限, 请让管理员向您授予 针对文件夹或项目的 Cloud KMS Autokey User (roles/cloudkms.autokeyUser) IAM 角色。 如需详细了解如何授予角色,请参阅管理访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

您还需要 Autokey 文件夹或 文件夹中的资源项目。如需详细了解相关权限 请参阅具体服务的文档。您 可以通过在 CMEK 集成中找到该服务 表格,然后访问资源类型的链接 资源。

将 Autokey 与 Compute Engine 资源搭配使用

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

Autokey 不会为快照创建新密钥。快照应使用 用于加密磁盘的密钥相同。如果您使用 Google Cloud 控制台,则磁盘使用的加密密钥会自动 应用于快照 如果您使用 gcloud CLI、Terraform 或 Cloud KMS API,则必须标识用于加密磁盘的密钥, 使用该密钥对快照进行加密。

如需详细了解如何将 CMEK 与快照搭配使用,请参阅创建快照 从使用 CMEK 加密的磁盘中导出的数据

创建受保护的 Compute Engine 资源

控制台

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

  1. 在 Google Cloud 控制台中,转到磁盘页面。

    打开“磁盘”

  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

API

  1. 创建 Cloud KMS 密钥, KeyHandle

    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:您要 create,例如 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 用于任何其他 Cloud KMS 资源。

  3. 使用 gcloud compute disks create 创建加密磁盘 命令替换为 --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 不会为对象创建键。默认情况下,在 存储桶使用存储桶默认密钥。如果要使用 密钥以外的密钥,您可以手动创建 CMEK 并使用 在创建对象时使用该键

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

创建受保护的 Cloud Storage 资源

控制台

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

    转到“创建存储桶”

  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:新存储桶的名称。

API

  1. 创建 Cloud KMS 密钥, KeyHandle

    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:您要 create,例如 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 元素的值是完整的资源 ID Autokey 为此资源创建的密钥的名称。您可以使用 与将资源 ID 用于任何 其他 Cloud KMS 资源

  3. 使用 gcloud storage buckets create 创建加密存储桶 命令替换为 --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 中提供。制造商 请确保您使用的 BigQuery 版本与 然后再尝试使用 Autokey 来保护 BigQuery 资源。如需详细了解 BigQuery 版本,请参阅了解 BigQuery 版本

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

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

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

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

创建受保护的 BigQuery 资源

控制台

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

  1. 在 Google Cloud 控制台中,转到 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:新项的说明 数据集。

API

  1. 创建 Cloud KMS 密钥, KeyHandle

    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:您要 create,例如 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 元素的值是完整的资源 ID Autokey 为此资源创建的密钥的名称。您可以使用 与将资源 ID 用于任何 其他 Cloud KMS 资源

  3. 使用 bq mk 创建加密数据集 命令替换为 --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:New 的默认生命周期 此数据集中的表(以秒为单位)。
    • DATASET_DESCRIPTION:新项的说明 数据集。
    • RESOURCE_PROJECT_ID:资源的项目 ID 项目(位于您要创建的 Autokey 文件夹中) 受保护的资源
    • DATASET_ID:您要访问的数据集的 ID 。

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

将 Autokey 与 Secret Manager 资源搭配使用

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

只有在以下情况下,Secret Manager 才与 Cloud KMS Autokey 兼容 使用 Terraform 或 REST API 创建资源

创建受保护的 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。

如果您尝试在同一项目中为密钥创建密钥句柄,并且 键句柄所在的位置,则错误消息会返回 现有按键手柄的详细信息。如果发生这种情况,请确保您仅 有一个用于创建键句柄的块。您可以使用 其 ID (KEY_HANDLE) 来创建应该 共享密钥。

API

  1. 创建 Cloud KMS 密钥, KeyHandle

    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:您要 create,例如 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。

    如果您尝试为同一项目中的密钥创建密钥句柄 已有键句柄的键和位置,错误消息 返回现有键句柄的详细信息。在这种情况下,请跳过 下一步,并使用 existingKmsKey 字段中的密钥资源 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 元素的值是完整的资源 ID Autokey 为此资源创建的密钥的名称。您可以使用 与将资源 ID 用于任何 其他 Cloud KMS 资源

  3. 使用 gcloud secrets create 命令、 。--kms-key-name

    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 文件夹中) 保护的资源

后续步骤