本文介绍了在 GitLab CI/CD 中管理密钥的常见痛点:环境变量式存储难以集中管理、权限粒度粗、缺少自动轮换和审计,且一旦 CI 系统被攻破会放大风险。

GitLab CI/CD 为自动化软件交付 Pipeline 提供了强大的平台,但要在其中安全地管理 secrets,需要在安全性、自动化和开发者体验之间取得平衡。在本指南中,我们将探讨在 GitLab CI/CD 中管理 secrets 的最佳实践,并回顾与 Infisical 的集成模式,以帮助你构建安全且高效的 CI/CD Pipeline。
CI 系统通常依赖变量来执行任务,无论是为了控制任务和 pipelines 的行为、存储常用值,还是为了避免在声明指令的文件中硬编码这些值;在 GitLab CI 中,这个文件就是 .gitlab-ci.yml。
然而,对于像 secrets 这样的敏感变量,CI 系统通过环境变量存储和暴露这些值的内置机制既不安全,也不实用。你应该尽快将其替换为适当的 secrets 管理方案,以防止随着业务或团队增长而出现问题。
很明显,为什么 CI 系统并不是为存储 secrets 而设计的:
当今的云系统需要一种更好的方式来处理 secrets。下面我们来看看如何使用 Infisical 实现这些理念。它是一款为现代 CI/CD 工作流构建的新型 secrets 管理工具。
长期以来,secrets 管理领域一直由 HashiCorp Vault 主导,但自从 HashiCorp 在 2023 年将 Vault 从 MPL 切换到 BSL 许可证以来,许多团队一直在寻找替代方案。Infisical 已成为开发者的自然选择,它提供了几个关键优势:
Infisical 提供了几个强大的功能,使其特别适合 GitLab CI/CD 环境:
${SECRET_NAME} 等语法在其他 secrets 中复用 secrets下面我们将逐步了解如何将 Infisical 与 GitLab CI/CD 集成。我们将探讨两种主要的集成模式:
标准集成会自动将 secrets 从 Infisical 同步到 GitLab CI/CD 变量,这使你只需进行少量配置即可快速开始:

配置完成后,Infisical 将自动在你的 GitLab 项目中创建 CI/CD 变量,在 GitLab 中为变量名添加前缀/后缀,并同步 secrets。这样一来,secrets 就可以像普通环境变量一样在你的 CI/CD pipelines 中使用:

虽然这种方法提供了简单的入门体验,但它仍然会将 secrets 存储在 GitLab CI/CD 中。为了进一步增强安全性,我们来看看一种更高级的集成模式。
为了实现最高级别的安全性,我们可以直接在 pipeline 中使用 Infisical CLI,并通过 OpenID Connect(OIDC)进行身份验证。这样就完全无需在 GitLab CI/CD 中存储 secrets。
首先,我们需要配置 GitLab 和 Infisical 之间的 OIDC 身份验证:


了解更多:
现在,我们可以 删除 GitLab CI/CD 变量中已同步的 secrets,并配置 pipeline 以使用带有 OIDC 身份验证的 Infisical CLI:
image: python:3.13
stages:
- test
before_script:
- apt update && apt install -y curl
- curl -LsSf https://astral.sh/uv/install.sh | sh
- curl -1sLf 'https://dl.cloudsmith.io/public/infisical/infisical-cli/setup.deb.sh' | bash
- apt-get update && apt-get install -y infisical
- pip install uv
test:
id_tokens:
INFISICAL_ID_TOKEN:
aud: https://infisical.example.com
script:
- export INFISICAL_TOKEN=$(infisical login --method=oidc-auth --machine-identity-id=<your-machine-identity-id> --oidc-jwt=$INFISICAL_ID_TOKEN --silent --plain)
- infisical run --projectId=<your-project-id> --env=dev -- uv run -- pytest
这个 pipeline:
infisical run 将 secrets 作为环境变量注入到后续命令 uv run -- pytest 中。这意味着 secrets 是动态注入的,完全不会存储在 GitLab CI 中!这种方法带来了几个显著的安全优势:
在进行基础设施配置时,Infisical 与 Terraform 无缝集成,以管理云凭据和其他敏感基础设施数据。Terraform 1.10 引入了一个名为 “ephemeral resources” 的强大新功能,完美补充了 GitLab CI/CD 的安全实践。
Ephemeral resources 是临时资源,不会持久保存在 Terraform state 或 plan 文件中——它们仅在执行期间存在,因此非常适合处理 secrets。Infisical Terraform provider 支持此功能,使你能够在基础设施配置期间安全地访问 secrets,而无需将其存储在 state 文件中。
有关 Terraform ephemeral resources 的详细说明以及如何将其与 Infisical 配合使用,请查看我们的深入指南:关于 Terraform Ephemeral Resources 你需要知道的一切
对于基于 GitOps 的持续部署工作流,Infisical 提供了多种与 Kubernetes 的集成选项,以确保安全且高效的 secrets 管理。当使用 GitLab CI/CD 将应用部署到 Kubernetes 时,你可以利用这些方法在增强安全性的同时保持 GitOps 原则。
Infisical 为 Kubernetes 提供了三种主要的集成方法:
每种方法在声明式配置、安全性和运维复杂性之间都有不同的权衡。有关使用 Kubernetes 实施安全 GitOps 工作流的完整指南,请参阅我们的详细文章:安全的 GitOps 工作流:Secrets 管理实用指南
为什么这很重要: 安全漏洞通常会因权限过大而扩大。最小权限访问可以最小化你的攻击面,并限制潜在安全事件的影响。
关键考虑因素:
为什么这很重要: 静态 secrets 会随着时间推移因暴露和凭据共享而变得脆弱。定期轮换可以降低潜在泄露带来的影响。
关键考虑因素:
- 原文链接: infisical.com/blog/gitla...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!
作者暂未设置收款二维码