IBM Cloud Docs
锁定私钥

锁定私钥

使用 IBM Cloud® Secrets Manager时,可以对私钥创建锁定,以防止在应用程序使用这些私钥时将其删除或修改。

缺省情况下,授权用户或应用程序可以随时修改您在 Secrets Manager 中管理的私钥。 有时,例如在安全审计期间,您可能希望阻止团队中的某个人意外删除私钥。 或者,如果计划定期轮换私钥,那么您可能正在寻找一种方法,以便在进行轮换后安全地部署最新版本的私钥。 通过锁定,您可以构建可帮助您执行以下操作的自动化工作流程:

  • 指示一个或多个应用程序或服务正在使用私钥。
  • 即使在私钥到期后也阻止删除私钥数据。
  • 在将最新版本完全部署到应用程序之后,安全地删除较旧版本的私钥。
  • 避免在应用程序中无意中停机。

要了解有关使用锁定以避免应用程序停机的建议准则,请查看 旋转和锁定私钥的最佳实践

准备工作

开始之前,请确保您具有所需的访问级别。 要管理对私钥的锁定,您需要 管理者 服务角色

锁定私钥

锁定私钥可防止可能导致修改或删除其私钥数据的任何操作。 要锁定私钥,请将一个或多个锁定附加到其当前版本或先前版本。

  • 当您尝试修改或删除被锁定的秘密时,Secrets Manager 会以 HTTP 412 Precondition Failed 响应拒绝该请求。 您将看到与下例类似的错误信息:

    The requested action can't be completed because the secret version is locked.
    

    如果您正在使用 动态私钥这是一个唯一值,例如密码或 API 密钥,它是动态创建的,并租赁给需要访问受保护资源的应用程序。 动态私钥到达其租赁结束后,将撤销对受保护资源的访问权,并自动删除该私钥。(例如 IAM 凭证),那么锁定私钥也意味着缺省情况下无法读取或访问这些私钥。 有关更多信息,请参阅 为什么无法读取已锁定的 IAM 凭证私钥?

    只有完成所有任务后,才能锁定自定义凭证机密。

  • 如果锁定的私钥到达其到期日期,那么它将保持处于 活动 状态,并且其数据仍可供应用程序访问。Secrets Manager 将私钥移至 已销毁 状态,并仅在除去私钥上的所有锁定后永久删除到期的私钥数据。

    SSL/TLS 证书仍达到其定义的到期日期,并进入 已销毁 状态,即使已锁定也是如此。 有关更多信息,请参阅 为什么锁定的证书会变为 "已销毁" 状态?

  • 如果您尝试在其当前版本处于锁定状态且先前版本处于解锁状态 (或者如果调度了自动旋转) 时轮换私钥,那么允许请求轮换私钥。 当前私钥版本将成为新的先前版本,保留其现有锁定。 将创建没有任何锁定的新当前版本。

  • 如果您尝试在其先前版本处于锁定状态时轮换私钥 (或者如果调度了自动轮换),那么您轮换私钥的请求将被拒绝。 仅在除去先前私钥版本上的所有锁定后,才允许旋转。

在 UI 中创建锁定

您可以使用 Secrets Manager UI 对私钥创建最多 1000 个锁定。 每个锁定都可用于表示使用您的私钥的单个应用程序或服务。

在您将一个或多个锁定附加到私钥后,该私钥将被视为已锁定。 只能对包含活动有效内容或私钥数据的私钥版本应用锁定。

为了帮助您在单个操作中创建新锁和除去旧锁,还可以在创建锁时指定可选方式。

可选锁定模式及其说明
方式 描述
除去先前锁定 除去与您指定的名称匹配的任何其他锁定。 如果在先前版本的私钥中找到任何匹配的锁定,那么在创建新锁时将删除这些锁定。

例如,假定私钥的先前版本包含锁定 lock-x。 在私钥的当前版本上创建锁定并启用 删除匹配锁定 选项将导致从先前版本中除去 lock-x

除去先前锁定并删除先前版本数据 与先前选项相同,但如果先前私钥版本的数据没有任何关联的锁定,那么也会永久删除该数据。

假设私钥的先前版本包含锁定 lock-z。 使用 删除匹配锁定删除先前版本的数据 选项在当前版本的私钥上创建锁定会导致从先前版本中除去 lock-z。 此外,由于先前版本没有附加任何其他锁定,因此还会删除与先前版本关联的私钥数据。

锁定当前秘密版本

