本页介绍了如何启用和配置 Cloud KMS Autokey,以便在资源文件夹中进行 集中式密钥管理,或在项目中进行委托式密钥管理 (预览版)。如需详细了解 Autokey, 请参阅 Autokey 概览。本文档面向管理员。
准备工作
如需为文件夹中的所有项目启用 Cloud KMS Autokey 以进行集中式密钥管理(使用专用密钥项目),您必须具备以下条件:
一个组织资源,其中包含您要启用 Autokey 的文件夹。如果您没有要启用 Autokey 的文件夹,可以创建新的资源文件夹。 在此文件夹中启用 Autokey 会为该文件夹中的所有资源项目启用 Autokey。
如果您有要使用 Autokey 进行集中式密钥 管理的资源项目,但这些项目不在您要启用 Autokey 的文件夹中,您可以将现有资源项目移到 新文件夹中。
如需为项目启用 Autokey (预览版) 以 启用委托式密钥管理和同项目密钥,您必须具备以下条件之一:
- 您要启用 Autokey 的 Google Cloud 项目,且
keyHandles.create权限未被 IAM 拒绝政策阻止。 - 您要启用 Autokey 的文件夹,其中
至少包含一个项目,且
keyHandles.create权限未被 IAM 拒绝政策阻止。 Google Cloud
所需角色
如需获得启用和配置 Autokey 所需的权限,请让管理员向您授予文件夹、项目或父级资源的以下 IAM 角色:
- Cloud KMS Autokey Admin (
roles/cloudkms.autokeyAdmin) - Service Usage Admin (
roles/serviceusage.serviceUsageAdmin) -
如需启用集中式 Autokey,请授予以下角色:
- Folder IAM Admin (
roles/resourcemanager.folderIamAdmin) - Billing Account user (
roles/billing.user)
- Folder IAM Admin (
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
这些预定义角色包含 启用和配置 Autokey 所需的权限。如需查看所需的确切权限,请展开所需权限部分:
所需权限
启用和配置 Autokey 需要以下权限:
-
cloudkms.autokeyConfigs.* -
cloudkms.projects.showEffectiveAutokeyConfig -
serviceusage.services.enable -
如需启用集中式 Autokey,请授予以下权限:
-
resourcemanager.folders.get -
resourcemanager.folders.getIamPolicy -
resourcemanager.folders.setIamPolicy -
billing.resourceAssociations.create
-
确定如何启用 Autokey
您可以将 Autokey 作为基础架构即代码策略的一部分启用,方法是使用 Terraform 进行所需的配置更改。如果您 想使用 Terraform 启用 Autokey,请参阅本页上的使用 Terraform 启用 Autokey。如果您不想使用 Terraform,请先按照下一部分中的说明进行操作。
设置 Autokey 以进行集中式密钥管理
当您使用 Autokey 在文件夹中进行集中式密钥管理时,需要选择一个密钥项目来包含 Autokey 在该文件夹中创建的所有密钥。如果您使用的是委托式密钥管理 模型(预览版),则无需专用密钥项目; 请从为委托式密钥管理 启用 Autokey继续操作。
我们建议您创建一个新的密钥项目,以包含 Autokey 创建的 Cloud KMS 资源。您应在组织资源内创建密钥项目。如果您已有要用于 Autokey 创建的密钥的密钥项目,则可以跳过创建密钥 项目部分,并从配置 Autokey 密钥项目继续操作。
密钥项目可以在您计划启用 Autokey 的同一文件夹内创建。您不应在密钥项目内创建其他资源。 如果您尝试在密钥项目中创建受 Autokey 保护的资源,Autokey 会拒绝新密钥的请求。
如果您将来可能想迁移到 Assured Workloads ,请在与那些密钥保护的资源 相同的文件夹内创建密钥项目。
如果您的组织使用 constraints/gcp.restrictCmekCryptoKeyProjects 组织政策限制条件来确保所有 CMEK 都来自指定的密钥项目,则必须将您的密钥项目添加到允许的项目列表中。如需详细了解 CMEK 组织政策,请参阅 CMEK 组织
政策。
创建密钥项目
控制台
- 在 Google Cloud 控制台中,前往 管理资源 页面。
- 对于选择组织,选择要在其中创建项目的组织资源。
- 点击 Create project 。
- 在显示的新建项目窗口中,输入项目名称并 选择结算账号。项目名称只能包含字母、数字、单引号、连字符、空格或感叹号,且必须介于 4 到 30 个字符之间。
- 对于位置,选择您希望作为 密钥项目父级的资源。
- 如需完成项目创建,请点击 Create 。
gcloud
创建新项目:
gcloud projects create PROJECT_ID \ --PARENT_TYPE=PARENT_ID替换以下内容:
PROJECT_ID:包含密钥环的项目的 ID。PARENT_TYPE:您要在其中创建新密钥项目的资源的类型。输入organization以在给定组织下创建新密钥项目,或输入folder以在给定文件夹下创建新密钥项目。PARENT_ID:您要在其中创建密钥项目的组织或文件夹的 ID。
设置项目安全锁
创建 Cloud KMS 项目后,我们建议您 使用安全锁(预览版) 保护该项目, 以避免意外删除。强制执行项目安全锁后,Cloud KMS 项目将被阻止删除,直到安全锁被移除。
准备 Autokey 密钥项目
控制台
gcloud
在密钥项目中启用 Cloud KMS API:
gcloud services enable cloudkms.googleapis.com授予对该密钥项目的 Cloud KMS 管理员权限。重复以下命令,将
roles/cloudkms.admin角色授予您自己和其他 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
控制台
在 Google Cloud 控制台中,前往 KMS 控制项 页面。
从上下文选择器中,选择您要启用 Autokey 的文件夹。
点击启用 。
选择您的密钥项目,然后点击提交 。
系统会显示一条消息,确认已在该文件夹中启用 Cloud KMS Autokey。
API
为您要启用 Autokey 的文件夹创建 AutokeyConfig:
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:您要启用 Autokey 的文件夹的 ID。PROJECT_ID:密钥项目的 ID。
设置 Cloud KMS 服务代理
密钥项目的 Cloud KMS 服务代理会在资源创建期间代表 Cloud KMS 管理员创建密钥并应用 IAM 政策绑定。如需创建和分配密钥,Cloud KMS 服务代理需要 Cloud KMS 管理员权限。
创建 Cloud KMS 服务代理:
gcloud beta services identity create --service=cloudkms.googleapis.com \ --project=PROJECT_NUMBER将
PROJECT_NUMBER替换为密钥项目的项目编号。输出类似于以下内容:
Service identity created: service-PROJECT_NUMBER@gcp-sa-ekms.iam.gserviceaccount.com该命令的输出表明 Cloud EKM 服务账号(具有
gcp-sa-ekms子网域)已 创建。不过,该命令还会创建 Cloud KMS 服务 代理(具有gcp-sa-cloudkms子网域),这是 您稍后在这些说明中使用的服务代理。向服务代理授予 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 进行委托式密钥管理时,Autokey 会在与密钥保护的资源相同的项目中创建密钥。支持使用 Autokey 进行委托式密钥管理的项目可以存在于为集中式密钥管理启用 Autokey 的文件夹中。在项目中启用 Autokey 后,项目级 Autokey 配置会覆盖父级文件夹中的 Autokey 配置。
如需为单个项目启用 Autokey,请完成以下步骤:
使用 REST API,为您要启用 Autokey 的项目创建
AutokeyConfig:curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/autokeyConfig?updateMask=key_project_resolution_mode" \ --request "PATCH" \ --header "authorization: Bearer TOKEN" \ --header "content-type: application/json" \ --data '{"key_project_resolution_mode": "RESOURCE_PROJECT"}'将
PROJECT_ID替换为您要启用 Autokey 的项目的 ID。在 gcloud CLI 中,在项目中启用 Cloud KMS API:
gcloud services enable cloudkms.googleapis.com
如需为文件夹中的所有项目启用 Autokey,请完成以下步骤:
使用 REST API,为您要启用 Autokey 以使用委托式密钥管理的文件夹创建
AutokeyConfig:curl "https://cloudkms.googleapis.com/v1/folders/FOLDER_ID/autokeyConfig?updateMask=key_project_resolution_mode" \ --request "PATCH" \ --header "authorization: Bearer TOKEN" \ --header "content-type: application/json" \ --data '{"key_project_resolution_mode": "RESOURCE_PROJECT"}'将
FOLDER_ID替换为您要启用 Autokey 的文件夹的 ID。此命令会为文件夹中的所有项目启用同项目 Autokey。在 gcloud CLI 中,在您要使用 Autokey 进行委托式密钥管理的每个项目中启用 Cloud KMS API:
gcloud services enable cloudkms.googleapis.com您可以一次性在每个项目中启用 Cloud KMS API,也可以根据需要单独在各个项目中启用 API。在为项目启用 Cloud KMS API 之前,开发者无法在该项目中使用 Autokey。
使用 Terraform 启用 Autokey
使用 Terraform 进行集中式密钥管理
以下 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 administrator 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 for centralized key management in this folder */
resource "google_kms_autokey_config" "autokey_config" {
provider = google-beta
folder = google_folder.autokey_folder.folder_id
key_project = "projects/${google_project.key_management_project.project_id}"
key_project_resolution_mode = "DEDICATED_KEY_PROJECT"
# For folder scope, valid values are: DEDICATED_KEY_PROJECT, RESOURCE_PROJECT, DISABLED
# With DEDICATED_KEY_PROJECT, define the key_project as well. With RESOURCE_PROJECT,
# omit key_project. Keys will be created in the same project as the protected resource.
}
替换以下内容:
BILLING_ACCOUNT_ID:您的 Google Cloud 结算 账号 ID。结算账号 ID 是一个 18 个字符的字母数字值,以短划线分隔,例如010101-F0FFF0-10XX01。AUTOKEY_ADMIN_USER_IDS:应具有 角色的用户的电子邮件地址列表,例如"Ariel@example.com", "Charlie@example.com"。roles/cloudkms.autokeyAdminAUTOKEY_DEVELOPER_USER_IDS:应具有roles/cloudkms.autokeyUser角色的用户的电子邮件地址列表,例如"Kalani@example.com", "Mahan@example.com"。KEY_PROJECT_ADMIN_USER_IDS:应具有 角色的用户的电子邮件地址列表,例如"Sasha@example.com", "Nur@example.com"。roles/cloudkms.adminKEY_PROJECT_ID:用于专用密钥项目的 ID,例如autokey-key-project。如果您指定了密钥项目,则key_project_resolution_mode必须为DEDICATED_KEY_PROJECT。
使用 Terraform 进行委托式密钥管理
如需为文件夹中的所有项目启用 Autokey 以进行委托式密钥管理,请使用类似于以下内容的 folder_config 资源:
/* Enable AutokeyConfig on a folder */
resource "google_kms_autokey_config" "folder_config" {
provider = google-beta
folder = google_folder.autokey_folder.name
key_project_resolution_mode = "RESOURCE_PROJECT"
# For folder scope, valid values are: DEDICATED_KEY_PROJECT, RESOURCE_PROJECT, DISABLED
# With DEDICATED_KEY_PROJECT, define the key_project as well. With RESOURCE_PROJECT,
# omit key_project. Keys will be created in the same project as the protected resource.
}
如需为单个项目启用 Autokey 以进行委托式密钥管理,请使用类似于以下内容的 autokey_config_project 资源:
/* To set autokey config for a project */
resource "google_kms_autokey_config" "autokey_config_project" {
provider = google-beta
project = "projects/${google_project.key_management_project.project_id}"
key_project_resolution_mode = "RESOURCE_PROJECT"
# For project scope, valid values are: RESOURCE_PROJECT, DISABLED
}
强制使用 Autokey
如果您想在文件夹中强制使用 Autokey,可以将 IAM 访问权限控制与 CMEK 组织政策相结合来实现此目的。具体方法是,移除 Cloud KMS 服务代理以外的正文的密钥创建权限,然后要求所有资源都使用 Autokey 密钥项目通过 CMEK 进行保护。
如需在文件夹中强制使用 Autokey,请完成以下步骤:
移除在密钥项目中手动创建密钥的权限。如果无法手动创建密钥,则只能在此项目中创建 Autokey 创建的密钥。如需详细了解如何控制访问权限,请参阅 使用 IAM 进行访问权限控制。
在文件夹中设置组织政策,要求资源必须使用
constraints/gcp.restrictNonCmekServices限制条件通过 CMEK 进行保护。如需了解详情,请参阅 要求 CMEK 保护。在文件夹中设置组织政策,要求用于 CMEK 的密钥必须来自 Autokey 密钥项目,方法是使用
constraints/gcp.restrictCmekCryptoKeyProjects限制条件。如需了解详情,请参阅 限制 Cloud KMS 密钥用于 CMEK。
停用 Autokey
Cloud KMS Autokey 在文件夹级启用和停用。可以为文件夹启用 Autokey 的角色也可以为该文件夹停用 Autokey。如需在文件夹中停用 Autokey,您必须清除 AutokeyConfig 以移除文件夹与 Autokey 密钥项目之间的关联。
移除文件夹中的 Autokey 配置后,当开发者在该文件夹中创建资源时,Cloud KMS 服务代理将无法再为他们创建密钥。移除文件夹与密钥项目之间的链接会停用文件夹中的 Autokey;不过,我们建议您同时移除 roles/cloudkms.autokeyAdmin 和 roles/cloudkms.autokeyUser 角色的 IAM 绑定。
停用 Autokey 不会影响密钥项目中的现有密钥。您可以继续使用这些密钥来保护资源。
清除 AutokeyConfig
控制台
在 Google Cloud 控制台中,前往 KMS 控制项 页面。
从上下文选择器中,选择您要停用 Autokey 的文件夹。
点击停用 。
系统会显示一条消息,提示您确认是否要停用 Autokey。
如需停用 Autokey,请点击确认 。
系统会显示一条消息,确认已在该文件夹中停用 Cloud KMS Autokey。
API
清除您要停用 Autokey 的文件夹的 AutokeyConfig:
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:您要停用 Autokey 的文件夹的 ID。
撤消 Autokey 角色
可选:撤消
roles/cloudkms.autokeyAdmin角色:gcloud resource-manager folders remove-iam-policy-binding \ FOLDER_ID --role=roles/cloudkms.autokeyAdmin \ --member=user:USER_EMAIL替换以下内容:
FOLDER_ID:您已停用 Autokey 的文件夹的 ID。USER_EMAIL:您要撤消其管理 Autokey 权限的用户的电子邮件地址。
可选:在文件夹级撤消
roles/cloudkms.autokeyUser角色:gcloud resource-manager folders remove-iam-policy-binding \ FOLDER_ID --role=roles/cloudkms.autokeyUser \ --member=user:USER_EMAIL替换以下内容:
FOLDER_ID:您已停用 Autokey 的文件夹的 ID。USER_EMAIL:您要撤消其使用 Autokey 权限的用户的电子邮件地址。
可选:在项目级撤消
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 权限的用户的电子邮件地址。
可选:如果您不打算继续将密钥项目用于其他文件夹的 Autokey,请撤消 Cloud KMS 服务代理的
roles/cloudkms.admin角色: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。可选:如果您不打算继续使用在密钥项目中创建的密钥,请撤消 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 权限的用户的电子邮件地址。
后续步骤
- 详细了解何时使用 Autokey。
- 详细了解 Autokey 的工作原理。
- 您的 Autokey 开发者现在可以使用 Autokey 创建受保护的资源 。