启用 Cloud KMS Autokey

本页面介绍了如何在 资源文件夹中如需详细了解 Autokey,请参阅 Autokey 概览。本页中的步骤 应由安全管理员完成。

准备工作

在启用 Cloud KMS Autokey 之前,您必须满足以下条件:

  • 包含您要启用的文件夹的组织资源 Autokey。如果您没有要启用的文件夹 Autokey,您可以创建新资源 文件夹。对此文件夹启用 Autokey 会启用 为文件夹中的所有资源项目启用 Autokey。
  • 如果您想在资源项目中使用 Autokey,但 它们不在用于启用 Autokey 的文件夹中, 可以将现有资源项目移至新文件夹

所需的角色

如需获取启用和配置 Autokey 所需的权限, 请让管理员授予您 组织或文件夹的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理访问权限

这些预定义角色包含 启用和配置 Autokey 所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

如需启用和配置 Autokey,您需要具备以下权限:

  • cloudkms.autokeyConfigs.*
  • cloudkms.projects.showEffectiveAutokeyConfig
  • resourcemanager.folders.get
  • resourcemanager.folders.getIamPolicy
  • resourcemanager.folders.setIamPolicy
  • billing.resourceAssociations.create

您也可以使用自定义角色或其他预定义角色来获取这些权限。

确定启用 Autokey 的方式

您可以在基础架构即代码中启用 Autokey 来实施所需的配置更改。如果您 想要使用 Terraform 启用 Autokey,请参阅启用 Autokey 使用 Terraform。如果不想使用 Terraform 首先,请按照下一部分中的说明操作。

设置密钥项目

我们建议您创建新的密钥项目以包含 Cloud KMS 资源 由 Autokey 创建。您应该在 组织资源。如果您已经拥有要使用的密钥项目 对于 Autokey 创建的密钥,您可以跳过创建密钥项目部分并继续 从配置 Autokey 密钥项目

密钥项目可以在您计划启用的同一文件夹中创建 Autokey。您不应在密钥项目中创建其他资源。 如果您尝试在密钥中创建受 Autokey 保护的资源 项目中,Autokey 会拒绝新密钥的请求。

如果您想迁移到 Assured Workloads 以后,请在资源所在的文件夹中创建密钥项目 受这些密钥保护

如果贵组织使用 constraints/gcp.restrictCmekCryptoKeyProjects 组织政策限制条件,以确保所有 CMEK 都来自指定密钥 项目,您必须将密钥项目添加到允许的项目列表中。对于 CMEK 组织政策的详细信息,请参阅 CMEK 组织 政策

创建密钥项目

控制台

  1. 在 Google Cloud 控制台中,前往管理资源页面。

    转到“管理资源”

  2. 选择组织部分,选择您要从哪个组织资源 想要创建项目
  3. 点击 Create project
  4. 在显示的新建项目窗口中,输入项目名称并 选择结算账号。项目名称只能包含字母、 数字、英文单引号、连字符、空格或英文感叹号, 介于 4 到 30 个字符。
  5. 位置部分,选择您要作为父项的资源 密钥项目
  6. 要完成项目的创建,请点击创建

gcloud

  • 创建新项目:

    gcloud projects create PROJECT_ID \
        --PARENT_TYPE=PARENT_ID
    

    替换以下内容:

    • PROJECT_ID:包含密钥环的项目的 ID。
    • PARENT_TYPE:其所在资源的类型 您要创建新的密钥项目。输入organization即可 在给定组织下创建新的密钥项目,或输入 folder,用于在给定文件夹下创建新的密钥项目。
    • PARENT_ID:组织的 ID 或 要在其中创建密钥项目的文件夹。

准备 Autokey 密钥项目

控制台

  1. 对密钥项目启用 Cloud KMS API。

    启用 API

  2. 如果您使用的是新的密钥项目,请向 Cloud KMS 授予 对密钥项目的管理员权限 管理员用户:

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

      转到 IAM

    2. 选择密钥项目。

    3. 点击 授权 访问权限,然后输入用户的电子邮件地址。

    4. 选择 Cloud KMS Admin 角色。

    5. 点击保存

gcloud

  1. 对密钥项目启用 Cloud KMS API:

    gcloud services enable cloudkms.googleapis.com
    
  2. 向 Cloud KMS 授予对密钥项目的管理员权限 发送给 Cloud KMS 管理员用户:

    gcloud projects add-iam-policy-binding PROJECT_NUMBER \
        --role=roles/cloudkms.admin \
        --member=user:KEY_ADMIN_EMAIL
    

    替换以下内容:

    • PROJECT_NUMBER:密钥的项目编号 项目。
    • KEY_ADMIN_EMAIL:用户的电子邮件地址 负责管理 Cloud KMS 密钥的人员。