您可以使用 Secrets Manager UI 来锁定私钥的当前版本。 成功的请求会将新锁定附加到所选私钥的当前版本,或者替换同名的锁定 (如果已存在)。

  1. 在控制台中,单击 菜单 图标 "菜单" 图标 > 资源列表

  2. 从服务列表中,选择 Secrets Manager的实例。

  3. 在 Secrets Manager UI 中,转至 密钥 列表。

  4. 在要锁定的私钥所在的行中,单击 操作 菜单 "操作" 图标 > 锁定> 创建锁定

  5. 添加名称和描述,以方便识别锁。

  6. 从要锁定的版本列表中,选择 当前

  7. 可选: 将 JSON 属性附加到锁定。

    您可以将 JSON 对象包含在每个锁定中,以保存自动流可能需要的任何信息。 例如,用于标识要与此锁定关联的资源的“键/值”对。

  8. 可选: 使锁定互斥。

    选择此选项以除去与您提供的名称匹配的任何其他锁定。 如果在先前版本的私钥中找到任何匹配的锁定,那么在创建新锁定时将删除这些锁定。

  9. 可选:删除以前版本的数据。

    选择此选项还可永久删除先前私钥版本的数据 (如果它没有与之关联的任何锁定)。

  10. 单击创建

将为所选密钥版本创建新锁定。

在先前私钥版本上创建锁定

您可以使用 Secrets Manager UI 来锁定先前版本的私钥。 成功的请求会将新锁定附加到所选私钥的先前版本,或者替换同名的锁定 (如果已存在)。

  1. 在 Secrets Manager UI 中,转至 密钥 列表。

  2. 在要锁定的私钥所在的行中,单击 操作 菜单 "操作" 图标 > 锁定> 创建锁定

  3. 添加名称和描述,以方便识别锁。

  4. 从要锁定的版本列表中,选择 上一个

  5. 可选: 将 JSON 属性附加到锁定。

    您可以将 JSON 对象包含在每个锁定中,以保存自动流可能需要的任何信息。 例如,用于标识要与此锁定关联的资源的“键/值”对。

  6. 单击创建

    将为所选密钥版本创建新锁定。

通过 CLI 创建锁

您可以使用 Secrets Manager CLI 对私钥创建最多 1000 个锁定。 每个锁定都可用于表示使用您的私钥的单个应用程序或服务。

在您将一个或多个锁定附加到私钥后,该私钥将被视为已锁定。 只能对包含活动有效内容或私钥数据的私钥版本应用锁定。

为了帮助您在单个操作中创建新锁和除去旧锁,还可以在创建锁时指定可选方式。

可选锁定模式及其说明
方式 描述
除去先前锁定 除去与您指定的名称匹配的任何其他锁定。 如果在先前版本的私钥中找到任何匹配的锁定,那么在创建新锁时将删除这些锁定。

例如,假定私钥的先前版本包含锁定 lock-x。 在私钥的当前版本上创建锁定并启用 删除匹配锁定 选项将导致从先前版本中除去 lock-x

除去先前锁定并删除先前版本数据 与先前选项相同,但如果先前私钥版本的数据没有任何关联的锁定,那么也会永久删除该数据。

假设私钥的先前版本包含锁定 lock-z。 使用 删除匹配锁定删除先前版本的数据 选项在当前版本的私钥上创建锁定会导致从先前版本中除去 lock-z。 此外,由于先前版本没有附加任何其他锁定,因此还会删除与先前版本关联的私钥数据。

锁定当前秘密版本

您可以使用 Secrets Manager CLI 来锁定私钥的当前版本。 成功的请求会将新锁定附加到所选私钥的当前版本,或者替换同名的锁定 (如果已存在)。

要使用 Secrets Manager CLI 插件对当前版本的私钥创建锁定,请运行 ibmcloud secrets-manager secret-locks-bulk-create 命令。 您可以指定私钥类型,私钥标识和方式。

ibmcloud secrets-manager secret-locks-bulk-create \
    --id=exampleString \
    --locks='[{"name": "lock-example-1", "description": "lock for consumer 1", "attributes": {"anyKey": "anyValue"}}]' \
    --mode=remove_previous

使用应用程序接口创建锁

您可以使用 Secrets Manager API 对私钥创建最多 1000 个锁定。 每个锁定都可以用于表示使用您的私钥的单个应用程序或使用者。 成功的请求会将新锁定附加到私钥,或者替换同名的锁定 (如果已存在)。

在您将一个或多个锁定附加到私钥后,该私钥将被视为已锁定。 只能对包含活动有效内容或私钥数据的私钥版本应用锁定。

为了帮助您在单个操作中创建新锁和除去旧锁,还可以在创建锁时指定可选方式。

可选锁定模式及其说明
方式 查询参数 描述
除去先前锁定 mode=remove_previous 除去与您指定的名称匹配的任何其他锁定。 如果在先前版本的私钥中找到任何匹配的锁定,那么在创建新锁时将删除这些锁定。

例如,假定私钥的先前版本包含锁定 lock-x。 在当前私钥版本上创建锁定并启用 remove_previous 方式将导致从先前版本中除去 lock-x

除去先前锁定 mode=remove_previous_and_delete remove_previous 选项相同,但如果先前私钥版本的数据没有任何关联的锁定,那么也会永久删除该数据。

假设私钥的先前版本包含锁定 lock-z。 在当前私钥版本上创建锁定并启用 remove_previous_and_delete 方式将导致从先前版本中除去 lock-z。 此外,由于先前版本没有附加任何其他锁定,因此还会删除与先前版本关联的私钥数据。

在当前私钥版本上创建锁定

