2

Mark Murphy 在他的博客上做了一个很好的案例,什么样的信息应该被保留在公共存储库之外。密钥材料,例如各种服务的 OAuth 密钥或 API 密钥,就是一个很好的例子。

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

如何配置公共 CI 实例(例如 cloudbees)上的构建作业,以使秘密不会在构建日志或编译目录中泄露?我的主要目的是演示具有基于 OAuth 的身份验证的应用程序的架构和构建过程,而无需在整个互联网上传播我的私钥。因此,需要一个公共代码存储库和一个公开可见的构建服务器。

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

4

2 回答 2

0

从您的描述中,听起来您在谈论一个不应该在 SCM 存储库中但需要包含在最终应用程序中的密钥。据推测,应用程序二进制文件本身不能免费下载,否则无论如何都可以打开它并获取您的密钥,但如果构建结果只是被部署到某个服务器,这很好。

target在这种情况下,将密钥存在于目录(即 Jenkins 工作区)中或确实存在于构建工件(例如)中不一定有任何问题lastSuccessfulBuild/artifact/target/myapp.war,只要这些东西不是公开可读的。对于 CloudBees DEV@cloud Jenkins 实例,您可以使用基于角色的访问控制来允许公众查看您的项目的更改日志,也许还有构建日志(在审查它们以确保不打印机密之后),但拒绝访问工作区和工件。

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

于 2013-01-29T15:35:53.377 回答
0

即使您不使用公共构建服务器,这也是一个问题。

想一想:如果密钥在最终的包中,那么每个人都可以看到。无论它在构建的哪个步骤到达那里,它都是公开的。任何人都可以下载包(JAR、APK 等)、分解、反编译.class并查看密钥。做这一切很容易。

在 CloudBees 中,您可以将此类信息放入环境变量中。请参阅此链接:http: //developer.cloudbees.com/bin/view/RUN/Configuration+Parameters。我对 CloudBees 了解不多,但我认为所有公共服务器都有这种选择,将敏感信息放在不公开的地方。

于 2013-01-29T15:38:38.910 回答