为区域性 Secret 添加 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. 为 Secret 输入一个值(例如 abcd1234)。Secret 值可以采用任何格式,但不得超过 64 KiB。您还可以使用上传文件选项上传包含 Secret 值的文本文件。此操作会自动创建 Secret 版本。

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

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

  7. 点击创建密钥

gcloud

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

  • SECRET_ID:Secret 的 ID 或 Secret 的完全限定标识符
  • 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:密钥的 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 页面上,点击 Regional secrets(区域级 Secret)标签页。

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

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

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

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

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

  6. 点击更新密钥

gcloud

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

  • SECRET_ID:Secret 的 ID 或 Secret 的完全限定标识符
  • LOCATION:密钥的 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:密钥的 Google Cloud 位置
  • PROJECT_ID:Google Cloud 项目 ID。
  • SECRET_ID:密钥的 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"
  }
}

后续步骤