【问题标题】:How can secret API keys be used while using public build servers使用公共构建服务器时如何使用秘密 API 密钥
【发布时间】:2013-01-29 14:28:49
【问题描述】:

Mark Murphy 就his blog 提出了一个很好的案例,哪些信息应该被保留在公共存储库之外。关键材料,例如各种服务的 OAuth 密钥或 API 密钥就是一个很好的例子。

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

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

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

【问题讨论】:

    标签: android maven oauth jenkins cloudbees


    【解决方案1】:

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

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

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

    【讨论】:

    • 通过反编译获取密钥与这个问题是正交的。即便如此,Extended Read Permission Plugin 的提示让我找到了Mask Passwords Plugin,它可能用于隐藏密钥的注入。
    【解决方案2】:

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

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

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

    【讨论】:

    • 对,如果您希望应用程序二进制文件省略密钥但在运行时可访问,则使用外部配置参数是最佳选择。
    猜你喜欢
    • 2019-07-27
    • 2021-04-10
    • 2019-06-24
    • 2017-09-25
    • 1970-01-01
    • 2019-06-14
    • 2019-11-29
    • 2012-03-09
    • 2018-07-04
    相关资源
    最近更新 更多