java - Java 代码如何在 Jenkins 构建期间读取 Jenkins Global 凭据?
问题描述
我有一个基于 Jenkins 的 Java 项目。此代码需要一个 Secret 文件(.pem 格式)才能运行。我无法将文件保存在 Java 项目本身中(出于安全原因)。
文件格式为key_v2-XXXXX.pem,内容为
-----BEGIN PRIVATE KEY-----
XXX
XXXX
-----END PRIVATE KEY-----
目前,Java 代码正在访问 Local 中存在的 Secret 文件。所以本地构建很好。但是在 Jenkins 上执行此代码时,构建失败,因为它找不到本地文件或 Jenkins 无法访问该文件。
我已在 Jenkins中将Secret File添加为全局凭据(不受限制)。(参考 - https://jenkins.io/doc/book/using/using-credentials/)
我需要找到一种方法让Java 代码在运行 Jenkins 构建时访问这个 Secret 文件(存储在 Jenkins 中)。
或者有没有其他方法可以处理这种情况?
解决方案
有很多方法可以做到这一点。
其中最简单的是使用 Jenkins Credentials Plugin(可以定义密钥或文件等)https://wiki.jenkins-ci.org/display/JENKINS/Credentials+Plugin
使用的相当常见的模式:
1) 使用 CI/CD 工具加密功能(即 Jenkins,使用 Jenkins Credentials Plugin)
2)将您的秘密存储在 SCM 中(显然已加密)。然后问题就变成了在构建时安全地交付秘密(或在启动时提供),以便能够解密已部署的秘密(密码、凭据、秘密、证书)。这就是秘密管理工具(如保险库)的用武之地。秘密管理工具将允许您安全地检索您的秘密,以便在需要时用于解密秘密。
3) 另一种方法是将 SCM 之外的所有机密、证书等实际存储在机密管理工具本身中,并在部署/启动时检索它们。
我会说使用方法 2。在这种情况下,您的代码每次都以相同的方式(相同的文件路径等)访问文件。当涉及到构建时,您尝试解密的实际文件位于工作目录中的某个位置。因此,只要代码知道在哪里查找机密文件等,让您的 Java 代码访问它应该不是问题。然后使用 Credentials 插件 Secret 来解密文件作为构建的初始步骤。
推荐阅读
- python - 在 Ansible 中访问嵌套变量
- kotlin - 我可以以编程方式设置任何类型的属性吗?
- python - 如何使用 YAML 配置在 Dask 中设置记录器
- reactjs - 快照和 prevState 有什么不同,来自 componentDidUpdate 的 prevProps 反应?
- javascript - 如何使用 NodeJS 更新子文档猫鼬
- api - 如何使用 twitter API 从多个用户获取包含特定关键字的推文
- java - 如何在运行时将 Java 应用程序与控制台分离
- codeigniter - 如何在codeigniter中使用重定向显示验证错误?
- android - Firebase Crashlytics 仅识别第一个添加的应用
- python - 来自函数对象的静态方法。为什么我不需要静态方法呢?