对资源文件夹启用 Cloud KMS Autokey

控制台

  1. 在 Google Cloud 控制台中,前往 KMS 控件页面。

    开始 KMS 控件

  2. 从上下文选择器中,选择您要启用的文件夹 Autokey。

  3. 点击启用

  4. 选择您的密钥项目,然后点击提交

    系统会显示一条消息,确认该文件夹已启用 Cloud KMS Autokey。

API

为您要启用的文件夹创建 AutokeyConfig Autokey:

curl "https://cloudkms.googleapis.com/v1/folders/FOLDER_ID/autokeyConfig?updateMask=keyProject" \
    --request "PATCH" \
    --header "authorization: Bearer TOKEN" \
    --header "content-type: application/json" \
    --data '{"key_project": "projects/PROJECT_ID"}'

替换以下内容:

  • FOLDER_ID:文件夹的 ID 用于启用 Autokey 的位置。
  • PROJECT_ID:密钥项目的 ID。

设置 Cloud KMS 服务代理

密钥项目的 Cloud KMS 服务代理会创建密钥, 代表真人在资源创建期间应用 IAM 政策绑定 Cloud KMS 管理员。为了能够创建和分配密钥, Cloud KMS 服务代理需要 Cloud KMS 管理员 权限。

  1. 创建 Cloud KMS 服务代理:

    gcloud beta services identity create --service=cloudkms.googleapis.com \
        --project=PROJECT_NUMBER
    

    PROJECT_NUMBER 替换为密钥的项目编号 项目。

  2. 向服务代理授予 Cloud KMS 管理员权限:

    gcloud projects add-iam-policy-binding PROJECT_NUMBER \
        --role=roles/cloudkms.admin \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudkms.iam.gserviceaccount.com
    

    PROJECT_NUMBER 替换为密钥的项目编号 项目。

授予 Autokey 用户角色

在您的开发者可以使用 Autokey 之前,您必须向其授予 所需的角色。您可以在文件夹级别或项目级别授予该角色 。此角色允许开发者向 Cloud KMS 请求密钥 并在该文件夹或项目中创建资源时服务代理。

选择以下一个或两个步骤:

  • 在文件夹级层授予 roles/cloudkms.autokeyUser 角色:

    gcloud resource-manager folders add-iam-policy-binding \
        FOLDER_ID --role=roles/cloudkms.autokeyUser \
        --member=user:USER_EMAIL
    

    替换以下内容:

    • FOLDER_ID: 文件夹,用于启用 Autokey。
    • USER_EMAIL:要向其发送邮件的用户的电子邮件地址 您要授予其使用 Autokey 的权限。
  • 在项目级授予 roles/cloudkms.autokeyUser 角色:

    gcloud projects add-iam-policy-binding PROJECT_NUMBER \
        --role=roles/cloudkms.autokeyUser \
        --member=user:USER_EMAIL
    

    替换以下内容:

    • PROJECT_ID:资源项目的 ID。
    • USER_EMAIL:要向其发送邮件的用户的电子邮件地址 您要授予其使用 Autokey 的权限。

您的 Autokey 开发者现在可以按需创建密钥。了解 创建使用 Autokey 按需创建的密钥进行保护的资源, 请参阅使用 Autokey 创建受保护的资源

使用 Terraform 启用 Autokey

以下 Terraform 示例会自动完成以下设置步骤:

  • 创建资源文件夹
  • 创建密钥项目
  • 授予用户权限
  • 设置 Cloud KMS 服务代理
  • 启用 Autokey

您必须在资源文件夹中单独创建资源项目。

variable "organization_ID" {
  description = "Your Google Cloud Org ID"
  type        = string
  default     = "ORGANIZATION_ID"
}

variable "billing_account" {
  description = "Your Google Cloud Billing Account ID"
  type        = string
  default     = "BILLING_ACCOUNT_ID"
}

/* List the users who should have the authority to enable and configure
   Autokey at a folder level */
variable "autokey_folder_admins" {
  type    = list(string)
  default = [AUTOKEY_ADMIN_USER_IDS]
}

/* List the users who should have the authority to protect their resources
   with Autokey */
variable "autokey_folder_users" {
  type    = list(string)
  default = [AUTOKEY_DEVELOPER_USER_IDS]
}

/* List the users who should have the authority to manage crypto operations in
   the Autokey key project */
variable "autokey_project_kms_admins" {
  type    = list(string)
  default = [KEY_PROJECT_ADMIN_USER_IDS]
}

