发布于 2026-01-06 2 阅读
0

使用 git-secret 加密仓库中的密钥 [教程第 6 部分]

使用 git-secret 加密仓库中的密钥 [教程第 6 部分]

如何使用 git-secret 加密密钥并将其存储在 Git 仓库中

本文最初发表于https://www.pascallandau.com/,标题为“使用 git-secret 加密仓库中的密钥 [教程第 6 部分]”。


在本系列关于使用 Docker 开发 PHP 的教程的第六部分中,我们将设置git-secret将密钥直接存储在代码仓库中。所有操作都将通过 Docker 完成,并添加为 make 目标,以实现便捷的工作流程。

git-secret 示例


供参考:本教程是下一部分“
为 Docker 化的 PHP 应用程序创建 CI 流水线”的
先导 ,因为处理密钥是设置 CI 系统(以及之后部署到生产环境)时的一个重要方面——但我认为它足够复杂,值得单独写一篇文章。

所有代码示例均可在我的GitHub Docker PHP 教程仓库中公开获取。您可以在part-6-git-secret-encrypt-repository-docker分支中找到本教程的最终结果

Docker PHP 教程的所有已发布部分都汇总在Docker PHP 教程的专属页面上。上一部分是“设置 PHP QA 工具并通过 make 进行控制”,下一部分是“为 Docker 化的 PHP 应用创建 CI 流水线”

如果您想持续关注,请订阅RSS 源通过电子邮件接收通知,以便在下一部分发布时收到自动通知:)

目录

介绍

在软件工程中,处理密钥(密码、令牌、密钥文件等)就如同给事物命名一样,是解决难题的关键所在。以下几点值得考虑:

  • 安全至关重要——但高度安全往往伴随着高度不便。
    • 如果事情变得太复杂,人们就会寻找捷径……
  • 在团队中,分享某些秘密价值观通常是强制性的。
    • 所以现在我们需要考虑如何安全地在多人之间分发和更新密钥。
  • 具体的秘密价值往往取决于环境。
    • 由于这些值在“你的机器”上与在“生产环境”上“根据定义”是不同的,因此很难进行“测试”甚至“审查”。

事实上,已经有一些产品专门用于处理密钥,例如HashiCorp VaultAWS Secrets ManagerGCP Secret Manager。在项目中引入这些产品会带来一定的额外开销,因为需要集成和维护的又是一项新服务。也许它非常适合您的用例,也许它有点过度设计。读完本文后,您至少会了解到一种入门门槛更低的替代方案。文末的“优缺点”部分也提供了概述。

尽管通常不建议将密钥存储在代码仓库中,但本教程中我恰恰要这样做:

  • 识别包含秘密值的文件
  • 确保将它们添加到.gitignore
  • 通过以下方式加密它们git-secret
  • 将加密文件提交到存储库

最终,我们将能够打电话

make secret-decrypt
Enter fullscreen mode Exit fullscreen mode

揭示代码库中的秘密,必要时对其进行修改,然后运行

make secret-encrypt
Enter fullscreen mode Exit fullscreen mode

再次加密它们,以便可以提交(并推送到远程仓库)。要查看实际效果,请切换到part-6-git-secret-encrypt-repository-docker分支并运行以下命令:

# checkout the branch
git checkout part-6-git-secret-encrypt-repository-docker

# build and start the docker setup
make make-init
make docker-build
make docker-up

# "create" the secret key - the file "secret.gpg.example" would usually NOT live in the repo!
cp secret.gpg.example secret.gpg

# initialize gpg
make gpg-init

# ensure that the decrypted secret file does not exist
ls passwords.txt

# decrypt the secret file
make secret-decrypt

# show the content of the secret file
cat passwords.txt
Enter fullscreen mode Exit fullscreen mode

工具

我们将在 PHP镜像中gpg进行设置,以便所有其他容器都能使用这些工具。有关 Docker 镜像的详细说明,请参阅《2022 年 PHP 8.1 应用 Docker 从零开始指南》 。git-secretbase

<strong>Caution</strong>


All following commands are 
<strong>executed <em>in</em> the <code>application</code> container.</strong>
<br>
<br>
<strong>Tip:</strong>
<br>
See <a href="https://www.pascallandau.com/blog/structuring-the-docker-setup-for-php-projects/#easy-container-access-via%20-din-bashrc-helper">Easy container access via din .bashrc helper</a>
for a convenient shortcut to log into docker containers.
Enter fullscreen mode Exit fullscreen mode

请注意,在主机系统和 Docker 容器共享的文件夹中使用时存在一个问题。我将在“目录套接字”git-secret部分详细解释(包括一个解决方法)git-secretgpg-agent

通用石油公司

gpgPGP是GNU Privacy Guard的缩写,是OpenPGP标准的开源实现。简而言之,它允许我们创建一个个人密钥文件对(类似于SSH密钥),其中包含一个私钥和一个公钥,可以与需要解密消息的其他方共享。

GPG安装

要安装它,我们只需运行命令即可apk add gnupg,从而进行.docker/images/php/base/Dockerfile相应的更新。

# File: .docker/images/php/base/Dockerfile

RUN apk add --update --no-cache \
        bash \
        gnupg \
        make \
#...
Enter fullscreen mode Exit fullscreen mode

GPG 用法

这里我只介绍绝对必要的命令。更多信息,gpg请参阅文档中的“使用 GPG”部分git-secret和/或“如何使用 GPG 生成 PGP 密钥” 。

创建 GPG 密钥对

我们需要gpg通过以下方式创建 GPG 密钥对

name="Pascal Landau"
email="pascal.landau@example.com"
gpg --batch --gen-key <<EOF
Key-Type: 1
Key-Length: 2048
Subkey-Type: 1
Subkey-Length: 2048
Name-Real: $name
Name-Email: $email
Expire-Date: 0
%no-protection
EOF
Enter fullscreen mode Exit fullscreen mode

