为区域性密钥添加 CMEK 加密

本页面介绍了如何使用客户管理的加密密钥 (CMEK) 创建新 Secret,以及如何更新现有 Secret 以使用 CMEK 密钥。

概览

CMEK 可为以区域 Secret 形式存储的敏感数据增加额外的安全层和控制权。您可以使用 CMEK 来实现以下目标:

  • 完全控制用于保护 Secret 的加密密钥。
  • 使用您自己的密钥管理系统,该系统可能具有更严格的安全政策、审核功能和合规性功能。
  • 通过将密钥保留在您自己的基础架构中,遵守数据主权法规。
  • 为加密密钥定义精细的访问权限控制,指定哪些人可以使用这些密钥以及用于哪些目的。

限制:

将 CMEK 与区域级 Secret 搭配使用时,存在以下限制:

准备工作

  1. 为每个项目启用一次 Secret Manager API
  2. 在项目、文件夹或组织中分配 Secret Manager 管理员角色 (roles/secretmanager.admin)。
  3. 使用以下方法之一向 Secret Manager API 进行身份验证:

    • 如果您使用客户端库来访问 Secret Manager API,请设置应用默认凭据
    • 如果您使用 Google Cloud CLI 访问 Secret Manager API,请使用 Google Cloud CLI 凭据进行身份验证。
    • 如需对 REST 调用进行身份验证,请使用 Google Cloud CLI 凭据或应用默认凭据。
  4. 如需启用 CMEK 并创建此步骤所需的 CMEK 密钥和密钥环,请参阅为 Secret Manager 启用客户管理的加密密钥

创建使用 CMEK 加密的区域级密钥

如需创建使用 CMEK 加密的新 Secret,请使用以下方法之一:

控制台

  1. 在 Google Cloud 控制台中,前往 Secret Manager 页面。

    前往 Secret Manager

  2. Secret Manager 页面上,点击区域性 Secret 标签页,然后点击创建区域性 Secret

  3. 创建区域级 Secret 页面的名称字段中,输入 Secret 的名称。 Secret 名称可以包含大写和小写字母、数字、连字符和下划线。允许的名称长度上限为 255 个字符。

  4. 输入密文的值(例如 abcd1234)。密文的值可以采用任何格式,但不得超过 64 KiB。您还可以使用上传文件选项上传包含 Secret 值的文本文件。此操作会自动创建 Secret 版本。

  5. 区域列表中选择您要存储区域级密钥的位置。

  6. 加密下,选择客户管理的加密密钥 (CMEK),然后从加密密钥列表中选择您的 CMEK 密钥。确保您的 CMEK 密钥存在于指定位置,并且您的 Secret Manager 项目拥有使用该密钥所需的权限。

  7. 点击创建密钥

gcloud

在使用下面的命令数据之前,请先进行以下替换:

  • SECRET_ID:相应 Secret 的 ID 或完全限定标识符
  • LOCATION:您要在其中创建 Secret 的 Google Cloud 位置
  • CMEK_KEY:Cloud Key Management Service 中将用于保护相应 Secret 的特定 CMEK 密钥的完全限定路径

执行以下命令:

Linux、macOS 或 Cloud Shell

gcloud secrets create SECRET_ID --location=LOCATION \
    --regional-kms-key-name=CMEK_KEY

Windows (PowerShell)