/* The project ID to use for the key project. The project ID must be 6 to 30
   characters with lowercase letters, digits, hyphens. The project ID must start
   with a letter. Trailing hyphens are prohibited */
variable "key_management_project_ID" {
  description = "Sets the project ID for the Key Management Project. This project will contain the Key Rings and Keys generated by Cloud KMS Autokey"
  type        = string
  default     = "KEY_PROJECT_ID"
}

# Create a new folder
resource "google_folder" "autokey_folder" {
  parent       = "organizations/${var.organization_ID}"
  display_name = "autokey_folder"
}

# Set permissions for key admins to use Autokey in this folder
resource "google_folder_iam_binding" "autokey_folder_admin" {
  folder  = google_folder.autokey_folder.name
  role    = "roles/cloudkms.autokeyAdmin"
  members = var.autokey_folder_admins
}

# Set permissions for users to protect resources with Autokey in this folder
resource "google_folder_iam_binding" "autokey_folder_users" {
  folder  = google_folder.autokey_folder.name
  role    = "roles/cloudkms.autokeyUser"
  members = var.autokey_folder_users
}

# Create a key project to store keys created by Autokey
 resource "google_project" "key_management_project" {
  project_id      = var.key_management_project_ID
  name            = var.key_management_project_ID
  billing_account = var.billing_account
  folder_id       = google_folder.autokey_folder.name
}

output "project_number" {
  value = google_project.key_management_project.number
}

# Grant role for Cloud KMS admins to use Autokey in the key project
resource "google_project_iam_binding" "autokey_project_admin" {
  project    = google_project.key_management_project.project_id
  role       = "roles/cloudkms.admin"
  members    = var.autokey_project_kms_admins
  depends_on = [ google_project.key_management_project ]
}

# Enable the Cloud KMS API in the key project
resource "google_project_service" "enable_api" {
  service                    = "cloudkms.googleapis.com"
  project                    = google_project.key_management_project.project_id
  disable_on_destroy         = false
  disable_dependent_services = false
  depends_on                 = [google_project.key_management_project]
}

# Create Cloud KMS service agent
resource "google_project_service_identity" "KMS_Service_Agent" {
  provider   = google-beta
  service    = "cloudkms.googleapis.com"
  project    = google_project.key_management_project.project_id
  depends_on = [google_project.key_management_project]
}

/* Grant role for the Cloud KMS service agent to use delegated
   Cloud KMS admin permissions */
resource "google_project_iam_member" "autokey_project_admin" {
  project = google_project.key_management_project.project_id
  role    = "roles/cloudkms.admin"
  member  = "serviceAccount:service-${google_project.key_management_project.number}@gcp-sa-cloudkms.iam.gserviceaccount.com"
}

/* Enable AutokeyConfig in this folder */
resource "google_kms_autokey_config" "autokey_config" {
  provider    = google-beta
  folder      = google_folder.autokey_folder.folder_id
  key_project = google_project.key_management_project.project_id
}

替换以下内容:

  • BILLING_ACCOUNT_ID:您的 Google Cloud 账单 账号 ID。结算账号 ID 是一个由 18 个字符组成的字母数字值 (例如,010101-F0FFF0-10XX01)。
  • AUTOKEY_ADMIN_USER_IDS:以下电子邮件地址的电子邮件地址列表: 拥有 roles/cloudkms.autokeyAdmin 角色的用户, 示例 "Ariel@example.com", "Charlie@example.com"
  • AUTOKEY_DEVELOPER_USER_IDS:以下电子邮件地址的电子邮件地址列表: 拥有 roles/cloudkms.autokeyUser 角色的用户, 示例 "Kalani@example.com", "Mahan@example.com"
  • KEY_PROJECT_ADMIN_USER_IDS:以下电子邮件地址的电子邮件地址列表: 应具有 roles/cloudkms.admin 角色的用户,例如 "Sasha@example.com", "Nur@example.com"
  • KEY_PROJECT_ID:要用于键的 ID 项目,例如 autokey-key-project

强制使用 Autokey

如果要在一个文件夹中强制使用 Autokey,可以这样做 将 IAM 访问权限控制与 CMEK 组织政策相结合。工作原理 移除主账号的密钥创建权限 Cloud KMS 服务代理,然后要求将所有资源 由 CMEK 进行保护。

