锁定私钥
使用 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 个锁定。 每个锁定都可用于表示使用您的私钥的单个应用程序或服务。
在您将一个或多个锁定附加到私钥后,该私钥将被视为已锁定。 只能对包含活动有效内容或私钥数据的私钥版本应用锁定。
为了帮助您在单个操作中创建新锁和除去旧锁,还可以在创建锁时指定可选方式。
方式 | 描述 |
---|---|
除去先前锁定 | 除去与您指定的名称匹配的任何其他锁定。 如果在先前版本的私钥中找到任何匹配的锁定,那么在创建新锁时将删除这些锁定。
例如,假定私钥的先前版本包含锁定 |
除去先前锁定并删除先前版本数据 | 与先前选项相同,但如果先前私钥版本的数据没有任何关联的锁定,那么也会永久删除该数据。
假设私钥的先前版本包含锁定 |
锁定当前秘密版本
您可以使用 Secrets Manager UI 来锁定私钥的当前版本。 成功的请求会将新锁定附加到所选私钥的当前版本,或者替换同名的锁定 (如果已存在)。
-
在控制台中,单击 菜单 图标
> 资源列表。
-
从服务列表中,选择 Secrets Manager的实例。
-
在 Secrets Manager UI 中,转至 密钥 列表。
-
在要锁定的私钥所在的行中,单击 操作 菜单
> 锁定> 创建锁定。
-
添加名称和描述,以方便识别锁。
-
从要锁定的版本列表中,选择 当前。
-
可选: 将 JSON 属性附加到锁定。
您可以将 JSON 对象包含在每个锁定中,以保存自动流可能需要的任何信息。 例如,用于标识要与此锁定关联的资源的“键/值”对。
-
可选: 使锁定互斥。
选择此选项以除去与您提供的名称匹配的任何其他锁定。 如果在先前版本的私钥中找到任何匹配的锁定,那么在创建新锁定时将删除这些锁定。
-
可选:删除以前版本的数据。
选择此选项还可永久删除先前私钥版本的数据 (如果它没有与之关联的任何锁定)。
-
单击创建。
将为所选密钥版本创建新锁定。
在先前私钥版本上创建锁定
您可以使用 Secrets Manager UI 来锁定先前版本的私钥。 成功的请求会将新锁定附加到所选私钥的先前版本,或者替换同名的锁定 (如果已存在)。
-
在 Secrets Manager UI 中,转至 密钥 列表。
-
在要锁定的私钥所在的行中,单击 操作 菜单
> 锁定> 创建锁定。
-
添加名称和描述,以方便识别锁。
-
从要锁定的版本列表中,选择 上一个。
-
可选: 将 JSON 属性附加到锁定。
您可以将 JSON 对象包含在每个锁定中,以保存自动流可能需要的任何信息。 例如,用于标识要与此锁定关联的资源的“键/值”对。
-
单击创建。
将为所选密钥版本创建新锁定。
通过 CLI 创建锁
您可以使用 Secrets Manager CLI 对私钥创建最多 1000 个锁定。 每个锁定都可用于表示使用您的私钥的单个应用程序或服务。
在您将一个或多个锁定附加到私钥后,该私钥将被视为已锁定。 只能对包含活动有效内容或私钥数据的私钥版本应用锁定。
为了帮助您在单个操作中创建新锁和除去旧锁,还可以在创建锁时指定可选方式。
方式 | 描述 |
---|---|
除去先前锁定 | 除去与您指定的名称匹配的任何其他锁定。 如果在先前版本的私钥中找到任何匹配的锁定,那么在创建新锁时将删除这些锁定。
例如,假定私钥的先前版本包含锁定 |
除去先前锁定并删除先前版本数据 | 与先前选项相同,但如果先前私钥版本的数据没有任何关联的锁定,那么也会永久删除该数据。
假设私钥的先前版本包含锁定 |
锁定当前秘密版本
您可以使用 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 |
除去与您指定的名称匹配的任何其他锁定。 如果在先前版本的私钥中找到任何匹配的锁定,那么在创建新锁时将删除这些锁定。
例如,假定私钥的先前版本包含锁定 |
除去先前锁定 | mode=remove_previous_and_delete |
与 remove_previous 选项相同,但如果先前私钥版本的数据没有任何关联的锁定,那么也会永久删除该数据。
假设私钥的先前版本包含锁定 |
在当前私钥版本上创建锁定
以下请求会在密钥的当前版本上创建两个锁定。 调用 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 删除附加到现有私钥的锁定。
-
在控制台中,单击 菜单 图标
> 资源列表。
-
从服务列表中,选择 Secrets Manager的实例。
-
在 Secrets Manager UI 中,转至 密钥 列表。
-
在要更新的私钥所在的行中,单击 操作 菜单
> 锁定。
-
在要删除的锁定的行中,单击 操作 菜单
> 删除。
-
要确认删除,请输入私钥的名称。 单击删除。
现在已删除您的锁定。 要完全解锁该私钥,您可以除去所有现有锁定。
使用应用程序接口删除锁
您可以使用 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 参考。