gcloud secrets create SECRET_ID --location=LOCATION `
    --regional-kms-key-name=CMEK_KEY

Windows (cmd.exe)

gcloud secrets create SECRET_ID --location=LOCATION ^
    --regional-kms-key-name=CMEK_KEY

REST

在使用任何请求数据之前,请先进行以下替换:

  • LOCATION:您要创建 Secret 的 Google Cloud 位置
  • PROJECT_ID: Google Cloud 项目 ID。
  • SECRET_ID:相应 Secret 的 ID 或完全限定标识符。
  • KMS_PROJECT_ID:运行 Cloud Key Management Service 的 Google Cloud 项目的 ID。
  • KMS_KEY_LOCATION:Cloud KMS 密钥的位置名称。此位置必须与您的 Secret 相同。
  • YOUR_KEY_RING:您在 Cloud KMS 中存储 CMEK 密钥的密钥环的名称。
  • YOUR_CMEK_KEY:您在 Cloud KMS 中所选密钥环内创建的特定客户管理的加密密钥 (CMEK)。

HTTP 方法和网址:

POST https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/secrets?secretId=SECRET_ID

请求 JSON 正文:

{"customer_managed_encryption": {"kms_key_name": "projects/KMS_PROJECT_ID/locations/KMS_KEY_LOCATION/keyRings/YOUR_KEY_RING/cryptoKeys/YOUR_CMEK_KEY"}}

如需发送请求,请选择以下方式之一:

curl

将请求正文保存在名为 request.json 的文件中,然后执行以下命令:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/secrets?secretId=SECRET_ID"

PowerShell

将请求正文保存在名为 request.json 的文件中,然后执行以下命令:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/secrets?secretId=SECRET_ID" | Select-Object -Expand Content

您应该收到类似以下内容的 JSON 响应:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/secrets/SECRET_ID",
  "createTime": "2024-03-27T13:30:07.437859Z",
  "etag": "\"1614a467b60423\""
  "customerManagedEncryption": {
    "kmsKeyName": "projects/KMS_PROJECT_ID/locations/KMS_KEY_LOCATION/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key"
  }
}

更新现有 Secret 以使用 CMEK

如需更新现有 Secret 以使用 CMEK,请使用以下方法之一:

控制台

  1. 在 Google Cloud 控制台中,前往 Secret Manager 页面。

    前往 Secret Manager

  2. Secret Manager 页面上,点击区域级 Secret 标签页。

  3. 如需修改 Secret,请使用以下方法之一:

    • 在列表中找到相应 Secret,然后点击与该 Secret 关联的 操作菜单。在操作菜单中,点击修改

    • 点击相应 Secret 的名称,前往该 Secret 的详情页面。在密钥详情页面上,点击 修改密钥

  4. 修改密钥页面上,前往加密部分。

  5. 加密下,选择客户管理的加密密钥 (CMEK),然后从加密密钥列表中选择您的 CMEK 密钥。确保您的 CMEK 密钥存在于指定位置,并且您的 Secret Manager 项目拥有使用该密钥所需的权限。

  6. 点击更新密钥

gcloud

在使用下面的命令数据之前,请先进行以下替换:

  • SECRET_ID:相应 Secret 的 ID 或完全限定标识符
  • LOCATION:相应 Secret 的 Google Cloud 位置
  • CMEK_KEY:Cloud Key Management Service 中将用于保护相应 Secret 的特定 CMEK 密钥的完全限定路径

执行以下命令:

Linux、macOS 或 Cloud Shell

gcloud secrets update SECRET_ID --location=LOCATION \
    --regional-kms-key-name=CMEK_KEY

Windows (PowerShell)

gcloud secrets update SECRET_ID --location=LOCATION `
    --regional-kms-key-name=CMEK_KEY

Windows (cmd.exe)

gcloud secrets update SECRET_ID --location=LOCATION ^
    --regional-kms-key-name=CMEK_KEY

REST

在使用任何请求数据之前,请先进行以下替换:

  • LOCATION:相应 Secret 的 Google Cloud 位置
  • PROJECT_ID: Google Cloud 项目 ID。
  • SECRET_ID:相应 Secret 的 ID 或完全限定标识符。
  • KMS_PROJECT_ID:运行 Cloud Key Management Service 的 Google Cloud 项目的 ID。
  • KMS_KEY_LOCATION:Cloud KMS 密钥的位置。此位置必须与您的 Secret 相同。
  • YOUR_KEY_RING:您在 Cloud KMS 中存储 CMEK 密钥的密钥环的名称。
  • YOUR_CMEK_KEY:您在 Cloud KMS 中所选密钥环内创建的特定客户管理的加密密钥 (CMEK)。

HTTP 方法和网址:

PATCH https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/secrets/SECRET_ID?updateMask=customer_managed_encryption

请求 JSON 正文:

{"customer_managed_encryption": {"kms_key_name": "projects/KMS_PROJECT_ID/locations/KMS_KEY_LOCATION/keyRings/YOUR_KEY_RING/cryptoKeys/YOUR_CMEK_KEY"}}"

如需发送请求,请选择以下方式之一:

curl

将请求正文保存在名为 request.json 的文件中,然后执行以下命令:

curl -X PATCH \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/secrets/SECRET_ID?updateMask=customer_managed_encryption"

PowerShell

将请求正文保存在名为 request.json 的文件中,然后执行以下命令:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method PATCH `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://secretmanager.LOCATION.rep.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/secrets/SECRET_ID?updateMask=customer_managed_encryption" | Select-Object -Expand Content

您应该收到类似以下内容的 JSON 响应:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/secrets/SECRET_ID",
  "createTime": "2024-03-27T13:30:07.437859Z",
  "etag": "\"16211daf5f29c5\""
  "customerManagedEncryption": {
    "kmsKeyName": "projects/KMS_PROJECT_ID/locations/KMS_KEY_LOCATION/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key"
  }
}

后续步骤