保护您数据最佳实践
Travis CI 为保护您的数据采取的步骤 #
Travis CI 会模糊 UI 中显示的安全环境变量和令牌。我们的 有关加密密钥的文档 概述了我们为确保这一点所需的构建配置,但是,一旦 VM 启动并运行测试,我们就对哪些实用程序或附加组件能够打印到 VM 的标准输出控制力较小。
为了防止这些组件造成的泄漏,我们在运行时会自动过滤掉长度超过三个字符的安全环境变量和令牌,有效地将它们从构建日志中删除,并在其位置显示字符串 [secure]
。
请确保您的机密与存储库或分支名称或任何其他可猜测的字符串无关。理想情况下,使用诸如 mkpasswd
之类的密码生成工具,而不是自己选择机密。
Beta 版 Windows 支持不会模糊泄漏到构建日志中的安全环境变量。请继续阅读下一节,了解如何避免将机密泄露到构建日志
日志扫描 #
Travis CI 还启用了强制性的构建后日志扫描,以尝试查找任何其他潜在的机密泄漏。这些扫描是在构建作业完成后不久对原始作业日志文件执行的。扫描使用 Trivy 和 detect-secrets 执行,这些是开源扫描程序,由其维护者通过宽松的 OSS 许可方式提供。如果扫描过程在作业日志中找到未掩盖的类似机密的条目,Travis CI 作为预防措施,将在作业日志中使用星号 (*
) 掩盖整行,并生成日志扫描报告,供存储库管理员查看 7 天。
作业日志扫描报告包含有关找到的潜在机密的信息,引用 **原始** 作业日志文件中的行号,旨在帮助审核并找到可能泄漏的来源,如果这被证明是机密的实际公开,则扫描将修复该问题。
当额外的构建后扫描过程在构建作业日志中发现潜在的泄漏时,Travis CI Web UI 中的图形状态将显示日志扫描结果。日志扫描:失败 将在存储库页面和仪表板中显示,持续 7 天,或者直到至少一名存储库管理员访问作业日志扫描报告页面,以先发生者为准。
由于作业日志扫描是由寻找类似机密的条目工具执行的,因此必须将通知视为有关 **潜在** 问题的警告,并由存储库管理员验证。因此,我们建议执行以下验证步骤
- 审查存储库
.travis.yml
文件中的确切构建说明(尤其是如果使用任何未加密的机密)以及从.travis.yml
脚本中调用的构建脚本。 - 重新运行可疑作业,并实时查看构建作业日志。尤其是在预先屏蔽的区域附近(请注意,这将重新触发作业日志扫描以及过程中的任何潜在通知)。
请注意:由于扫描程序的性质(寻找类似机密的模式),扫描结果可能会产生误报和/或遗漏某些项目。这是一个持续的工作,我们希望它能够随着时间的推移根据发现和反馈得到改进。此外,我们密切关注作业日志扫描过程发出的警告数量,并将在以后决定是否在现有的视觉指示器之上启用相应的电子邮件通知。
有关如何避免将机密泄露到构建日志的建议 #
尽管我们尽了最大努力,但仍然有许多方法会导致意外暴露安全信息。这些方法因您使用的工具和启用的设置而异。需要注意的一些事项包括
- 将命令复制到标准输出的设置,例如 bash 脚本中的
set -x
或set -v
- 通过运行
env
或printenv
显示环境变量 - 在代码中打印机密,例如
echo "$SECRET_KEY"
- 使用在错误输出上打印机密的工具,例如
php -i
- 诸如
git fetch
或git push
之类的 git 命令可能会暴露令牌或其他安全环境变量 - 字符串转义错误
- 提高命令详细程度的设置
- 可能在操作时暴露机密的测试工具或插件
阻止命令显示任何输出是避免意外显示任何安全信息的一种方法。如果有特定命令使用安全信息,您可以将其输出重定向到 /dev/null
,以确保它不会意外发布任何内容,如下例所示
在使用 Travis CI 时,您可能需要考虑其他方法来降低在构建作业日志中暴露机密的风险
始终使用加密的机密 #
Travis CI 提供了两种选择:使用 Travis-CLI(命令行界面工具) 加密您的机密,或者在 Travis CI 存储库设置 中定义机密。
如果机密存储在源代码存储库中的加密文件中,您也可以 使用机密加密文件,并在构建作业期间使用它。在构建作业环境中解密文件所需的最短时间内解密文件,并在不再需要这些文件后立即从构建作业环境中删除任何临时环境变量。
请注意,在某些情况下,必须解密机密才能在构建作业环境中使用。因此,调试输出到标准输出可能仍会导致机密暴露。额外的构建后日志扫描过程旨在尽可能找到这些内容。
使用 Hashicorp Vault KMS 集成 #
如果您使用 Hashicorp Vault KMS(密钥管理系统)管理您的机密,那么您可以使用现有的 Travis CI - Hashicorp 集成 直接将机密获取到构建作业中。
同样,请注意构建作业环境中可能出现的任何调试输出到标准输出。额外的构建后日志扫描过程旨在尽可能找到这些内容。从您管理的 KMS 获取机密的优势在于能够在发生任何事件时从单个机密存储库中轮换机密。我们强烈建议使用仅限于特定 CI/CD 相关机密的 Hashicorp Vault 凭据,以限制 KMS 的威胁范围。
限制对作业日志的访问 #
审查谁应该访问构建作业日志以及为什么应该访问构建作业日志,并在 Travis CI 存储库设置 中设置适当的选项。
审查从分叉的 Git 存储库触发的构建的设置 #
审查 Travis CI 存储库设置 并调整与分叉存储库共享的内容。这适用于分叉存储库可以向基本存储库提交拉取请求的协作模式,从而触发 CI/CD 构建作业,作为拉取请求验证和批准流程的一部分自动进行构建和测试。评估风险并根据您的场景调整设置。
在私有仓库中运行需要机密的构建 #
如果可行,考虑将需要使用机密的构建运行为私有仓库的 CI/CD,并仔细审查协作者列表。结合上述选项,可以降低构建作业日志中机密信息泄露的风险。
如果您认为可能泄露了安全信息 #
第一步,可以通过点击 Travis CI 构建日志页面上的“删除日志”按钮来删除包含任何安全信息的日志。
如果您在构建日志中发现泄露,您需要撤销泄露的令牌或环境变量,并更新导致泄露的任何构建脚本或命令。
删除日志的替代方法 #
除了手动删除构建日志外,您还可以使用 Travis CI CLI 或 API 来删除日志。
定期轮换令牌和机密 #
定期轮换您的令牌和机密。GitHub OAuth 令牌可以在 GitHub 网站上的 开发者设置 中找到。请定期轮换其他第三方服务的凭据。
更多信息 #
本文档中的建议反映了 Travis CI 团队和社区鼓励每个人遵循的一般建议。但是,这里的建议并不详尽,您应该使用您的最佳判断来确定项目的安全性流程。如果您有任何关于 Travis CI 安全性的问题,或者怀疑您可能发现了漏洞,请通过 security@travis-ci.com 与我们联系。
关于 Travis CI 的所有其他问题,请联系 support@travis-ci.com。