为区域性密钥添加 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 加密创建区域 Secret

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

控制台

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

    前往 Secret Manager

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

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

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

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

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

  7. 点击创建 Secret

gcloud

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

  • SECRET_ID:Secret 的 ID
  • LOCATION:您要在其中创建 Secret 的 Google Cloud 位置
  • 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)。

执行以下命令:

Linux、macOS 或 Cloud Shell

gcloud secrets create SECRET_ID --location=LOCATION
    --regional-kms-key-name="projects/KMS_PROJECT_ID/locations/KMS_KEY_LOCATION/keyRings/YOUR_KEY_RING/cryptoKeys/YOUR_CMEK_KEY"

Windows (PowerShell)

gcloud secrets create SECRET_ID --location=LOCATION
    --regional-kms-key-name="projects/KMS_PROJECT_ID/locations/KMS_KEY_LOCATION/keyRings/YOUR_KEY_RING/cryptoKeys/YOUR_CMEK_KEY"

Windows (cmd.exe)

gcloud secrets create SECRET_ID --location=LOCATION
    --regional-kms-key-name="projects/KMS_PROJECT_ID/locations/KMS_KEY_LOCATION/keyRings/YOUR_KEY_RING/cryptoKeys/YOUR_CMEK_KEY"

REST

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

  • LOCATION:您要在其中创建 Secret 的 Google Cloud 位置
  • PROJECT_ID:项目 ID。 Google Cloud
  • 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 详情页面。在 Secret 详情页面上, 点击 修改 Secret

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

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

  6. 点击更新 Secret

gcloud

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

  • SECRET_ID:Secret 的 ID
  • LOCATION:Secret 的 Google Cloud 位置
  • 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)。

执行以下命令:

Linux、macOS 或 Cloud Shell

gcloud secrets update SECRET_ID --location=LOCATION
    --regional-kms-key-name="projects/KMS_PROJECT_ID/locations/KMS_KEY_LOCATION/keyRings/YOUR_KEY_RING/cryptoKeys/YOUR_CMEK_KEY"

Windows (PowerShell)

gcloud secrets update SECRET_ID --location=LOCATION
    --regional-kms-key-name="projects/KMS_PROJECT_ID/locations/KMS_KEY_LOCATION/keyRings/YOUR_KEY_RING/cryptoKeys/YOUR_CMEK_KEY"

Windows (cmd.exe)

gcloud secrets update SECRET_ID --location=LOCATION
    --regional-kms-key-name="projects/KMS_PROJECT_ID/locations/KMS_KEY_LOCATION/keyRings/YOUR_KEY_RING/cryptoKeys/YOUR_CMEK_KEY"

REST

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

  • LOCATION:Secret 的 Google Cloud 位置
  • PROJECT_ID:项目 ID。 Google Cloud
  • 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"
  }
}

后续步骤