1. 简介
Jenkins 是自动化构建与交付流程的利器,尤其在使用 git 进行版本控制时。然而,使用 Jenkins 时一个常见的痛点是如何安全地处理敏感数据,如密码或 Token。
本文将介绍如何在 Jenkins Pipeline 和 Job 中安全地注入 Git Secrets,从而实现敏感信息的安全管理。
2. Git Secrets 概述
我们先从 Git Secrets 的生成开始,了解其基本使用方式。
2.1. 生成 GPG 密钥
Git Secrets 依赖于 GPG 加密机制,因此我们需要先生成一对 GPG 密钥:
$ gpg --gen-key
该命令会提示输入姓名、邮箱和一个私钥口令(Passphrase)。请务必记住这个口令,后续 Jenkins 配置中会用到。
执行完成后,会在用户主目录下生成公钥和私钥对,为后续生成 Secret 做准备。
2.2. 初始化 Git Secrets
git-secret 是一个 Git 插件,允许我们在 Git 仓库中安全地存储敏感信息。它结合了 Git 的版本控制与访问控制能力,是一个非常实用的工具。
安装完成后,在任意 Git 仓库中执行以下命令初始化:
$ git secret init
这会创建一个 .gitsecret
目录,类似于 git init
的作用。
建议将 .gitsecret
目录中的文件全部提交到版本控制中,除了 random_seed
文件。一般初始化时会自动配置好 .gitignore
,但仍建议手动确认。
接下来,将用户添加到 git secret 的密钥环中:
$ git secret tell [email protected]
现在,我们就可以开始在仓库中添加加密文件了。
2.3. 存储与读取 Secret
Git Secrets 的原理是将指定文件加密,并添加 .secret
后缀,同时将原始文件加入 .gitignore
以防止误提交。
举个例子,我们想把数据库密码写入 dbpassword.txt
:
$ echo "Password123" > dbpassword.txt
然后将其加入 Git Secret 管理:
$ git secret add dbpassword.txt
最后执行加密操作:
$ git secret hide
此时提交代码即可:
$ git add .
$ git commit -m "Add encrypted DB password"
$ git push
本地仍然保留明文文件,但已被 .gitignore
忽略,不会被提交。
如果其他人拉取代码,只能看到加密后的文件:
$ ls
dbpassword.txt.secret
该文件是加密的,无法直接查看。如需读取,需使用如下命令:
$ git secret reveal -p <PASSPHRASE>
$ git secret cat dbpassword.txt
其中 <PASSPHRASE>
是你生成 GPG 密钥时设置的口令。
3. 在 Jenkins 中使用 Git Secrets
掌握了 Git Secrets 的基本使用后,我们来看如何在 Jenkins 中安全使用这些加密信息。
3.1. 配置 Jenkins Credentials
首先,我们需要导出之前生成的 GPG 私钥和信任信息:
$ gpg -a --export-secret-keys [email protected] > gpg-secret.key
$ gpg --export-ownertrust > gpg-ownertrust.txt
⚠️ 注意:私钥文件非常重要,请务必妥善保管,切勿上传到公开仓库。
接下来,在 Jenkins 中创建三个 Credentials:
GPG 私钥文件
- 类型:Secret file
- 文件:上传
gpg-secret.key
- ID:
gpg-secret
- 描述:GPG Secret Key
GPG 信任信息文件
- 类型:Secret file
- 文件:上传
gpg-ownertrust.txt
- ID:
gpg-ownertrust
- 描述:GPG Owner Trust
GPG 口令
- 类型:Secret text
- 内容:你设置的 GPG 口令
- ID:
gpg-passphrase
- 描述:GPG Passphrase
3.2. 在 Jenkins Pipeline 中使用
确保 Jenkins Agent 上已安装 git-secret
工具,否则无法使用相关命令。
Pipeline 示例:
pipeline {
agent any
environment {
gpg_secret = credentials("gpg-secret")
gpg_trust = credentials("gpg-ownertrust")
gpg_passphrase = credentials("gpg-passphrase")
}
stages {
stage("Import GPG Key") {
steps {
sh """
gpg --batch --import $gpg_secret
gpg --import-ownertrust $gpg_trust
"""
}
}
stage("Reveal Secrets") {
steps {
sh """
cd $WORKSPACE
git secret reveal -p '$gpg_passphrase'
git secret cat dbpassword.txt
"""
}
}
}
}
运行后输出如下:
+ git secret cat dbpassword.txt
Password123
✅ Jenkins 成功读取了加密的敏感信息。
3.3. 在 Jenkins Job 中使用
除了 Pipeline,传统的 Jenkins Job 也可以使用 Git Secrets。
操作步骤与 Pipeline 类似,不同点在于通过 Jenkins 的环境配置面板注入凭证:
然后在 Shell 脚本中导入 GPG 并执行 Git Secrets 命令:
最终输出结果一致:
+ git secret cat dbpassword.txt
Password123
Finished: SUCCESS
4. 小结
本文介绍了如何在 Jenkins Pipeline 和 Job 中使用 Git Secrets 来安全地管理敏感信息。这种方式结合了 Git 的版本控制和 GPG 加密,是一种轻量级、易维护的敏感信息管理方案。
但也要注意,Git Secrets 并非万能。如果你的项目对安全性要求较高,建议使用更专业的密钥管理工具,如 Hashicorp Vault。
✅ 优点:
- 与 Git 集成紧密
- 支持多用户加密
- 易于版本控制
❌ 缺点:
- 依赖 GPG 密钥管理
- 不适合大规模密钥管理
如你项目规模较小、团队协作简单,Git Secrets 是一个非常实用的选择。