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:

  1. GPG 私钥文件

    • 类型:Secret file
    • 文件:上传 gpg-secret.key
    • ID:gpg-secret
    • 描述:GPG Secret Key
      git secret jenkins secret key
  2. GPG 信任信息文件

    • 类型:Secret file
    • 文件:上传 gpg-ownertrust.txt
    • ID:gpg-ownertrust
    • 描述:GPG Owner Trust
      git secret jenkins owner trust
  3. GPG 口令

    • 类型:Secret text
    • 内容:你设置的 GPG 口令
    • ID:gpg-passphrase
    • 描述:GPG Passphrase
      git secret jenkins 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 的环境配置面板注入凭证:

git secret jenkins job

然后在 Shell 脚本中导入 GPG 并执行 Git Secrets 命令:

git secret jenkins job shell scripts

最终输出结果一致:

+ git secret cat dbpassword.txt
Password123
Finished: SUCCESS

4. 小结

本文介绍了如何在 Jenkins Pipeline 和 Job 中使用 Git Secrets 来安全地管理敏感信息。这种方式结合了 Git 的版本控制和 GPG 加密,是一种轻量级、易维护的敏感信息管理方案。

但也要注意,Git Secrets 并非万能。如果你的项目对安全性要求较高,建议使用更专业的密钥管理工具,如 Hashicorp Vault

优点

  • 与 Git 集成紧密
  • 支持多用户加密
  • 易于版本控制

缺点

  • 依赖 GPG 密钥管理
  • 不适合大规模密钥管理

如你项目规模较小、团队协作简单,Git Secrets 是一个非常实用的选择。


原始标题:How to Inject Git Secrets in Jenkins