将环境变量注入构建过程

安全地将环境变量注入构建过程

将环境变量注入构建过程是一种 standard 现代实践 CI/CD pipeline团队会将环境变量注入构建过程,以便在不硬编码值的情况下将密钥、令牌和运行时配置传递到构建中。表面上看,这似乎是一种简单安全的模式。

然而,在实践中,它往往成为软件供应链中最被低估的风险之一。

因为一旦团队将环境变量注入到构建过程中,这些值就不再是隔离的了。所有在该过程中运行的程序都可以访问它们。 pipeline构建脚本、CLI 工具、第三方操作,甚至依赖项都可以读取它们。

事情就是从这里开始出错的。

本指南将详细介绍团队如何在实际构建过程中注入环境变量。 pipelines,泄漏实际发生在哪里,以及如何在不减慢开发速度的情况下保护构建过程。

将环境变量注入构建过程意味着什么

从本质上讲,注入环境变量意味着将值传递给一个 pipeline 在运行时,以便作业在执行期间可以访问它们。 

实际上,大多数团队会在构建过程中的不同阶段多次注入环境变量,但往往无法完全了解这些值的使用方式。

这些值通常包括 API 密钥、数据库凭据、令牌或特定于环境的配置。它们并非直接存储在代码中,而是存储在云端。 CI/CD 系统会在构建开始时动态加载它们。

这解决了一个实际问题。它保持代码简洁,避免重复,并允许相同的操作。 pipeline 可在预发布环境、测试环境和生产环境中运行。

然而,这种模型依赖于一个不再成立的假设:构建环境是可控的、可预测的。

现代 pipeline它们既非配置也非依赖。它们包含多个步骤、外部集成和依赖项,能够动态执行代码。因此,一旦变量被注入,它就不再仅仅是配置,而是成为执行上下文的一部分。

构建过程中环境变量泄漏的位置

大多数泄密事件并非因为有人明确泄露秘密而发生,而是因为…… pipelines 的行为方式是开发者无法完全预料到的。

每次团队将环境变量注入构建过程时,都会增加可能访问敏感数据的组件数量。

例如,开发人员可能会启用详细日志记录来调试构建失败的问题。命令行工具可能会在其输出中打印环境变量。依赖项可能会在执行过程中静默访问进程变量。

这些行为单独来看都不算可疑。然而,它们结合起来却会形成多条泄密途径。

秘密最终可能会落入以下境地:

  • 构建日志将被存储和索引
  • 团队间共享调试输出
  • 运行外部代码的第三方 CI 操作
  • 安装或运行时执行的依赖项
  • 构建过程中生成的临时工件

一旦秘密信息出现在日志中,它就很难被完全控制。日志会被复制、存储并跨多个系统保留。此时,泄露的范围远远超出了最初的范围。 pipeline.

这就是为什么环境变量泄漏常常在造成损害之后才被发现的原因。

为什么团队会在构建过程中注入环境变量

尽管存在这些风险,团队仍然大量依赖环境变量注入。这并非没有道理。

它使 pipeline保持灵活性。单一工作流程可以适应不同的环境,针对多个服务进行身份验证,并在不修改代码的情况下动态改变行为。

在快速发展的DevOps环境中,这种灵活性至关重要。然而,灵活性总是伴随着权衡取舍。越是动态变化的…… pipeline 规模越大,就越难控制其内部发生的情况。每增加一个步骤、集成或依赖项,敏感数据可能被访问的地方就越多。

因此,环境变量注入从配置细节转变为安全问题。

将环境变量注入构建过程时常见的风险

这些风险并非理论上的,而是真实存在的。 pipeline每天都是如此。

秘密泄露到日志中

日志是其中之一 最常见的暴露来源调试标志、CLI 工具和堆栈跟踪经常会在开发人员不注意的情况下泄露敏感值。

一旦暴露出来,这些数值就会迅速在系统中传播。

过度宽松的访问权限

更多来自Google的 pipeline这会将所有变量暴露给所有作业,从而造成不必要的风险。

如果其中一步遭到破坏,它就能获取它实际上并不需要的凭据。