%no-protection将创建一个没有密码的密钥,另请参阅“以非交互方式创建 GPG 密钥”的 gist。要使用密码(例如12345678,我们可以将该行替换%no-protection

Passphrase: 12345678
Enter fullscreen mode Exit fullscreen mode

所有无人值守创建选项均在官方文档“无人值守密钥生成”中定义。

输出:

$ name="Pascal Landau"
$ email="pascal.landau@example.com"
$ gpg --batch --gen-key <<EOF
> Key-Type: 1
> Key-Length: 2048
> Subkey-Type: 1
> Subkey-Length: 2048
> Name-Real: $name
> Name-Email: $email
> Expire-Date: 0
> %no-protection
> EOF
gpg: key E1E734E00B611C26 marked as ultimately trusted
gpg: revocation certificate stored as '/root/.gnupg/opengpg-revocs.d/74082D81525723F5BF5B2099E1E734E00B611C26.rev'
Enter fullscreen mode Exit fullscreen mode

您也可以gpg --gen-key不使用该--batch标志运行程序,以便通过交互式引导完成整个过程。

导出、列出和导入私钥 GPG 密钥

私钥可以通过以下方式导出:

email="pascal.landau@example.com"
path="secret.gpg"
gpg --output "$path" --armor --export-secret-key "$email"
Enter fullscreen mode Exit fullscreen mode

这个密钥绝对不能泄露

它看起来像这样:

-----BEGIN PGP PRIVATE KEY BLOCK-----

lQOYBF7VVBwBCADo9un+SySu/InHSkPDpFVKuZXg/s4BbZmqFtYjvUUSoRAeSejv
G21nwttQGut+F+GdpDJL6W4pmLS31Kxpt6LCAxhID+PRYiJQ4k3inJfeUx7Ws339
XDPO3Rys+CmnZchcEgnbOfQlEqo51DMj6mRF2Ra/6svh7lqhrixGx1BaKn6VlHkC
...
ncIcHxNZt7eK644nWDn7j52HsRi+wcWsZ9mjkUgZLtyMPJNB5qlKQ18QgVdEAhuZ
xT3SieoBPd+tZikhu3BqyIifmLnxOJOjOIhbQrgFiblvzU1iOUOTOcSIB+7A
=YmRm
-----END PGP PRIVATE KEY BLOCK-----
Enter fullscreen mode Exit fullscreen mode

所有密钥都可以通过以下方式列出:

gpg --list-secret-keys
Enter fullscreen mode Exit fullscreen mode

输出:

$ gpg --list-secret-keys
/root/.gnupg/pubring.kbx
------------------------
sec   rsa2048 2022-03-27 [SCEA]
      74082D81525723F5BF5B2099E1E734E00B611C26
uid           [ultimate] Pascal Landau <pascal.landau@example.com>
ssb   rsa2048 2022-03-27 [SEA]

Enter fullscreen mode Exit fullscreen mode

您可以通过以下方式导入私钥

path="secret.gpg"
gpg --import "$path"
Enter fullscreen mode Exit fullscreen mode

并得到以下输出:

$ path="secret.gpg"
$ gpg --import "$path"
gpg: key E1E734E00B611C26: "Pascal Landau <pascal.landau@example.com>" not changed
gpg: key E1E734E00B611C26: secret key imported
gpg: Total number processed: 1
gpg:              unchanged: 1
gpg:       secret keys read: 1
gpg:  secret keys unchanged: 1
Enter fullscreen mode Exit fullscreen mode

注意:如果密钥需要密码,系统会提示您输入密码。我们可以使用以下方法绕过此提示--batch --yes --pinentry-mode loopback

path="secret.gpg"
gpg --import --batch --yes --pinentry-mode loopback "$path"
Enter fullscreen mode Exit fullscreen mode

另请参阅“使用命令行密码短语输入 GPG”。这样,我们暂时不需要提供密码,但稍后在尝试解密文件时必须传递密码。

导出、列出和导入 GPG 公钥

公钥可以通过以下方式导出:public.gpg

email="pascal.landau@example.com"
path="public.gpg"
gpg --armor --export "$email" > "$path"
Enter fullscreen mode Exit fullscreen mode

它看起来像这样:

-----BEGIN PGP PUBLIC KEY BLOCK-----

mQENBF7VVBwBCADo9un+SySu/InHSkPDpFVKuZXg/s4BbZmqFtYjvUUSoRAeSejv
G21nwttQGut+F+GdpDJL6W4pmLS31Kxpt6LCAxhID+PRYiJQ4k3inJfeUx7Ws339
...
3LLbK7Qxz0cV12K7B+n2ei466QAYXo03a7WlsPWn0JTFCsHoCOphjaVsncIcHxNZ
t7eK644nWDn7j52HsRi+wcWsZ9mjkUgZLtyMPJNB5qlKQ18QgVdEAhuZxT3SieoB
Pd+tZikhu3BqyIifmLnxOJOjOIhbQrgFiblvzU1iOUOTOcSIB+7A
=g0hF
-----END PGP PUBLIC KEY BLOCK-----
Enter fullscreen mode Exit fullscreen mode

通过以下方式列出所有公钥

gpg --list-keys
Enter fullscreen mode Exit fullscreen mode

输出:

$ gpg --list-keys
/root/.gnupg/pubring.kbx
------------------------
pub   rsa2048 2022-03-27 [SCEA]
      74082D81525723F5BF5B2099E1E734E00B611C26
uid           [ultimate] Pascal Landau <pascal.landau@example.com>
sub   rsa2048 2022-03-27 [SEA]
Enter fullscreen mode Exit fullscreen mode

公钥可以通过与私钥相同的方式导入。

path="public.gpg"
gpg --import "$path"
Enter fullscreen mode Exit fullscreen mode

例子:

$ gpg --import /var/www/app/public.gpg
gpg: key E1E734E00B611C26: "Pascal Landau <pascal.landau@example.com>" not changed
gpg: Total number processed: 1
gpg:              unchanged: 1
Enter fullscreen mode Exit fullscreen mode

git-secret

git-secret的官方网站已经很好地介绍了这个工具。简而言之,它允许我们将某些文件声明为“机密文件”,并使用所有受信任方的密钥对其进行加密。加密后的文件可以gpg直接安全地存储在 Git 仓库中,并在需要时进行解密

在本教程中,我将使用git-secret v0.4.0

$ git secret --version
0.4.0
Enter fullscreen mode Exit fullscreen mode

git-secret 安装

Alpine的安装说明如下

sh -c "echo 'https://gitsecret.jfrog.io/artifactory/git-secret-apk/all/main'" >> /etc/apk/repositories
wget -O /etc/apk/keys/git-secret-apk.rsa.pub 'https://gitsecret.jfrog.io/artifactory/api/security/keypair/public/repositories/git-secret-apk'
apk add --update --no-cache git-secret
Enter fullscreen mode Exit fullscreen mode

此外,我们还需要考虑最近的一项变更,git该变更要求执行命令的用户必须拥有父目录。另请参阅权限问题”git部分中的更详细说明git

我们.docker/images/php/base/Dockerfile据此进行了更新:

# File: .docker/images/php/base/Dockerfile

# install git-secret
# @see https://git-secret.io/installation#alpine
ADD https://gitsecret.jfrog.io/artifactory/api/security/keypair/public/repositories/git-secret-apk /etc/apk/keys/git-secret-apk.rsa.pub

RUN echo "https://gitsecret.jfrog.io/artifactory/git-secret-apk/all/main" >> /etc/apk/repositories  && \
    apk add --update --no-cache \
        bash \
        git-secret \
        gawk \
        gnupg \
        make \
#...

# Fix the git permission issue
RUN git config --system --add safe.directory "$APP_CODE_PATH"
Enter fullscreen mode Exit fullscreen mode

权限git问题

2022年4月,GitHub宣布了这一安全漏洞CVE-2022-24765,该漏洞已于[日期]修复。git v2.35.2

此版本改变了 Git 在查找顶级目录时的行为, 使其在目录遍历的所有权从当前用户变更.git时停止。

git实际上,如果执行该命令的用户不拥有父目录,则会发生以下错误。

Error: fatal: unsafe repository ('/parent/dir/of/.git-folder' is owned by someone else)
To add an exception for this directory, call:

    git config --global --add safe.directory /parent/dir/of/.git-folder
Enter fullscreen mode Exit fullscreen mode

使用时git secret,我们会收到一条略有误导性的错误消息。

git-secret: abort: not in dir with git repo. Use 'git init' or 'git clone', then in repo use 'git secret init'
Enter fullscreen mode Exit fullscreen mode

我们可以通过使用新的多值safe.directory配置来“修复”这个问题。

git config --system --add safe.directory /parent/dir/of/.git-folder
Enter fullscreen mode Exit fullscreen mode

请注意,我们没有使用建议的--global选项,而是采用了另一种方法,以便为任何--system用户设置配置

等等——为什么不直接确保文件夹的父目录.git具有正确的权限呢

嗯……目前(2022-05-28)Docker Desktop 中存在一个bug,导致绑定挂载的权限变得难以预测,参见“通过绑定挂载设置的文件的所有权被设置为第一个访问该文件的用户”,通过直接应用修复程序,Dockerfile我们可以可靠地解决此问题。

git-secret 的使用

初始化 git-secret

git-secret通过在 Git 仓库根目录下运行以下命令进行初始化。

git secret init
Enter fullscreen mode Exit fullscreen mode
$ git secret init
git-secret: init created: '/var/www/app/.gitsecret/'
Enter fullscreen mode Exit fullscreen mode

我们只需要执行一次此操作,因为稍后我们会将该文件夹提交到 Git。它包含以下文件:

$ git status | grep ".gitsecret"
        new file:   .gitsecret/keys/pubring.kbx
        new file:   .gitsecret/keys/pubring.kbx~
        new file:   .gitsecret/keys/trustdb.gpg
        new file:   .gitsecret/paths/mapping.cfg
Enter fullscreen mode Exit fullscreen mode

pubring.kbx~文件(带有尾部波浪号~)只是一个临时文件,可以安全地使用 git 忽略它。另请参阅“找不到有关 keyring.kbx~ 文件的任何文档”

目录git-secretgpg-agent套接字

要在主机系统和 Docker 共享的git-secret目录中使用,我们还需要运行以下命令:

tee .gitsecret/keys/S.gpg-agent <<EOF
%Assuan%
socket=/tmp/S.gpg-agent
EOF

tee .gitsecret/keys/S.gpg-agent.ssh <<EOF
%Assuan%
socket=/tmp/S.gpg-agent.ssh
EOF

tee .gitsecret/keys/gpg-agent.conf <<EOF
extra-socket /tmp/S.gpg-agent.extra
browser-socket /tmp/S.gpg-agent.browser
EOF
Enter fullscreen mode Exit fullscreen mode

这是必要的,因为当git-secret代码库在主机系统和 Docker 容器之间共享时,会出现问题。我在 GitHub 问题“gpg: can't connect to the agent: IPC connect call failed” error in docker alpine on shared volume 中详细解释了这个问题

简而言之:

  • gpg它使用一个工具来执行其任务,这两个工具通过在gpg-agent创建的套接字进行通信。--home-directorygpg-agent
  • gpg代理程序通过命令隐式启动git-secret,并使用.gitsecret/keys目录作为参数。--home-directory
  • 由于该位置--home-directory与主机系统共享,因此套接字创建失败(这可能仅是 Docker Desktop 的问题,请参阅 GitHub 问题“支持共享 Unix 套接字”中的相关讨论)。相应的错误消息如下:
gpg: can't connect to the agent: IPC connect call failed

gpg-agent: error binding socket to '/var/www/app/.gitsecret/keys/S.gpg-agent': I/O error
Enter fullscreen mode Exit fullscreen mode

此问题的解决方法可在本帖中找到:通过在目录中放置额外的配置文件gpg来配置套接字使用不同的位置gpg.gitsecret/keys

S.gpg代理

%Assuan%
socket=/tmp/S.gpg-agent
Enter fullscreen mode Exit fullscreen mode

S.gpg-agent.ssh

%Assuan%
socket=/tmp/S.gpg-agent.ssh
Enter fullscreen mode Exit fullscreen mode

gpg-agent.conf

extra-socket /tmp/S.gpg-agent.extra
browser-socket /tmp/S.gpg-agent.browser
Enter fullscreen mode Exit fullscreen mode

添加、列出和删除用户

添加新用户,必须先导入其公钥。然后运行:

email="pascal.landau@example.com"
git secret tell "$email"
Enter fullscreen mode Exit fullscreen mode

在这种情况下,用户pascal.landau@example.com现在可以解密这些秘密信息。

为了向用户展示运行情况

git secret whoknows
Enter fullscreen mode Exit fullscreen mode
$ git secret whoknows
pascal.landau@example.com
Enter fullscreen mode Exit fullscreen mode

要删除用户,请运行

email="pascal.landau@example.com"
git secret killperson "$email"
Enter fullscreen mode Exit fullscreen mode

供您参考:此命令已重命名为removepersoningit-secret >= 0.5.0

$ git secret killperson pascal.landau@example.com
git-secret: removed keys.
git-secret: now [pascal.landau@example.com] do not have an access to the repository.
git-secret: make sure to hide the existing secrets again.
Enter fullscreen mode Exit fullscreen mode

用户pascal.landau@example.com将无法再解密这些密钥。

注意:删除用户后需要重新加密密钥!

提醒:请轮换加密密钥。

请注意,Git 不仅存储您的密钥,还存储了哪些用户拥有访问权限。也就是说,即使您删除某个用户并重新加密密钥,该用户仍然可以解密之前提交(用户尚未被添加时)的密钥。因此,删除用户后,您还需要轮换加密后的密钥

但这难道不是该系统的一个重大缺陷,使其git-secret总体上成为一个糟糕的使用方法吗?

我的意见是:不。

如果被移除的用户曾经拥有访问密钥的权限(无论密钥存储在何处),他很可能只是创建了一个本地副本或简单地“记了下来”。就安全性而言,这实际上并没有什么“额外的缺点” git-secret这只是非常明确地提醒你必须轮换密钥¯\_(ツ)_/¯

另请参阅Hacker News 上的这篇冗长讨论git-secret

添加、列出和删除加密文件

git secret add [filenames...]要加密的文件运行此命令。例如:

git secret add .env
Enter fullscreen mode Exit fullscreen mode

如果.env未添加.gitignoregit-secret则会显示警告并自动添加。

git-secret: these files are not in .gitignore: .env
git-secret: auto adding them to .env
git-secret: 1 item(s) added.
Enter fullscreen mode Exit fullscreen mode

否则,该文件将被添加,且不会发出任何警告。

$ git secret add .env
git-secret: 1 item(s) added.
Enter fullscreen mode Exit fullscreen mode

您只需添加一次文件。添加后,文件将存储在.gitsecret/paths/mapping.cfg

$ cat .gitsecret/paths/mapping.cfg
.env:505070fc20233cb426eac6a3414399d0f466710c993198b1088e897fdfbbb2d5
Enter fullscreen mode Exit fullscreen mode

您还可以通过以下方式显示添加的文件

git secret list
Enter fullscreen mode Exit fullscreen mode
$ git secret list
.env
Enter fullscreen mode Exit fullscreen mode

注意:这些文件尚未加密!

如果要解除文件的加密状态,请运行

git secret remove .env
Enter fullscreen mode Exit fullscreen mode

输出

$ git secret remove .env
git-secret: removed from index.
git-secret: ensure that files: [.env] are now not ignored.
Enter fullscreen mode Exit fullscreen mode

加密文件

要实际加密文件,请运行:

git secret hide
Enter fullscreen mode Exit fullscreen mode

输出:

$ git secret hide
git-secret: done. 1 of 1 files are hidden.
Enter fullscreen mode Exit fullscreen mode

加密后的(二进制)文件存储在$filename.secret,即.env.secret在本例中:

$ cat .env.secret
�☺♀♥�H~�B�Ӯ☺�"��▼♂F�►���l�Cs��S�@MHWs��e������{♣♫↕↓�L� ↕s�1�J$◄♥�;���dž֕�Za�����\u�ٲ& ¶��V�► ���6��
;<�d:��}ҨD%.�;��&��G����vWW�]>���߶��▲;D�+Rs�S→�Y!&J��۪8���ٔF��→f����*��$♠���&RC�8▼♂�☻z h��Z0M�T>
Enter fullscreen mode Exit fullscreen mode