以下请求会在密钥的当前版本上创建两个锁定。 调用 API 时,请将标识变量和 IAM 令牌替换为特定于 Secrets Manager 实例的值。

curl -X POST
-H "Authorization: Bearer {iam_token}" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
      "locks": [
        {
          "name": "lock-1",
          "description": "Lock for consumer 1.",
          "attributes": {
            "key": "value"
          }
        },
        {
          "name": "lock-2",
          "description": "Lock for consumer 2.",
          "attributes": {
            "key": "value"
            }
          }
        ]
      }' \
    "https://{instance_ID}.{region}.secrets-manager.appdomain.cloud/api/v2/secrets/{id}/locks_bulk"

如果要构建自动化流,那么可以使用 attributes 对象来指定密钥值数据以及对私钥的每个锁定。 例如,可以包含资源标识,例如标识或云资源名称 (CRN)。

成功响应将返回有关新锁定以及其他元数据的详细信息。

{
  "secret_id": "0cf4addb-7a90-410b-a3a7-a15bbe2b7909",
  "secret_group_id": "d8371728-95c8-4c12-b2af-1af98adb9e41",
  "versions": [
    {
      "version_id": "7bf3814d-58f8-4df8-9cbd-f6860e4ca973",
      "version_alias": "current",
      "locks": [
        "lock-3",
        "lock-4"
      ],
      "payload_available": true
    },
    {
      "version_id": "5bf89b0c-df55-c8d5-7ad6-8816951c6784",
      "version_alias": "previous",
      "locks": [
        "lock-1",
        "lock-2"
      ],
      "payload_available": true
    }
  ]
}

有关必需和可选请求参数的更多信息,请参阅 API 参考

在先前私钥版本上创建锁定

以下请求将在先前版本的私钥上创建两个锁定。 调用 API 时,请将标识变量和 IAM 令牌替换为特定于 Secrets Manager 实例的值。

curl -X POST
    -H "Authorization: Bearer {iam_token}" \
    -H "Accept: application/json" \
    -H "Content-Type: application/json" \
    -d '{
      "locks": [
        {
          "name": "lock-1",
          "description": "Lock for consumer 1.",
          "attributes": {
            "key": "value"
            }
          },
          {
            "name": "lock-2",
            "description": "Lock for consumer 2.",
            "attributes": {
              "key": "value"
              }
            }
          ]
        }' \ "https://{instance_ID}.{region}.secrets-manager.appdomain.cloud/api/v2/secrets/{id}/versions/{version_id}/locks_bulk"

成功响应将返回有关新锁定以及其他元数据的详细信息。

{
  "secret_id": "0cf4addb-7a90-410b-a3a7-a15bbe2b7909",
  "secret_group_id": "d8371728-95c8-4c12-b2af-1af98adb9e41",
  "versions": [
    {
      "version_id": "7bf3814d-58f8-4df8-9cbd-f6860e4ca973",
      "version_alias": "current",
      "locks": [
        "lock-3",
        "lock-4"
      ],
      "payload_available": true
    },
    {
      "version_id": "5bf89b0c-df55-c8d5-7ad6-8816951c6784",
      "version_alias": "previous",
      "locks": [
        "lock-1",
        "lock-2"
      ],
      "payload_available": true
    }
  ]
}

有关必需和可选请求参数的更多信息,请参阅 API 参考

正在解锁私钥

私钥被视为已解锁,并且只有在除去其所有关联的锁定后才能修改或删除。 您可以使用 Secrets Manager UI 或 API 来删除与私钥关联的锁定。

在 UI 中删除锁定

您可以使用 Secrets Manager UI 删除附加到现有私钥的锁定。

  1. 在控制台中,单击 菜单 图标 "菜单" 图标 > 资源列表

  2. 从服务列表中,选择 Secrets Manager的实例。

  3. 在 Secrets Manager UI 中,转至 密钥 列表。

  4. 在要更新的私钥所在的行中,单击 操作 菜单 "操作" 图标 > 锁定

  5. 在要删除的锁定的行中,单击 操作 菜单 "操作" 图标 > 删除

  6. 要确认删除,请输入私钥的名称。 单击删除

    现在已删除您的锁定。 要完全解锁该私钥,您可以除去所有现有锁定。

使用应用程序接口删除锁

您可以使用 Secrets Manager API 来删除与特定私钥版本关联的一个或多个锁定。

成功的请求会删除您指定的锁定。 要除去所有锁定,可以在请求主体中传递 {"locks": ["*"]}。 否则,请指定要删除的锁定的名称。 例如,{"locks": ["lock-1", "lock-2"]}

要了解私钥是否包含锁定,请检查作为私钥元数据一部分返回的 locks_total 字段。

curl -X DELETE  
  -H "Authorization: Bearer {iam_token}" \
  -H "Accept: application/json" \
  "https://{instance_ID}.{region}.secrets-manager.appdomain.cloud/api/v2/secrets/{secret_id}/versions/{id}/locks_bulk?name=[ "lock-example-1" ]"

有关必需和可选请求参数的更多信息,请参阅 API 参考