如需在文件夹中强制使用 Autokey,请完成以下步骤:

  1. 移除在密钥项目中手动创建密钥的访问权限。如果无法 则只能创建由 Autokey 创建的密钥 资源。如需详细了解如何控制访问权限,请参阅 使用 IAM 进行访问权限控制

  2. 在该文件夹上设置组织政策,要求必须 使用constraints/gcp.restrictNonCmekServices通过 CMEK 进行保护 限制条件。如需了解详情,请参阅 需要 CMEK 保护

  3. 在该文件夹上设置组织政策,要求将密钥用于 CMEK 必须来自使用 constraints/gcp.restrictCmekCryptoKeyProjects 限制条件。有关 请参阅 限制将 Cloud KMS 密钥用于 CMEK

停用 Autokey

Cloud KMS Autokey 在文件夹级层启用和停用。相同 可以为文件夹启用 Autokey 的角色可以停用 Autokey 。要对文件夹停用 Autokey,您必须清除 AutokeyConfig,可解除该文件夹与 Autokey 密钥项目。

移除该文件夹的 Autokey 配置后, 在以下情况下,Cloud KMS 服务代理无法再为开发者创建密钥: 他们会在文件夹中创建资源移除文件夹和 密钥项目会停用文件夹中的 Autokey;然而,我们 建议您同时移除 roles/cloudkms.autokeyAdminroles/cloudkms.autokeyUser 角色。

停用 Autokey 不会影响密钥项目中的现有密钥。您 可以继续使用这些密钥保护您的资源。

清除 AutokeyConfig

控制台

  1. 在 Google Cloud 控制台中,前往 KMS 控件页面。

    开始 KMS 控件

  2. 从上下文选择器中,选择要停用的文件夹 Autokey。

  3. 点击停用

    系统会显示一条消息,提示您确认要停用 Autokey。

  4. 如需停用 Autokey,请点击确认

    系统会显示一条消息,确认该文件夹已停用 Cloud KMS Autokey。

API

清除要停用的文件夹的 AutokeyConfig Autokey:

curl "https://cloudkms.googleapis.com/v1/folders/FOLDER_ID/autokeyConfig?updateMask=keyProject" \
    --request "PATCH" \
    --header "authorization: Bearer TOKEN" \
    --header "content-type: application/json" \
    --data '{}'

替换以下内容:

  • FOLDER_ID:文件夹的 ID 用于停用 Autokey 的位置。

撤消 Autokey 角色

  1. 可选:撤消 roles/cloudkms.autokeyAdmin 角色:

    gcloud resource-manager folders remove-iam-policy-binding \
        FOLDER_ID --role=roles/cloudkms.autokeyAdmin \
        --member=user:USER_EMAIL
    

    替换以下内容:

    • FOLDER_ID: 您已停用 Autokey 的文件夹。
    • USER_EMAIL:其电子邮件地址 您想撤消管理 Autokey 的权限。
  2. 可选:在文件夹级别撤消 roles/cloudkms.autokeyUser 角色:

    gcloud resource-manager folders remove-iam-policy-binding \
        FOLDER_ID --role=roles/cloudkms.autokeyUser \
        --member=user:USER_EMAIL
    

    替换以下内容:

    • FOLDER_ID: 您已停用 Autokey 的文件夹。
    • USER_EMAIL:其电子邮件地址 您想撤消使用 Autokey 的权限。
  3. 可选:在项目级撤消 roles/cloudkms.autokeyUser 角色:

    gcloud projects remove-iam-policy-binding RESOURCE_PROJECT_NUMBER \
        --role=roles/cloudkms.autokeyUser \
        --member=user:USER_EMAIL
    

    替换以下内容:

    • RESOURCE_PROJECT_NUMBER: 已停用 Autokey 的文件夹中的资源项目。
    • USER_EMAIL:其电子邮件地址 您想撤消使用 Autokey 的权限。
  4. 可选:如果您不打算继续将密钥项目用于 Autokey 用于其他文件夹,撤消 roles/cloudkms.admin 角色 为 Cloud KMS 服务代理指定以下权限:

    gcloud projects remove-iam-policy-binding KEY_PROJECT_NUMBER \
        --role=roles/cloudkms.admin \
        --member=serviceAccount:service-KEY_PROJECT_NUMBER@gcp-sa-cloudkms.iam.gserviceaccount.com
    

    KEY_PROJECT_NUMBER 替换为密钥项目的数字 ID。

  5. 可选:如果您不打算继续使用在密钥内创建的密钥 项目,请撤消 Cloud KMS 的 roles/cloudkms.admin 角色 管理员:

    gcloud projects remove-iam-policy-binding KEY_PROJECT_NUMBER \
        --role=roles/cloudkms.admin \
        --member=user:KEY_ADMIN_EMAIL
    

    替换以下内容:

    • KEY_PROJECT_NUMBER: 密钥项目
    • USER_EMAIL:其电子邮件地址 您想撤消使用 Autokey 的权限。

后续步骤