IBM Cloud Docs
存储任意私钥

存储任意私钥

您可以使用 IBM Cloud® Secrets Manager 来存储用于访问 IBM Cloud内部或外部受保护系统的任意私钥。

任意私钥是一种应用程序私钥,可用于保存结构化或非结构化数据,例如密钥,配置文件或任何其他敏感信息。 创建私钥后,可以使用它将应用程序连接到受保护资源 (例如第三方应用程序或数据库)。 私钥安全地存储在专用 Secrets Manager 服务实例中,您可以在其中集中管理其生命周期。

要了解有关可以在 Secrets Manager中管理的私钥类型的更多信息,请参阅 什么是私钥?

准备工作

开始之前,请确保您具有所需的访问级别。 要创建或添加私钥,您需要 写入者 服务角色或更高级别的

在 UI 中创建任意私钥

要使用 Secrets Manager UI 添加任意私钥,请完成以下步骤。

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

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

  3. 在“私钥”表中,单击 添加

  4. 从私钥类型列表中,单击 其他私钥类型 磁贴。

  5. 单击下一步

  6. 添加名称和描述以轻松识别私钥。

  7. 选择要分配给私钥的 私钥组包含实例中的私钥的环境和约束必须遵守。 用户可以与一个秘密群组关联,以实现访问和协作。

    没有秘密小组吗 在 私钥组 字段中,可以单击 创建 以提供新组的名称和描述。 您的私钥将自动添加到新组中。 有关私钥组的更多信息,请查看 组织私钥

  8. 可选: 添加标签以帮助您在实例中搜索类似私钥。

  9. 可选: 将元数据添加到私钥或私钥的特定版本。

    1. 上载文件或以 JSON 格式输入元数据和版本元数据。
  10. 单击下一步

  11. 选择文件或输入要与私钥关联的私钥值。

Secrets Manager 仅针对任意私钥支持基于文本的有效内容。 如果选择要分配给任意私钥的文件,那么服务将使用 base64 编码在实例中存储数据。 要在以后访问此私钥,您需要 base64 对其进行解码。 考虑在秘密上指定一个带有编码数据的标签,如 "encode:base64,以便跟踪需要base64解码的秘密。

  1. 可选: 启用到期以控制私钥的生命周期。
  2. 要设置私钥的到期日期,请将到期切换开关切换为
  3. 单击下一步
  4. 查看私钥的详细信息。
  5. 单击添加

从 CLI 创建任意私钥

开始之前,请 按照 CLI 文档 设置 API 端点。

要使用 Secrets Manager CLI 插件创建任意私钥,请运行 ibmcloud secrets-manager secret-create 命令。 您可以使用 --secret-type arbitrary 选项来指定私钥类型。 例如,以下命令创建任意私钥并将 secret-data 存储为其值。

Secrets Manager 仅针对任意私钥支持基于文本的有效内容。 如果需要上载二进制文件,那么必须首先对数据进行 base64 编码,以便可以单行字符串将其传递到 Secrets Manager CLI。 要稍后以原始格式访问此私钥,需要 base64 对其进行解码。 考虑在秘密上指定一个带有编码数据的标签,如 "encode:base64,以便跟踪需要base64解码的秘密。

ibmcloud secrets-manager secret-create \    
    --secret-prototype='{"custom_metadata": {"anyKey": "anyValue"}, "description": "Description of my arbitrary secret.", "expiration_date": "2023-10-05T11:49:42Z", "labels": ["dev","us-south"], "name": "example-arbitrary-secret", "secret_group_id": "default", "secret_type": "arbitrary", "payload": "secret-data", "version_custom_metadata": {"anyKey": "anyValue"}}'

该命令输出私钥的标识值以及其他元数据。 有关命令选项的更多信息,请参阅 ibmcloud secrets-manager secret-create

使用 API 创建任意私钥

您可以通过调用 Secrets Manager API 以编程方式创建任意私钥。

以下示例显示可用于创建和存储任意私钥的查询。 调用 API 时,请将标识变量和 IAM 令牌替换为特定于 Secrets Manager 实例的值。

您可以使用 custom_metadataversion_custom_metadata 请求参数来存储与组织需求相关的元数据。 仅针对私钥版本返回 version_custom_metadata 的值。 私钥的定制元数据存储为最多 50 个版本的所有其他元数据,并且不得包含机密数据。

Secrets Manager 仅针对任意私钥支持基于文本的有效内容。 如果需要上载二进制文件,那么必须首先对数据进行 base64 编码,以便可以将其以单行字符串的形式传递到 Secrets Manager API。 要稍后以原始格式访问此私钥,需要 base64 对其进行解码。 考虑在秘密上指定一个带有编码数据的标签,如 "encode:base64,以便跟踪需要base64解码的秘密。

curl -X POST
    -H "Authorization: Bearer {iam_token}" \
    -H "Accept: application/json" \
    -H "Content-Type: application/json" \
    -d '{
          "custom_metadata": {
            "metadata_custom_key": "metadata_custom_value"
          },
          "description": "Description of my arbitrary secret.",
          "expiration_date": "2023-10-05T11:49:42Z",
          "labels": [
            "dev",
            "us-south"
          ],
          "name": "example-arbitrary-secret",
          "payload": "secret-data",
          "secret_group_id": "67d025e1-0248-418f-83ba-deb0ebfb9b4a",
          "secret_type": "arbitrary",
          "version_custom_metadata": {
          "custom_version_key": "custom_version_value"} }' \
      "https://{instance_ID}.{region}.secrets-manager.appdomain.cloud/api/v2/secrets"

成功响应会返回秘密的 ID 值和其他元数据。 有关必需和可选请求参数的更多信息,请查看 API 参考

使用 Terraform 创建任意私钥

您可以使用 Terraform for Secrets Manager以编程方式创建任意私钥。

遵循 Terraform 最佳实践来保护敏感输入变量 (例如,私钥凭证)。 有关更多信息,请参阅 保护敏感输入变量

以下示例显示了可用于通过在 terraform.tfvars 文件中设置敏感值来创建任意私钥的配置。

  1. variables.tf 文件中定义任意私钥有效内容的输入变量。

    		variable "arbitrary_secret_payload" {
    			description = "Arbitrary secret payload"
    			type        = string
    			sensitive   = true
    		}
    
  2. terraform.tfvars 文件中为 arbitrary_secret_payload 变量指定值。

    通过使用 .tfvars 文件设置值,可以将敏感值与其余变量值分开,并确保使用配置的用户知道哪些值是敏感值。 出于安全考虑,您必须仅与具有相应访问权的用户维护和共享 .tfvars 文件。 您还必须注意不要将具有敏感值的 .tfvars 文件以明文形式存储到版本控件 (例如 Github) 中。

    	arbitrary_secret_payload = "my sensitive arbitrary payload"
    
  3. main.tf 文件中创建任意私钥。

    	resource "ibm_sm_arbitrary_secret" "sm_arbitrary_secret" {
    		instance_id = local.instance_id
    		region = local.region
    		description = "Extended description for this arbitrary secret"
    		labels = [ "tf-resource"]
    		name = "test-arbitrary-secret"
    		secret_group_id = ibm_sm_secret_group.sm_secret_group_test.secret_group_id
    		payload = var.arbitrary_secret_payload
    	}