在开源代码库中获取Travis CI中的安全凭证是否安全?

时间:2017-07-11 14:03:10

标签: travis-ci

我的开源应用程序使用AWS的参数存储功能来保存应用程序机密的安全副本(数据库密码等)。当我的应用程序部署到EC2时,脚本会获取这些机密并使它们可用于代码,我也在本地运行相同的脚本。

我的一些测试需要运行数据库访问,因此我需要我的Travis构建脚本才能访问。

在我的(公共)Travis版本上运行该脚本是否安全?据我所知,特拉维斯并没有在任何地方暴露构建文物(除了GitHub上的内容,它没有我的秘密)。我知道我可以加密我的.travis.yml文件中的配置项,但理想情况下,这个数据存在的地方就是一个地方,然后我可以旋转配置密钥,而无需在多个位置更新它们。

我能做到安全/更好的方式吗?

2 个答案:

答案 0 :(得分:1)

不是。

如果你接受拉取请求,那么创建一个转储请求就可以很容易地将转储公开转储到Travis控制台。由于对于哪些PR可以修改,编辑等没有任何限制,无论密钥在哪里,都可以轻松修改代码和代码。打印它们。

Travis建立它secure environment variables以防止此类攻击,即不将变量暴露给PR。这意味着需要安全环境变量的测试无法使用加密变量运行,但这是必须做出的权衡。

答案 1 :(得分:0)

正如StephenG所提到的,公开秘密很简单,因为它只是CI系统试图掩盖的环境变量。

带有Bash的示例:

$ SECRET=mysecret
$ rev <<< $SECRET
tercesym

由于秘密现在已经是与TravisCI,Jenkins完美匹配的字符串了,因此GitHub Actions将不再能够掩盖您的秘密并将其显示在控制台上。还有其他方法,例如将机密上传到外部服务器等。例如,一个人可能只做env >> debug.log,如果该debug.log文件被存档,那么秘密将在该文件中。

与其连接到真正的后端(对于CI管道而言也不是一个好主意),我更建议您使用服务容器。

我们不使用TravisCI,所以我对Travis不太了解,但是使用Kubernetes和GitHub Actions上的Jenkins,您可以添加一个与测试并行运行的服务容器。

例如,如果您的集成测试需要对mysql或PSQL的数据库访问权限,则只需为其运行容器。对于dynamoDB,Amazon提供了一个容器实现,其明确目的是根据DynamoDB API测试您的代码。如果您需要更多AWS服务,则LocalStack提供虚假的AWS核心服务,例如S3。

现在,如果您实际上需要将数据写入AWS中的数据库...,您可能应该将该数据作为构建工件公开,并触发一个通知事件,以便您这一边的自定义后端可以在触发器上获取数据。例如,类似一个小的Lambda函数。