管理工具链中的私钥
CI 和 CD 工具链中的工具集成需要机密信息,例如密码、API 密钥、证书或其他令牌。 例如,IBM Cloud® API 密钥执行基本管道任务,例如登录到 IBM Cloud。 同样,服务标识 API 密钥将证据写入 Cloud Object Store 实例中的存储区。
出于安全原因,这些私钥不得泄露人员的身份或帐户,因为人员通常具有比实际工具链自动化需求更大的访问许可权。 与个人身份或帐户的关联也将违反 "最小特权"的安全原则。 此外,人员通常会更改角色甚至公司,因此必须除去他们的凭证,这可能会破坏工具链自动化。 通过使用专门用于自动化目的的关联身份,它提供了自动化与使用自动化的人员之间的职责分离。
相反,用于非IBM Cloud 资源 (例如 GitHub Enterprise) 的私钥必须与企业内仅具有工具链所需的相应访问权的功能标识相关联。 同样,IBM Cloud 资源的私钥必须与隶属于 IAM 服务标识 的 IAM 服务标识 API 密钥 相关联。 需要将 IAM 服务标识访问许可权的作用域限定为工具链所需的最少特权。
必须安全地管理此类凭证,并遵循私钥管理最佳实践。 尤其是,这意味着使用已核准的边界保险库文件提供程序 (例如 IBM Cloud® Secrets Manager,IBM® Key Protect或 HashiCorp 保险库文件,然后将工具链私钥链接到这些资源) 来保险库文件所需的私钥。
工具链设置和管道用户界面中提供的私钥管理功能支持使用 IBM Cloud® Secrets Manager,IBM® Key Protect或 HashiCorp 保险库文件的私钥集成来选择保险库私钥。 通过使用“私钥选取器”对话框,工具链或管道编辑器可以从绑定私钥集成中选择指定的私钥,这些私钥 由 CRN (云资源名称) 或 由名称配置,然后在工具链和管道内的运行时通过引用进行解析。 选择私钥后,会将 CRN 或规范私钥引用注入到相应的工具链或管道安全属性中,其中格式为
crn:v1:...secret:<secret-guid>
(如果它是 由 CRN 配置的 Secrets Manager 集成),或者 {vault::integration-name.secret-name}
(如果它是使用任何受支持的提供程序并由 按名称配置的保险库集成)。
规范 by name 引用格式当前未解析包含私钥名称中的句点字符的私钥,因为此字符用于对规范路径的每个部分进行定界。
无论使用哪种类型的私钥引用 ( 按 CRN 或 按名称),前端用户界面组件和“私钥选取器”对话框都仅使用私钥引用。 by CRN 或 by name 私钥引用的解析值从不向前端公开,并且始终根据允许的 授权 (通过使用 IAM 授权和访问策略配置) 在运行时在工具链和管道中动态解析。
在 IBM Cloud®中,通过使用内部虚拟专用端点 (VPE) 对所有区域中的所有 IBM Cloud® Secrets Manager 和 IBM® Key Protect 提供程序实例执行解析工具链和管道中的 按 CRN 和 按名称 私钥引用的动态过程。 这将确保工具链,管道和 IBM Cloud® Secrets Manager 与 IBM® Key Protect 提供程序实例之间的所有请求和响应数据都保留在边界内的专用 IBM Cloud 网络中,并且不会通过任何公用网络通道传输。
除了从工具链中的任何绑定私钥集成中逐个手动选择所选私钥外,还提供了使用 Secret Hint
的选项。 此选项支持使用建议的私钥名称 (也称为 Hints
) 预定义工具链模板,这些私钥名称是简短格式的私钥引用。 私钥提示的格式为 {vault::secret-name}
,其中不包含私钥集成名称。 这为工具链作者提供了灵活性,因为可以将所有必需的私钥名称预填充到 toolchain.yml
中,然后针对为工具链配置的任何私钥集成自动解析这些名称。
如前所述,您可以配置 Secrets Manager 以 通过 CRN 引用私钥。 更多信息,请参阅 云资源名称(CRN)。 此格式允许更大的灵活性,因为如果存在正确的 授权,那么您可以在其他帐户中引用 Secrets Manager 实例中的私钥。 有关更多信息,请参阅 配置 Secrets Manager。
CI 和 CD 中使用的私钥概述如下:
Hint
是建议的缺省名称,根据绑定到工具链的任何可用 通过名称 私钥集成中具有相同名称的第一个匹配私钥自动解析。
DevSecOps管道秘密
私钥 | 提示 | 信息 |
---|---|---|
IBM Cloud API 密钥 | ibmcloud-api-key |
必需 :CI 和 CD 用于向 IBM 公共云认证并执行各种操作 |
GPG 专用密钥 | signing_key |
必需: 仅 CI 这是用于对 CI 管道构建的映像进行签名的证书 |
IBM 专用工作程序服务 API 密钥 | private-worker-service-api-key |
必需: 仅 CI 用于在 Tekton Private Worker 服务上运行交付管道工作负载的服务标识 API 密钥 |
GitHub 访问令牌 | git-token |
可选 :CI 和 CD 用于向 GitHub 认证并提供对存储库的访问权 |
Artifactory API 令牌 | artifactory-token |
必需 :CI 和 CD 用于访问管道任务所使用的映像 |
Slack Webhook | slack-webhook |
可选 :CI 和 CD 如果选择使用 Slack 工具集成来发布工具链状态通知,那么此 Webhook 是必需的 |
ServiceNow API 令牌 | servicenow-api-token |
必需: 仅限 CD 用于立即访问服务以执行变更管理操作 |
HashiCorp 保险库文件角色标识 | role-id |
必需 :CI 和 CD 用于向 HashiCorp 保险库服务器进行认证 |
HashiCorp 保险库密钥标识 | secret-id |
必需 :CI 和 CD 用于向 HashiCorp 保险库服务器进行认证 |
IBM Cloud Object Storage 写程序 API 密钥 | cos-api-key |
必需 :CI 和 CD 用于向 Object Storage 服务进行认证-此密钥必须具有 writer 许可权 |
IBM Cloud Object Storage 读者API密钥 | backup-cos-api-key |
必需 :CI 和 CD 用于向 Object Storage 服务进行认证-此密钥必须具有 Reader 许可权 |
SonarQube 密码或认证令牌 | sonarqube-password |
可选 :CI 用于向 SonarQube 源代码分析器进行认证 |
如果您正在使用 HashiCorp 保险库服务器,请确保 HashiCorp 保险库工具集成使用 AppRole Auth Method 方法。 使用 AppRole 认证方法时,需要 role-id
和 secret-id
才能成功将 HashiCorp 保险库服务器与工具链集成。 由于 role-id
和 secret-id
本身是私钥,因此建议使用 IBM Key Protect 工具集成 来存储这些私钥,以便可以在工具链工作流程中安全地检索和应用这些私钥。 应使用 HashiCorp 保险库文件工具集成来存储和检索所有其他工具链私钥。
如果未设置管道环境属性 git-token
,那么缺省情况下将使用 ibmcloud-api-key
来检索 Git Repos and Issue Tracking 访问令牌。 但是,如果 ibmcloud-api-key
无权访问 git
,那么必须设置 git-token
。
配置密钥库
通过 IBM Cloud,您可以从各种私钥管理和数据保护产品中进行选择,以帮助您保护敏感数据并集中私钥。 您可以根据需求在保险库集成之间进行选择,如 管理 IBM Cloud 私钥 中所述。 本文档提供有关先决条件以及如何使用规定的私钥名称列表的信息,这些私钥名称通常称为提示。 通过在模板中使用提示,可以使用预先配置的私钥自动填充工具链,而无需从附加到工具链的各种保险库集成中手动选择这些私钥。
使用 IBM Cloud® Secrets Manager 可安全地存储和应用属于工具链的密钥 (例如,API 密钥,映像签名或 HashiCorp 保险库文件凭证)。
这些模板还随附了类似以下示例的 HashiCorp 保险库文件工具集成:
要使用 HashiCorp 保险库文件,必须提供以下信息:
- 名称: 此工具集成的名称。 该名称将显示在工具链中。
- 服务器 URL:您的 HashiCorp 保管库实例的服务器 URL。 例如,
https://<vault-service>.<org>.com:8200
。 - 集成 URL:当您点击 HashiCorp 保险库集成磁贴时,您想要导航到的 URL。
- 私钥路径: 私钥存储在 HashiCorp 保险库文件实例中的安装路径。
- 认证方法: HashiCorp 保险库文件实例的认证方法。 使用
AppRole
。 - 角色标识: 用于选择用于评估其他凭证的 AppRole 的标识。
- 私钥标识: 缺省情况下,任何登录 (具有 secret_id) 都需要的凭证,旨在始终为私钥。
模板还随附了 IBM® Key Protect for IBM Cloud® 工具集成:

如果提前在 Key Protect 中存储了 role id
和 secret id
,那么可以选择包含工具卡中的这些私钥的 Key Protect 实例,如图 2 所示。 完成此操作后,您可以单击 HashiCorp 保险库文件工具卡中 角色标识 和 私钥标识 字段上的密钥图标,并使用选取器将私钥应用于这些字段。
同样,工具链中使用的任何其他私钥都具有附加到文本字段的键图标。 您可以使用同一选取器控件将 HashiCorp 保险库文件私钥应用于所有其余实例。
从 IBM Cloud Secrets Manager
使用 get_env
命令安全访问秘密。 这种方法在检索秘密时不会在日志中暴露秘密。
支持的秘密类型
目前,我们支持从 Secrets Manager 中的环境属性获取以下类型的秘密:
-
任意
-
IAM 凭证
-
密钥值
用法:
export SECRET_VALUE=$(get_env "secret_key" "")
在此示例中:
-
secret_key
是用于存储秘密的名称。 -
SECRET_VALUE
保存检索到的秘密值,供以后使用。
根据秘密类型,get_env 会检索特定值:
检索任意秘密
{
"name": "my-secret",
"secret_type": "arbitrary",
...
"payload": "The quick brown fox jumped over the lazy dog."
}
如果 get_env
与 my-secret
一起使用,则会检索 payload
的值。
读取 iam_credentials 密钥
{
"name": "my-iam-credentials",
"secret_type": "iam_credentials",
...
"api_key": "RmnPBn6n1dzoo0v3kyznKEpg0WzdTpW9lW7FtKa017_u",
"api_key_id": "ApiKey-dcd0b857-b590-4507-8c64-ae89a23e8d76",
"service_id": "ServiceId-bb4ccc31-bd31-493a-bb58-52ec399800be"
}
如果 get_env
与 my-iam-credentials
一起使用,则会检索到 api_key
。
检索键值秘密
{
"name": "my-kv-secret",
"secret_type": "key-value",
...
"data": "{\"key\":\"value\"}"
}
如果 get_env
与 my-kv-secret
一起使用,则会检索键值对中的 value