开发者仍然把 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_IDAWS_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 自动化的团队来说,这不是可有可无的附加设施,而是安全基础。
方案一
密钥在 Git 里 = 密钥已暴露。永久如此。
Git 历史会在分叉、镜像和 CI 代理之间复制。一次提交的令牌会在很长时间里处于泄露状态。
我们写了为什么会一再发生,以及 Semaphore Key Store 如何解决。
方案二
Semaphore Key Store 如何处理密钥:
→ 在仓库外保存令牌、SSH 密钥、环境变量
→ 在作业配置中用 {{ your_secret }} 引用
→ 仅在运行时、在该 agent 上、只针对该作业注入
开发人员看不到。不经过 Git。
全文 → [链接]
我们刚发布了一篇详解:Semaphore Key Store 如何工作,以及它为什么存在。
简而言之:密钥不属于 Git。永远不该。但没有合适的替代方案时,开发者还是会往里放。
Key Store 直接接入 Semaphore 的自动化工作流。实际流程是:
- 在界面创建 Key Store
- 添加密钥——API 令牌、SSH 密钥、环境变量、配置文件
- 在作业配置中用
{{ your_secret }}引用 - Semaphore 在运行时、在该 agent 上、仅针对该作业注入
开发者看不到密钥。不进入仓库。作业结束后即从执行环境消失。
可按用户、团队或环境限制访问。不改一行代码即可轮换令牌。为开发、预发布和生产使用不同凭据。
对使用 Ansible、Terraform 或 OpenTofu 的团队——这是从「能跑」到「真的安全」之间缺失的一环。
全文 →