依赖和行为滥用

现代 pipeline严重依赖第三方工具和集成。这些组件与您的密钥运行在相同的环境中。

如果其中一个程序运行异常,它可以悄无声息地访问注入的变量。

根据 OWASP供应链攻击经常利用构建过程中的可信组件。环境变量往往成为最容易攻击的目标。

这种风险并非理论上的。 最近发生的事件例如 axios npm 漏洞利用事件,展示了攻击者如何滥用受信任的依赖项来访问运行时密钥。 pipeline 数据。
 

代码中的备用密钥

当构建因缺少变量而失败时,团队有时会添加备用值以保留 pipeline正在运行。

随着时间的推移,这些值会变得 commit已部署或已实施,造成长期影响。

将环境变量安全地注入构建过程的最佳实践

确保团队在构建过程中注入环境变量的方式并非要限制灵活性,而是要控制这些值在执行过程中如何被暴露。
 
类别 最佳实践 为什么重要
秘密存储 使用密钥库或 CI 密钥管理器 防止代码泄露
访问控制 每个作业限制访问权限 减少攻击面
记录 掩蔽敏感值 防止泄漏
范围和寿命 使用短期凭证 限制爆炸半径
验证 如果缺少变量,则构建失败 避免不安全的备用方案

为什么有很多 CI/CD 安全工具遗漏环境变量泄漏

大多数安全工具都侧重于在构建完成后扫描代码或依赖项。

然而,环境变量泄漏发生在执行过程中。

A pipeline 即使能够正确注入密钥,仍然可以通过日志或运行时行为将其暴露出来。等到扫描器检测到问题时,密钥可能已经泄露。

这就造成了检测和预防之间的差距。

团队需要一些控制措施,以便在以下情况下发挥作用: pipeline 运行,而不是结束后。

当团队在多个作业和第三方步骤中向构建过程注入环境变量,而没有运行时控制时,这一点就显得尤为重要。

我们如何建议保护环境变量注入

实际上,有效的保护归根结底取决于几个始终如一的原则。

将秘密存放在外面 pipeline仅在运行时注入。将访问权限限制在所需的最小范围内。尽可能使用短期凭据。

同时,监测如何 pipeline访问敏感数据。异常的访问模式通常预示着风险,甚至在泄漏显现之前就已出现。

这种方法将安全防护从被动检测转变为主动控制。

Xygeni如何帮助保护 CI/CD 秘密注射

Xygeni 关注的是团队将环境变量注入构建过程,以及秘密信息实际暴露的环节: 里面的 pipeline在执行过程中。

Xygeni 不只是依赖于构建后的扫描,而是分析了以下情况: pipeline程序在运行时会使用环境变量。这包括密钥如何在作业之间传递、构建步骤如何访问它们,以及依赖项如何与执行环境交互。

例如,Xygeni 可以检测到何时 pipeline 过度暴露变量,导致某个步骤有可能将敏感值打印到日志中,或者某个依赖项试图意外地访问凭据。

在同一时间, guardrails 直接执行政策 pipeline团队可以阻止不安全的构建,限制对特定作业的秘密访问,并在风险配置进入生产环境之前阻止它们。

因为这种情况发生在 CI/CD 工作流程中,开发人员无需改变他们的工作方式。安全性成为工作流程的一部分。 pipeline不是一个单独的步骤。

因此,团队可以了解密钥的使用方式,控制密钥的泄露方式,并在不减慢交付速度的情况下降低泄露风险。

总结

将环境变量注入构建过程对于现代应用至关重要。 CI/CD 工作流程。然而,如果没有适当的控制措施,这种做法可能会在执行的多个阶段暴露机密信息。

然而,这也引入了一层常常被忽视的风险。

问题不在于是否使用环境变量,而在于如何在执行过程中控制它们的暴露。

在现代 DevOps 环境中,在构建过程中防止泄漏远比事后检测泄漏重要得多。

sca-tools-软件-成分分析工具
确定软件风险的优先级、进行补救并加以保护
注册免费账号。
不需要信用卡。

保护您的软件开发和交付

使用 Xygeni 产品套件