一尘不染

使用公共构建服务器时如何使用秘密API密钥

jenkins

马克·墨菲(Mark Murphy)在他的博客上很好地说明应将哪些信息排除在公共存储库之外。密钥材料(例如用于各种服务的OAuth密钥或API密钥)就是一个很好的例子。

有问题的应用程序将是移动android应用程序,因此有人对其进行反编译以获取秘密密钥不在此问题范围内。

如何配置公共CI实例(例如cloudbees)上的构建作业,以使机密不泄漏到构建日志或编译目录中?我的主要目的是演示基于OAuth身份验证的应用程序的体系结构和构建过程,而无需在整个Internet上分发我的私钥。因此,需要一个公共代码存储库和一个公共可见的构建服务器。

当前,我在Java代码中使用maven过滤和占位符来创建静态常量类,但这些类在目标目录中始终可见。目标的生成后清理仍会留下一小段时间,在该时间段内,生成的Java文件对世界都是可见的。


阅读 302

收藏
2020-07-25

共1个答案

一尘不染

从您的描述看来,您似乎在谈论一个密钥,该密钥不应在SCM存储库中,而需要包含在最终应用程序中。大概应用程序二进制文件本身不能免费下载,否则无论如何都可以将其打开并获取您的密钥,但是如果仅将构建结果部署到某些服务器上就可以了。

在这种情况下,只要密钥在target目录(即Jenkins工作区)中或在构建构件(例如lastSuccessfulBuild/artifact/target/myapp.war)中存在,就没有任何问题,只要这些内容不是公共可读的即可。对于CloudBees
DEV @ cloud
Jenkins实例,您可以使用基于角色的访问控制来允许公众查看您项目的变更日志,甚至可以查看构建日志(在审核以确保未打印机密信息之后),但拒绝访问工作空间和工件。

(就工件读取权限而言,似乎将其授予具有总体读取权限的任何人,除非运行Jenkins,-Dhudson.security.ArtifactsPermission=true而托管Jenkins则不选择这样做。可能需要创建一个启用此权限的插件,并且可能类似于现有的“
扩展读取权限”插件,也具有“删除工作区”权限。工作区浏览权限至少是Jenkins的标准组成部分,如果您不归档工件而是在成功构建结束时直接进行部署,则足够了。

2020-07-25