开发者仍然把 API 令牌、密码和凭据直接写进代码或 .env 文件并推送到 Git。个人小项目和生产系统里都很常见。

原因很简单:如果没有可靠的方式把密钥交给自动化和部署流程,Git 就像唯一稳妥的选择。「以后再清理。」但 Git 里几乎没有什么是真正消失的。

为什么 Git 不适合存放密钥

Git 是版本控制系统。凡是提交过的内容都会进入历史。你可以从最新提交里删掉令牌——更早的提交里仍然有。历史会复制到各处:本地仓库、自动化代理、镜像、分叉。密钥一旦进入提交,就应视为已暴露。

仓库访问权限往往比实际需要的更宽。外部承包商、临时贡献者、测试分叉——都可能看到不该看到的凭据。

GitHub 和 GitLab 会主动扫描凭据。若平台标记了某令牌,请视为已泄露并立即吊销。

什么应该替代 Git

密钥不是静态文件。它是需要放在代码之外、具备可控权限、支持轮换并按环境隔离的访问凭据。

你可以自建 Vault 或 OpenBao——但那意味着基础设施、维护和运维负担。

Semaphore 内置 Key Store,直接融入自动化工作流。密钥可以放在两个位置之一:

  • Semaphore 的加密数据库(默认)
  • 外部存储,如 HashiCorp Vault、Devolutions 或 OpenBao(PRO 功能)

选择简单的内置方案,或对接企业现有的密钥系统。开箱即用。

Key Store 存什么

  • API 令牌
  • SSH 密钥
  • 密码
  • 环境变量
  • JSON 及其他配置文件

密钥不会进入代码库,只在作业运行时注入。你可以为开发、预发布和生产分别定义凭据,并按用户、团队或工作流限制范围。

实际怎么用

创建 Key Store,添加密钥,在工作流配置中引用。Semaphore 在运行时注入值。

例如在 AWS 部署中,访问密钥只在该作业运行期间存在,且只存在于执行该作业的 agent 上。开发人员看不到密钥,也不会经过 Git。

示例

通过界面创建 Secret:Secrets → New Secret,然后添加变量:

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY

在工作流中按名称引用该 Secret——Semaphore 会在运行时将其作为环境变量注入:

blocks:
  - name: Deploy
    task:
      secrets:
        - name: aws-credentials
      jobs:
        - name: deploy
          commands:
            - aws s3 sync ./dist s3://my-bucket

若使用 SSH,创建包含私钥文件的 Secret。Semaphore 会自动放到 ~/.ssh/

blocks:
  - name: Deploy via SSH
    task:
      secrets:
        - name: production-ssh-key
      jobs:
        - name: deploy
          commands:
            - ssh deploy@production-server "cd /app && git pull"

Key Store 与其他方式

方式 安全 可见范围 可吊销
Git 中的 .env 整个团队
GitHub Actions Secrets 视情况 视配置
Semaphore Key Store 受限

此外:无需改代码即可轮换令牌;按角色或团队控制访问;不同环境使用不同密钥。

结论

任何提交到 Git 的令牌都应视为已泄露。历史会在贡献者、分叉、镜像和自动化代理之间传播——每多一份拷贝就多一个暴露面。

Key Store 让密钥留在仓库之外,仅在运行时注入,并让你掌控轮换与访问。对使用 Ansible、Terraform、OpenTofu 或 PowerShell 自动化的团队来说,这不是可有可无的附加设施,而是安全基础。

Twitter

方案一

密钥在 Git 里 = 密钥已暴露。永久如此。

Git 历史会在分叉、镜像和 CI 代理之间复制。一次提交的令牌会在很长时间里处于泄露状态。

我们写了为什么会一再发生,以及 Semaphore Key Store 如何解决。

方案二

Semaphore Key Store 如何处理密钥:

→ 在仓库外保存令牌、SSH 密钥、环境变量

→ 在作业配置中用 {{ your_secret }} 引用

→ 仅在运行时、在该 agent 上、只针对该作业注入

开发人员看不到。不经过 Git。
全文 → [链接]

LinkedIn

我们刚发布了一篇详解:Semaphore Key Store 如何工作,以及它为什么存在。

简而言之:密钥不属于 Git。永远不该。但没有合适的替代方案时,开发者还是会往里放。

Key Store 直接接入 Semaphore 的自动化工作流。实际流程是:

  1. 在界面创建 Key Store
  2. 添加密钥——API 令牌、SSH 密钥、环境变量、配置文件
  3. 在作业配置中用 {{ your_secret }} 引用
  4. Semaphore 在运行时、在该 agent 上、仅针对该作业注入

开发者看不到密钥。不进入仓库。作业结束后即从执行环境消失。

可按用户、团队或环境限制访问。不改一行代码即可轮换令牌。为开发、预发布和生产使用不同凭据。

对使用 Ansible、Terraform 或 OpenTofu 的团队——这是从「能跑」到「真的安全」之间缺失的一环。

全文 →

You might also like