使用 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 = my_key_handle.kms_key
  }
}

请替换以下内容:

  • RESOURCE_PROJECT_ID:您要在其中创建受保护资源的 Autokey 文件夹中的资源项目的 ID。
  • KEY_HANDLE:要用于按键句柄的 ID。
  • LOCATION:您要创建受保护资源的位置。
  • DISK_NAME:新磁盘的名称。
  • ZONE:受保护资源的可用区。此可用区必须是您要创建资源的位置内的一个可用区。例如,如果您要在位置 us-central1 中创建资源,则区域可以为 us-central1-a

API

  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:您要在其中创建受保护资源的 Autokey 文件夹中的资源项目的 ID。
    • 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:您要在其中创建受保护资源的 Autokey 文件夹中的资源项目的 ID。
    • 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 资源的资源 ID 一样使用此资源 ID。

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

    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. 在 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      = my_key_handle.kms_key
  }
}

请替换以下内容:

  • RESOURCE_PROJECT_ID:您要在其中创建受保护资源的 Autokey 文件夹中的资源项目的 ID。
  • KEY_HANDLE:要用于按键句柄的 ID。
  • LOCATION:您要创建受保护资源的位置。
  • BUCKET_NAME:新存储桶的名称。

API

  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:您要在其中创建受保护资源的 Autokey 文件夹中的资源项目的 ID。
    • 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:您要在其中创建受保护资源的 Autokey 文件夹中的资源项目的 ID。
    • 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 资源的资源 ID 一样使用此资源 ID。

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

    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 版本与 Cloud KMS 兼容,然后再尝试使用 Autokey 保护 BigQuery 资源。如需详细了解 BigQuery 版本,请参阅了解 BigQuery 版本

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

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

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

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

创建受保护的 BigQuery 资源

控制台

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

  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" {
  dataset_id                  = "DATASET_ID"
  friendly_name               = "DATASET_NAME"
  description                 = "DATASET_DESCRIPTION"
  location                    = "LOCATION"
  default_table_expiration_ms = 3600000

  default_encryption_configuration {
    kms_key_name = my_key_handle.kms_key
  }
}

请替换以下内容:

  • RESOURCE_PROJECT_ID:您要在其中创建受保护资源的 Autokey 文件夹中的资源项目的 ID。
  • LOCATION:您要创建受保护资源的位置。
  • DATASET_ID:要用于新数据集的 ID。
  • DATASET_NAME:新数据集的直观易懂的名称。
  • DATASET_DESCRIPTION:新数据集的说明。

API

  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:您要在其中创建受保护资源的 Autokey 文件夹中的资源项目的 ID。
    • 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:您要在其中创建受保护资源的 Autokey 文件夹中的资源项目的 ID。
    • 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 资源的资源 ID 一样使用此资源 ID。

  3. 使用带有 --destination_kms_key 标志的 bq mk 命令创建加密数据集。

    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:您要在其中创建受保护资源的 Autokey 文件夹中的资源项目的 ID。
    • 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" {
  secret_id = "SECRET_ID"

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

请替换以下内容:

  • RESOURCE_PROJECT_ID:您要在其中创建受保护资源的 Autokey 文件夹中的资源项目的 ID。
  • SECRET_ID:要用于新 Secret 的 ID。

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

API

  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:您要在其中创建受保护资源的 Autokey 文件夹中的资源项目的 ID。
    • 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。

    如果您尝试在已存在密钥句柄的同一项目和位置中为密钥创建密钥句柄,则系统会返回一条错误消息,返回现有密钥句柄的详细信息。在这种情况下,请跳过下一步并使用 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:您要在其中创建受保护资源的 Autokey 文件夹中的资源项目的 ID。
    • 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 资源的资源 ID 一样使用此资源 ID。

  3. 使用带有 --kms-key-name 标志的 gcloud secrets create 命令创建具有自动复制功能的加密 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:您要在其中创建受保护资源的 Autokey 文件夹中的资源项目的 ID。

后续步骤