所有通过该命令添加的用户git secret tell都可以解密加密文件。这也意味着,每当添加新用户时,都需要再次运行此命令

解密文件

您可以通过以下方式解密文件

git secret reveal
Enter fullscreen mode Exit fullscreen mode

输出:

$ git secret reveal
File '/var/www/app/.env' exists. Overwrite? (y/N) y
git-secret: done. 1 of 1 files are revealed.
Enter fullscreen mode Exit fullscreen mode
  • 文件将被解密,并将覆盖当前未加密的文件(如果这些文件已存在)。
    • 使用此-f选项强制覆盖并以非交互方式运行。
  • 如果您只想查看加密文件的内容,可以使用git secret cat $filename(例如git secret cat .env

如果密钥受密码保护,则必须通过选项gpg传递密码。例如,对于密码-p123456

git secret reveal -p 123456
Enter fullscreen mode Exit fullscreen mode

显示加密文件和解密文件之间的差异

加密文件带来的一个问题是:在远程代码审查工具中,你无法查看加密文件。因此,为了了解代码做了哪些更改,最好能
显示加密文件和解密文件之间的差异。这可以通过以下方式实现:

git secret changes
Enter fullscreen mode Exit fullscreen mode

输出:

$ echo "foo" >> .env
$ git secret changes
git-secret: changes in /var/www/app/.env:
--- /dev/fd/63
+++ /var/www/app/.env
@@ -34,3 +34,4 @@
 MAIL_ENCRYPTION=null
 MAIL_FROM_ADDRESS=null
 MAIL_FROM_NAME="${APP_NAME}"
+foo
Enter fullscreen mode Exit fullscreen mode

+foo请注意输出底部的逗号。它是通过第一行添加的echo "foo"> >> .env

Makefile 调整

由于我无法记住所有命令git-secretgpg我已经将它们添加到 Makefile 文件中.make/01-00-application-setup.mk

# File: .make/01-00-application-setup.mk

#...

# gpg

DEFAULT_SECRET_GPG_KEY?=secret.gpg
DEFAULT_PUBLIC_GPG_KEYS?=.dev/gpg-keys/*

.PHONY: gpg
gpg: ## Run gpg commands. Specify the command e.g. via ARGS="--list-keys"
    $(EXECUTE_IN_APPLICATION_CONTAINER) gpg $(ARGS)

.PHONY: gpg-export-public-key
gpg-export-public-key: ## Export a gpg public key e.g. via EMAIL="john.doe@example.com" PATH=".dev/gpg-keys/john-public.gpg"
    @$(if $(PATH),,$(error PATH is undefined))
    @$(if $(EMAIL),,$(error EMAIL is undefined))
    "$(MAKE)" -s gpg ARGS="gpg --armor --export $(EMAIL) > $(PATH)"

.PHONY: gpg-export-private-key
gpg-export-private-key: ## Export a gpg private key e.g. via EMAIL="john.doe@example.com" PATH="secret.gpg"
    @$(if $(PATH),,$(error PATH is undefined))
    @$(if $(EMAIL),,$(error EMAIL is undefined))
    "$(MAKE)" -s gpg ARGS="--output $(PATH) --armor --export-secret-key $(EMAIL)"

.PHONY: gpg-import
gpg-import: ## Import a gpg key file e.g. via GPG_KEY_FILES="/path/to/file /path/to/file2"
    @$(if $(GPG_KEY_FILES),,$(error GPG_KEY_FILES is undefined))
    "$(MAKE)" -s gpg ARGS="--import --batch --yes --pinentry-mode loopback $(GPG_KEY_FILES)"

.PHONY: gpg-import-default-secret-key
gpg-import-default-secret-key: ## Import the default secret key
    "$(MAKE)" -s gpg-import GPG_KEY_FILES="$(DEFAULT_SECRET_GPG_KEY)"

.PHONY: gpg-import-default-public-keys
gpg-import-default-public-keys: ## Import the default public keys
    "$(MAKE)" -s gpg-import GPG_KEY_FILES="$(DEFAULT_PUBLIC_GPG_KEYS)" 

.PHONY: gpg-init
gpg-init: gpg-import-default-secret-key gpg-import-default-public-keys ## Initialize gpg in the container, i.e. import all public and private keys

# git-secret

.PHONY: git-secret
git-secret: ## Run git-secret commands. Specify the command e.g. via ARGS="hide"
    $(EXECUTE_IN_APPLICATION_CONTAINER) git-secret $(ARGS)

.PHONY: secret-init
secret-init: ## Initialize git-secret in the repository via `git-secret init`
    "$(MAKE)" -s git-secret ARGS="init"

.PHONY: secret-init-gpg-socket-config
secret-init-gpg-socket-config: ## Initialize the config files to change the gpg socket locations
    echo "%Assuan%" > .gitsecret/keys/S.gpg-agent
    echo "socket=/tmp/S.gpg-agent" >> .gitsecret/keys/S.gpg-agent
    echo "%Assuan%" > .gitsecret/keys/S.gpg-agent.ssh
    echo "socket=/tmp/S.gpg-agent.ssh" >> .gitsecret/keys/S.gpg-agent.ssh
    echo "extra-socket /tmp/S.gpg-agent.extra" > .gitsecret/keys/gpg-agent.conf
    echo "browser-socket /tmp/S.gpg-agent.browser" >> .gitsecret/keys/gpg-agent.conf

.PHONY: secret-encrypt
secret-encrypt: ## Decrypt secret files via `git-secret hide`
    "$(MAKE)" -s git-secret ARGS="hide"

.PHONY: secret-decrypt
secret-decrypt: ## Decrypt secret files via `git-secret reveal -f`
    "$(MAKE)" -s git-secret ARGS="reveal -f" 

.PHONY: secret-decrypt-with-password
secret-decrypt-with-password: ## Decrypt secret files using a password for gpg via `git-secret reveal -f -p $(GPG_PASSWORD)`
    @$(if $(GPG_PASSWORD),,$(error GPG_PASSWORD is undefined))
    "$(MAKE)" -s git-secret ARGS="reveal -f -p $(GPG_PASSWORD)" 

.PHONY: secret-add
secret-add: ## Add a file to git secret via `git-secret add $FILE`
    @$(if $(FILE),,$(error FILE is undefined))
    "$(MAKE)" -s git-secret ARGS="add $(FILE)"

.PHONY: secret-cat
secret-cat: ## Show the contents of file to git secret via `git-secret cat $FILE`
    @$(if $(FILE),,$(error FILE is undefined))
    "$(MAKE)" -s git-secret ARGS="cat $(FILE)"

.PHONY: secret-list
secret-list: ## List all files added to git secret `git-secret list`
    "$(MAKE)" -s git-secret ARGS="list"

.PHONY: secret-remove
secret-remove: ## Remove a file from git secret via `git-secret remove $FILE`
    @$(if $(FILE),,$(error FILE is undefined))
    "$(MAKE)" -s git-secret ARGS="remove $(FILE)"

.PHONY: secret-add-user
secret-add-user: ## Remove a user from git secret via `git-secret tell $EMAIL`
    @$(if $(EMAIL),,$(error EMAIL is undefined))
    "$(MAKE)" -s git-secret ARGS="tell $(EMAIL)"

.PHONY: secret-show-users
secret-show-users: ## Show all users that have access to git secret via `git-secret whoknows`
    "$(MAKE)" -s git-secret ARGS="whoknows"

.PHONY: secret-remove-user
secret-remove-user: ## Remove a user from git secret via `git-secret killperson $EMAIL`
    @$(if $(EMAIL),,$(error EMAIL is undefined))
    "$(MAKE)" -s git-secret ARGS="killperson $(EMAIL)"

.PHONY: secret-diff
secret-diff: ## Show the diff between the content of encrypted and decrypted files via `git-secret changes`
    "$(MAKE)" -s git-secret ARGS="changes"
Enter fullscreen mode Exit fullscreen mode

工作流程

使用起来git-secret非常简单:

  • 初始化git-secret
  • 添加所有用户
  • 添加所有秘密文件,并确保它们被忽略。.gitignore
  • 对文件进行加密
  • 将加密文件像“任何其他文件”一样提交。
  • 如果其他团队成员对文件进行了任何更改:
    • => 解密以获取最新版本
  • 如果您需要进行任何修改:
    • => 对解密后的文件进行修改,然后重新加密它们

但是:细节决定成败。“流程挑战”部分解释了我们遇到的一些陷阱,“场景”部分则针对常见场景提供了一些具体示例。

流程挑战

从流程角度来看,我们遇到了一些挑战,我想提一下——包括我们是如何应对这些挑战的。

更新秘密

更新密钥时,务必先解密文件,以避免使用本地可能仍然存在的“过期”文件。我通常会检出最新main分支并运行命令git secret reveal,以获取最新版本的密钥文件。您也可以使用post-mergeGit 钩子自动执行此操作,但我个人不想冒意外覆盖本地密钥文件的风险。

代码审查和合并冲突

由于加密文件无法进行有效的差异比较,当涉及机密信息时,代码审查会变得更加困难。我们使用 GitLab 进行代码审查,我通常首先查看文件的差异,.gitsecret/paths/mapping.cfg直接在用户界面中查看“哪些文件发生了更改”。

此外,我将

  • 去分行main看看
  • 通过以下方式解密秘密git secret reveal -f
  • 看看feature-branch
  • 运行以查看解密文件和加密文件git secret changes之间的差异mainfeature-branch

当多个团队成员需要在不同分支上同时修改机密文件时,情况会变得更加复杂,因为加密文件无法直接比较——也就是说,Git 无法智能地进行增量更新。唯一的解决办法是协调拉取请求,即先合并第一个拉取请求,更新第二个拉取请求中的机密信息,然后再合并第二个拉取请求。

幸运的是,这种情况至今只发生过极少数。

本地git-secret设置gpg

目前,我们团队的所有开发人员都已在git-secret本地安装了该软件(而不是通过 Docker 使用),并使用他们自己的gpg密钥。

这意味着需要更多的新用户入职流程成本,因为

  • 新开发人员必须
    • 本地安装git-secret(*)
    • gpg本地安装和设置(*)
    • 创建gpg密钥对
  • 公钥必须由团队其他所有成员添加(*)
  • 必须通过以下方式添加密钥用户:git secret tell
  • 密钥必须重新加密。

至于离职手续

  • 公钥必须由团队其他所有成员删除(*)
  • 必须通过以下方式移除密钥用户:git secret killperson
  • 密钥必须重新加密。

此外,我们需要确保所有git-secret版本gpg都保持最新,以免大家遇到任何兼容性问题。

作为替代方案,我目前更倾向于使用 Docker 来处理所有事情(如本教程所示)。所有标有 (*) 的步骤都已过时,也就是说,无需在本地进行任何git-secret设置gpg

但这种方法也存在一些缺点,因为

  • 每次启动容器时,都必须导入私钥和所有公钥
  • 每个开发人员都需要将自己的gpg私钥“放入代码库中”(会被忽略.gitignore),以便与 Docker 共享并由gpgDocker 导入。另一种方法是使用团队共享的单个密钥——但这感觉非常不妥 :P

为了方便起见,我们将每个开发人员的公共 GPG 密钥放在存储库的某个位置.dev/gpg-keys/,而私钥必须命名secret.gpg并放在代码库的根目录中

在此设置中,secret.gpg还必须将其添加到.gitignore文件中。

# File: .gitignore
#...
vendor/
secret.gpg
Enter fullscreen mode Exit fullscreen mode

现在可以通过make设置目标来简化导入过程:

# gpg

DEFAULT_SECRET_GPG_KEY?=secret.gpg
DEFAULT_PUBLIC_GPG_KEYS?=.dev/gpg-keys/*

.PHONY: gpg
gpg: ## Run gpg commands. Specify the command e.g. via ARGS="--list-keys"
    $(EXECUTE_IN_APPLICATION_CONTAINER) gpg $(ARGS)

.PHONY: gpg-import
gpg-import: ## Import a gpg key file e.g. via GPG_KEY_FILES="/path/to/file /path/to/file2"
    @$(if $(GPG_KEY_FILES),,$(error GPG_KEY_FILES is undefined))
    "$(MAKE)" -s gpg ARGS="--import --batch --yes --pinentry-mode loopback $(GPG_KEY_FILES)"

.PHONY: gpg-import-default-secret-key
gpg-import-default-secret-key: ## Import the default secret key
    "$(MAKE)" -s gpg-import GPG_KEY_FILES="$(DEFAULT_SECRET_GPG_KEY)"

.PHONY: gpg-import-default-public-keys
gpg-import-default-public-keys: ## Import the default public keys
    "$(MAKE)" -s gpg-import GPG_KEY_FILES="$(DEFAULT_PUBLIC_GPG_KEYS)" 

.PHONY: gpg-init
gpg-init: gpg-import-default-secret-key gpg-import-default-public-keys ## Initialize gpg in the container, i.e. import all public and private keys
Enter fullscreen mode Exit fullscreen mode

现在“一切”都可以通过以下方式处理

make gpg-init
Enter fullscreen mode Exit fullscreen mode

容器启动后,只需运行一次即可。

场景

这些情景假设了以下前提条件:

  git checkout part-6-git-secret-encrypt-repository-docker
Enter fullscreen mode Exit fullscreen mode

并且没有正在运行的 Docker 容器

  make docker-down
Enter fullscreen mode Exit fullscreen mode
  • 您已删除现有git-secret文件夹、其中的键.dev/gpg-keyssecret.gpg键和passwords.*文件。
  rm -rf .gitsecret/ .dev/gpg-keys/* secret.gpg passwords.*
Enter fullscreen mode Exit fullscreen mode

gpg初始密钥设置

很遗憾,我没找到通过`docker build` 和 `docker export` 创建和导出gpg密钥的方法。你需要以交互方式运行命令,或者传递一个带换行符的字符串。这两种方法在 ` docker build`和 `docker export` 中都非常复杂。因此,你需要登录到容器并直接在容器内运行命令。这不太理想,但无论如何,这只需要在新开发人员入职时执行一次。makedockermakeapplication

供参考:我通常通过 din .bashrc 助手轻松访问容器来登录

私钥导出到secret.gpg,公钥导出到.dev/gpg-keys/alice-public.gpg

# start the docker setup
make docker-up

# log into the container ('winpty' is only required on Windows)
winpty docker exec -ti dofroscra_local-application-1 bash

# export key pair
name="Alice Doe"
email="alice@example.com"
gpg --batch --gen-key <<EOF
Key-Type: 1
Key-Length: 2048
Subkey-Type: 1
Subkey-Length: 2048
Name-Real: $name
Name-Email: $email
Expire-Date: 0
%no-protection
EOF

# export the private key
gpg --output secret.gpg --armor --export-secret-key $email

# export the public key
gpg --armor --export $email > .dev/gpg-keys/alice-public.gpg
Enter fullscreen mode Exit fullscreen mode
$ make docker-up
ENV=local TAG=latest DOCKER_REGISTRY=docker.io DOCKER_NAMESPACE=dofroscra APP_USER_NAME=application APP_GROUP_NAME=application docker compose -p dofroscra_local --env-file ./.docker/.env -f ./.docker/docker-compose/docker-compose.yml -f ./.docker/docker-compose/docker-compose.local.yml up -d
Container dofroscra_local-application-1  Created
...
Container dofroscra_local-application-1  Started
$ docker ps
CONTAINER ID   IMAGE                                COMMAND                  CREATED          STATUS          PORTS                NAMES
...
95f740607586   dofroscra/application-local:latest   "/usr/sbin/sshd -D"      21 minutes ago   Up 21 minutes   0.0.0.0:2222->22/tcp dofroscra_local-application-1

$ winpty docker exec -ti dofroscra_local-application-1 bash
root:/var/www/app# name="Alice Doe"
root:/var/www/app# email="alice@example.com"
gpg --batch --gen-key <<EOF
Key-Type: 1
Key-Length: 2048
Subkey-Type: 1
Subkey-Length: 2048
Name-Real: $name
Name-Email: $email
Expire-Date: 0
%no-protection
EOF
root:/var/www/app# gpg --batch --gen-key <<EOF
> Key-Type: 1
> Key-Length: 2048
> Subkey-Type: 1
> Subkey-Length: 2048
> Name-Real: $name
> Name-Email: $email
> Expire-Date: 0
> %no-protection
> EOF
gpg: directory '/root/.gnupg' created
gpg: keybox '/root/.gnupg/pubring.kbx' created
gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key BBBE654440E720C1 marked as ultimately trusted
gpg: directory '/root/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/root/.gnupg/openpgp-revocs.d/225C736E0E70AC222C072B70BBBE654440E720C1.rev'

root:/var/www/app# gpg --output secret.gpg --armor --export-secret-key $email
root:/var/www/app# head secret.gpg
-----BEGIN PGP PRIVATE KEY BLOCK-----

lQOYBGJD+bwBCADBGKySV5PINc5MmQB3PNvCG7Oa1VMBO8XJdivIOSw7ykv55PRP
3g3R+ERd1Ss5gd5KAxLc1tt6PHGSPTypUJjCng2plwD8Jy5A/cC6o2x8yubOslLa
x1EC9fpcxUYUNXZavtEr+ylOaTaRz6qwSabsAgkg2NZ0ey/QKmFOZvhL8NlK9lTI
GgZPTiqPCsr7hiNg0WRbT5h8nTmfpl/DdTgwfPsDn5Hn0TEMa79WsrPnnq16jsq0
Uusuw3tOmdSdYnT8j7m1cpgcSj0hRF1eh4GVE0o62GqeLTWW9mfpcuv7n6mWaCB8
DCH6H238gwUriq/aboegcuBktlvSY21q/MIXABEBAAEAB/wK/M2buX+vavRgDRgR
hjUrsJTXO3VGLYcIetYXRhLmHLxBriKtcBa8OxLKKL5AFEuNourOBdcmTPiEwuxH
5s39IQOTrK6B1UmUqXvFLasXghorv8o8KGRL4ABM4Bgn6o+KBAVLVIwvVIhQ4rlf

root:/var/www/app# gpg --armor --export $email > .dev/gpg-keys/alice-public.gpg
root:/var/www/app# head .dev/gpg-keys/alice-public.gpg
-----BEGIN PGP PUBLIC KEY BLOCK-----

mQENBGJD+bwBCADBGKySV5PINc5MmQB3PNvCG7Oa1VMBO8XJdivIOSw7ykv55PRP
3g3R+ERd1Ss5gd5KAxLc1tt6PHGSPTypUJjCng2plwD8Jy5A/cC6o2x8yubOslLa
x1EC9fpcxUYUNXZavtEr+ylOaTaRz6qwSabsAgkg2NZ0ey/QKmFOZvhL8NlK9lTI
GgZPTiqPCsr7hiNg0WRbT5h8nTmfpl/DdTgwfPsDn5Hn0TEMa79WsrPnnq16jsq0
Uusuw3tOmdSdYnT8j7m1cpgcSj0hRF1eh4GVE0o62GqeLTWW9mfpcuv7n6mWaCB8
DCH6H238gwUriq/aboegcuBktlvSY21q/MIXABEBAAG0HUFsaWNlIERvZSA8YWxp
Y2VAZXhhbXBsZS5jb20+iQFOBBMBCgA4FiEEIlxzbg5wrCIsBytwu75lREDnIMEF
AmJD+bwCGy8FCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQu75lREDnIMEN4Af+
Enter fullscreen mode Exit fullscreen mode

就这样。我们现在有了新的密钥和私钥,alice@example.com并已将其导出到secret.gpgresp. .dev/gpg-keys/alice-public.gpg(从而与宿主机系统共享)。剩余的命令现在可以在容器外部application直接在宿主机系统上运行。

初始设置git-secret

假设我们要git-secret从头开始向一个新的代码库引入新功能。那么你可以运行以下命令:

初始化git-secret

make secret-init
Enter fullscreen mode Exit fullscreen mode
$ make secret-init
"C:/Program Files/Git/mingw64/bin/make" -s git-secret ARGS="init";
git-secret: init created: '/var/www/app/.gitsecret/'
Enter fullscreen mode Exit fullscreen mode

应用此gpg修复程序以解决共享目录问题

请参阅目录git-secretgpg-agent套接字

$ make secret-init-gpg-socket-config
Enter fullscreen mode Exit fullscreen mode
$ make secret-init-gpg-socket-config
echo "%Assuan%" > .gitsecret/keys/S.gpg-agent
echo "socket=/tmp/S.gpg-agent" >> .gitsecret/keys/S.gpg-agent
echo "%Assuan%" > .gitsecret/keys/S.gpg-agent.ssh
echo "socket=/tmp/S.gpg-agent.ssh" >> .gitsecret/keys/S.gpg-agent.ssh
echo "extra-socket /tmp/S.gpg-agent.extra" > .gitsecret/keys/gpg-agent.conf
echo "browser-socket /tmp/S.gpg-agent.browser" >> .gitsecret/keys/gpg-agent.conf
Enter fullscreen mode Exit fullscreen mode

gpg容器启动后初始化

重启容器后,我们需要进行初始化gpg,即从导入所有公钥.dev/gpg-keys/*和私钥secret.gpg。否则我们将无法加密和解密文件。

make gpg-init
Enter fullscreen mode Exit fullscreen mode
$ make gpg-init
"C:/Program Files/Git/mingw64/bin/make" -s gpg-import GPG_KEY_FILES="secret.gpg"
gpg: directory '/home/application/.gnupg' created
gpg: keybox '/home/application/.gnupg/pubring.kbx' created
gpg: /home/application/.gnupg/trustdb.gpg: trustdb created
gpg: key BBBE654440E720C1: public key "Alice Doe <alice@example.com>" imported
gpg: key BBBE654440E720C1: secret key imported
gpg: Total number processed: 1
gpg:               imported: 1
gpg:       secret keys read: 1
gpg:   secret keys imported: 1
"C:/Program Files/Git/mingw64/bin/make" -s gpg-import GPG_KEY_FILES=".dev/gpg-keys/*"
gpg: key BBBE654440E720C1: "Alice Doe <alice@example.com>" not changed
gpg: Total number processed: 1
gpg:              unchanged: 1
Enter fullscreen mode Exit fullscreen mode

添加(新)团队成员

我们先来添加我们自己的用户。git-secret

make secret-add-user EMAIL="alice@example.com"
Enter fullscreen mode Exit fullscreen mode
$ make secret-add-user EMAIL="alice@example.com"
"C:/Program Files/Git/mingw64/bin/make" -s git-secret ARGS="tell alice@example.com"
git-secret: done. alice@example.com added as user(s) who know the secret.
Enter fullscreen mode Exit fullscreen mode

并通过以下方式验证它是否有效:

make secret-show-users
Enter fullscreen mode Exit fullscreen mode
$ make secret-show-users
"C:/Program Files/Git/mingw64/bin/make" -s git-secret ARGS="whoknows"
alice@example.com
Enter fullscreen mode Exit fullscreen mode

添加和加密文件

让我们添加一个新的加密文件secret_password.txt

创建文件

echo "my_new_secret_password" > secret_password.txt
Enter fullscreen mode Exit fullscreen mode

添加到.gitignore

echo "secret_password.txt" >> .gitignore
Enter fullscreen mode Exit fullscreen mode

添加到git-secret

make secret-add FILE="secret_password.txt"
Enter fullscreen mode Exit fullscreen mode
$ make secret-add FILE="secret_password.txt"
"C:/Program Files/Git/mingw64/bin/make" -s git-secret ARGS="add secret_password.txt"
git-secret: 1 item(s) added.
Enter fullscreen mode Exit fullscreen mode

加密所有文件

make secret-encrypt
Enter fullscreen mode Exit fullscreen mode
$ make secret-encrypt
"C:/Program Files/Git/mingw64/bin/make" -s git-secret ARGS="hide"
git-secret: done. 1 of 1 files are hidden.

$ ls secret_password.txt.secret
secret_password.txt.secret
Enter fullscreen mode Exit fullscreen mode

解密文件

我们先删除“plain”secret_password.txt文件

rm secret_password.txt
Enter fullscreen mode Exit fullscreen mode
$ rm secret_password.txt

$ ls secret_password.txt
ls: cannot access 'secret_password.txt': No such file or directory
Enter fullscreen mode Exit fullscreen mode

然后解密加密后的文件。

make secret-decrypt
Enter fullscreen mode Exit fullscreen mode
$ make secret-decrypt
"C:/Program Files/Git/mingw64/bin/make" -s git-secret ARGS="reveal -f"
git-secret: done. 1 of 1 files are revealed.

$ cat secret_password.txt
my_new_secret_password
Enter fullscreen mode Exit fullscreen mode

注意:如果密钥gpg受密码保护(例如123456),请运行

make secret-decrypt-with-password GPG_PASSWORD=123456
Enter fullscreen mode Exit fullscreen mode

你也可以将该GPG_PASSWORD变量作为本地默认值添加到.make/.env文件中,这样就无需每次都指定该值,只需运行即可。

make secret-decrypt-with-password
Enter fullscreen mode Exit fullscreen mode

未通过GPG_PASSWORD

删除文件

删除secret_password.txt之前添加的文件:

make secret-remove FILE="secret_password.txt"
Enter fullscreen mode Exit fullscreen mode
$ make secret-remove FILE="secret_password.txt"
"C:/Program Files/Git/mingw64/bin/make" -s git-secret ARGS="remove secret_password.txt"
git-secret: removed from index.
git-secret: ensure that files: [secret_password.txt] are now not ignored.
Enter fullscreen mode Exit fullscreen mode

注意:这既不会删除secret_password.txt文件,也不会secret_password.txt.secret自动删除文件。

$ ls -l | grep secret_password.txt
-rw-r--r-- 1 Pascal 197121     19 Mar 31 14:03 secret_password.txt
-rw-r--r-- 1 Pascal 197121    358 Mar 31 14:02 secret_password.txt.secret
Enter fullscreen mode Exit fullscreen mode

即使加密secret_password.txt.secret文件仍然存在,它也不会被解密:

$ make secret-decrypt
"C:/Program Files/Git/mingw64/bin/make" -s git-secret ARGS="reveal -f"
git-secret: done. 0 of 0 files are revealed.
Enter fullscreen mode Exit fullscreen mode

移除团队成员

可以通过以下方式移除团队成员:

make secret-remove-user EMAIL="alice@example.com"
Enter fullscreen mode Exit fullscreen mode
$ make secret-remove-user EMAIL="alice@example.com"
"C:/Program Files/Git/mingw64/bin/make" -s git-secret ARGS="killperson alice@example.com"
git-secret: removed keys.
git-secret: now [alice@example.com] do not have an access to the repository.
git-secret: make sure to hide the existing secrets again.
Enter fullscreen mode Exit fullscreen mode

如果还有剩余用户,我们必须确保通过以下方式重新加密密钥:

make secret-encrypt
Enter fullscreen mode Exit fullscreen mode

否则(如果没有更多用户)git-secret,则会直接报错。

$ make secret-decrypt
"C:/Program Files/Git/mingw64/bin/make" -s git-secret ARGS="reveal -f"
git-secret: abort: no public keys for users found. run 'git secret tell email@address'.
make[1]: *** [.make/01-00-application-setup.mk:57: git-secret] Error 1
make: *** [.make/01-00-application-setup.mk:69: secret-decrypt] Error 2
Enter fullscreen mode Exit fullscreen mode

注意:请记住也要轮换使用不同的秘密

优点和缺点

专业版

  • 准入门槛极低:
    • 无需第三方服务
    • 由于密钥直接位于代码库中,因此易于集成到现有代码库中。
    • 所有操作都可以通过 Docker 完成(无需额外的本地软件)。
  • 设置完成后,使用起来非常简单方便,并且可以集成到团队工作流程中。
  • 密钥更改在合并之前可以进行审核。
    • 这样可以减少部署过程中的失误。
  • “所有内容”都在存储库中,这带来了许多熟悉的便利,例如
    • 版本控制
    • git pull只需一个组件即可获得一切(=>良好的开发体验)

缺点

  • 入职和离职期间的一些额外费用
  • 密钥必须放在仓库的根目录中。./secret.gpg
  • 没有针对不同密钥的细粒度权限控制,例如,生产环境和测试环境的 MySQL 密码不能区别对待。
    • 如果有人能破解秘密,那么所有秘密都会暴露。
  • 如果密钥泄露,所有秘密都会泄露。
    • => 可以通过在密钥上使用口令来(在一定程度上)缓解这个问题
    • => 这对于任何其他存储密钥的系统来说也基本适用,但第三方可能会实施额外的措施,例如多因素身份验证。
  • 密钥会根据拥有访问权限的用户进行版本控制,也就是说,即使某个用户在某个时候被移除,他仍然可以解密先前版本的加密密钥。

总结

恭喜你,你成功了!如果还有什么不清楚的地方,请随时留言。现在你可以加密和解密秘密文件,以便将它们直接存储在 Git 仓库中。

在本教程的下一部分中,我们将为Github 和 Gitlab 上的 dockerized PHP 应用程序设置 CI 流水线,该流水线会解密所有必要的密钥,然后运行我们的测试和 qa 工具。

请订阅RSS源通过电子邮件接收通知,以便在下一部分发布时收到自动通知 :)

文章来源:https://dev.to/pascallandau/use-git-secret-to-encrypt-secrets-in-the-repository-tutorial-part-6-53p5