Git仓库加密的建议 – git-secret –
首先
最近,我已经发布了一篇名为“开始使用git-secrets”的文章。git-secrets是一种工具,目的是防止包含API密钥等机密信息的文件被错误提交到git仓库中。然而,还存在一个非常相似的名为git-secret(没有s)的工具。git-secret(没有s)是一个采用完全不同方法的bash工具,它的思想是安全地上传秘密信息到git仓库。在本文中,我将概述一下git-secret。
Q: git-secret有什么功能?
A: 通过加密指定文件,并只允许授权人解密,可以通过公共git存储库共享保密信息。
因此,git-secret所做的事情相对简单,以下简要概括如下。
-
- 首先,指定要加密的文件,并通过将该文件添加到.gitignore中来防止其再次提交到存储库中。
-
- 作为加密设置,导入对方的GPG公钥。
-
- 使用GPG进行公钥加密。
- 将加密后的文件与共享目标信息一起添加到git并进行commit/push。
与”防止数据泄漏的边界防护策”这一概念不同的是,git-secrets是一种工具,它更进一步考虑了在采取防护措施之前应该考虑的因素。换句话说,它通过使用加密手段来实现在git中不提交包含机密信息的文件。
准备
为了实际使用并确认其操作,我们将进行准备工作。在这里,我们将假设使用macOS X或*nix操作系统。此外,git-secret是一个基于bash的工具,因此我们将假设使用bash。
GPG的安装
git-secret利用GnuPG (GPG) 进行加密和解密操作。因此,如果未安装GPG,则需要进行准备。这里不再详细介绍GPG本身。可以在Qiita上找到关于GPG的优秀文章,可以参考。
请安装GPG套件。
在 macOS X 中,您可以安装 GPG Suite。如果您不需要 GPG Suite 中的 GPG Mail,可以选择删除它。您也可以使用 Homebrew 进行安装。
$ brew install gnupg
对于*nix系统,请使用您喜欢的软件包管理工具或从源代码安装。对于Debian/Ubuntu系统,您可以使用以下方法进行安装。
$ sudo apt-get install gnupg
生成GPG密钥
接下来,我们将生成自己的GPG公钥和私钥对。打开控制台,执行”gpg –gen-key”命令,您可以以交互方式生成GPG密钥对如下。请确保指定的电子邮件地址与git的user.email指定的地址相同。这是因为在git-secret中,user.email的默认设置是将访问权限授予自己。如果在安装了GPG Suite的macOS X上,您也可以通过GPG Keychain.app通过GUI生成。
$ gpg --gen-key
gpg (GnuPG/MacGPG2) 2.2.10; Copyright (C) 2018 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Note: Use "gpg --full-generate-key" for a full featured key generation dialog.
GnuPG needs to construct a user ID to identify your key.
Real name: Test User
Email address: xxxx@xxxxxx.org
You selected this USER-ID:
"Test User <xxxx@xxxxxx.org>"
Change (N)ame, (E)mail, or (O)kay/(Q)uit? O
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: key 028D26D9DF49446A marked as ultimately trusted
gpg: revocation certificate stored as '/Users/xxx/.gnupg/openpgp-revocs.d/041E87E64316B3685E352B0B028D26D9DF49446A.rev'
public and secret key created and signed.
pub rsa2048 2018-10-25 [SC] [expires: 2020-10-24]
041E87E64316B3685E352B0B028D26D9DF49446A
uid Test User <xxxx@xxxxxx.org>
sub rsa2048 2018-10-25 [E] [expires: 2020-10-24]
让我们使用 “gpg –list-keys” 命令来确认密钥是否正确导入。
$ gpg --list-keys
/Users/xxx/.gnupg/pubring.kbx
-----------------------------
pub rsa2048 2018-10-25 [SC] [expires: 2020-10-24]
041E87E64316B3685E352B0B028D26D9DF49446A
uid Test User <xxxx@xxxxxx.org>
sub rsa2048 2018-10-25 [E] [expires: 2020-10-24]
一旦达到上述状态,GPG的准备工作就完成了。
安装git-secret
对于macOS X,可以通过homebrew进行安装。
$ brew install git-secret
除非有其他情况,否则可以从源代码进行安装。它还兼容apt和rpm。4
$ git clone https://github.com/sobolevn/git-secret.git
$ cd git-secret && make build
$ PREFIX="/usr/local" make install
简单的使用方法 de
首先,让我们通过使用一个仅允许自己访问机密信息的示例,简单介绍一下使用方法。我们将在名为”./git-secret”的测试目录中创建一个git仓库来进行说明。
$ mkdir git-secret
$ cd git-secret
$ git init
首先,使用git secret init命令生成.gitsecret目录。
$ git secret init
'/Users/xxx/git-secret/.gitsecret/' created.
cleaning up...
.gitsecret目录包含加密文件的设置以及可进行解密的公钥等信息。如果不与允许访问这些信息的人共享,那么数据就无法解密,因此需要进行git add操作。从安全角度来看,.gitsecret的公开不会影响要实际保护的文件的安全性,但是需要注意加密文件的名称不是秘密的。
$ git add .gitsecret
首先确保只有自己能够解密,给予自己的电子邮件地址(例如xxx@xxxxxx.org)访问权限。同时,请确保git的user.email正确地指定为自己的电子邮件地址。
$ git secret tell -m
gpg: keybox '/Users/xxx/git-secret/.gitsecret/keys/pubring.kbx' created
gpg: /Users/xxx/git-secret/.gitsecret/keys/trustdb.gpg: trustdb created
done. xxx@xxxxxx.org added as someone who know(s) the secret.
cleaning up...
要查找在这个存储库中设置的 git-secret 中谁被允许访问,需要执行 git secret whoknows 命令。
$ git secret whoknows
xxx@xxxxxx.org
我意识到只有我自己可以访问。
接下来,生成一个包含秘密信息的文件,并将其配置为使用git-secret进行隐藏。生成secret.txt文件并添加到.gitignore中,使用git secret add将其设置为git-secret。如果不将其注册到.gitignore中,后续的加密过程会出现错误。
$ echo "this is my secret" > secret.txt
$ echo "secret.txt" > .gitignore
$ git secret add secret.txt
1 item(s) added.
运行git secret hide命令后,通过git secret add命令设置的文件将被加密,并生成扩展名为.secret的文件。
$ git secret hide
done. all 1 files are hidden.
$ ls
secret.txt secret.txt.secret
在这种情况下,通过git的远程存储库共享的内容将是扩展名为.secret的加密文件本体,除了.gitsecret目录。因此,我们可以将secret.txt.secret添加到git并进行提交。之后,请设置远程存储库并尝试推送。
$ git add secret.txt.secret .gitsecret
$ git commit -m 'initial secret commit'
$ git remote add origin https://github.com/xxxxxx/x.......git
$ git push -u origin master
让我们尝试从推送到远程仓库的另一个目录中进行git克隆,并查看能否获取到secret.txt。尽管我们不太确定secret.txt.secret的内容,但可以通过cat命令查看它的内容,发现它不是原始文本,而是加密文本。
$ mkdir -p git-secret-clone
$ git clone https://github.com/xxxxxx/x.......git git-secret-clone
$ cd git-secret-clone
$ ls
. .. .git .gitignore .gitsecret secret.txt.secret
$ cat secret.txt.secret
要解密secret.txt文件,需要运行git secret reveal命令。这将对所有被git-secret加密的文件使用与自己的gpg公钥相对应的私钥进行解密操作。
$ git secret reveal
done. all 1 files are revealed.
$ ls
. .. .git .gitignore .gitsecret secret.txt secret.txt.secret
$ cat secret.txt
this is my secret
在生成GPG密钥对时,您将被要求输入设置的密码,并且成功解密了。
接下来,既然我们有了一个Git存储库,那么就让我们来更新并提交秘密信息文件吧。一旦我们更新了秘密信息文件,我们需要再次运行”git secret hide”来重新加密文件,并更新加密文件,然后再进行提交。
$ echo 'updated' >> secret.txt
$ cat secret.txt
this is my secret
updated
$ git commit -a -m 'updated'
[master 5631f69] updated
1 file changed, 0 insertions(+), 0 deletions(-)
rewrite secret.txt.secret (100%)
$ git push
通过返回原始目录进行git pull和git secret reveal的操作,可以发现更新的秘密信息文件也可以通过远程仓库获取。
$ cd ../git-secret
$ git pull
remote: Counting objects: 5, done
remote: Finding sources: 100% (3/3)
remote: Getting sizes: 100% (3/3)
remote: Total 3 (delta 1), reused 3 (delta 1)
Unpacking objects: 100% (3/3), done.
From https://github.com/xxxxxx/x.......
7dea230..5631f69 master -> origin/master
Updating 7dea230..5631f69
Fast-forward
secret.txt.secret | Bin 1409 -> 1416 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
$ git secret reveal
File '/Users/xxx/git-secret/secret.txt' exists. Overwrite? (y/N) y
done. all 1 files are revealed.
$ cat secret.txt
this is my secret
updated
你能够理解通过git存储库进行秘密信息的交流的概念吗?在下一节中,我们将介绍如何在假设多个用户共享git-secret目录和存储库的情况下,进行更加详细的操作,包括添加或删除可以访问秘密信息的用户。
多个用户之间共享机密信息
添加可访问用户
从您想授予访问权限的人那里,通过电子邮件等方式获取他们的GPG公钥。将该密钥保存为适当的文件,并导入到您的本地GPG密钥存储库~/.gnupg/中。获取所有要添加的收件人的密钥,并重复这个过程。
$ gpg --import member_public_key.pub
执行gpg –list-keys命令后,您可以确认自己的密钥以及对方的密钥已正确导入。
$ gpg --list-keys
/Users/xxx/.gnupg/pubring.kbx
-----------------------------
pub rsa2048 2018-10-25 [SC] [expires: 2020-10-24]
041E87E64316B3685E352B0B028D26D9DF49446A
uid Test User <xxxx@xxxxxx.org>
sub rsa2048 2018-10-25 [E] [expires: 2020-10-24]
pub rsa4096 2018-10-25 [SC] [expires: 2022-10-25]
DE22B0EC5E6A5B7B0E6D4FF871AF954BA86FDEED
uid [ unknown] Test User2 <yyyy@yyyy.org>
sub rsa4096 2018-10-25 [E] [expires: 2022-10-25]
在设置了git-secret的git库目录中,尝试为该用户的邮箱地址(例如,yyyy@yyyy.org)赋予访问权限。
$ git secret tell yyyy@yyyy.org
done. yyyy@yyyy.org added as someone who know(s) the secret.
$ git secret whoknows
xxxx@xxxxxx.org
yyyy@yyyy.org
我们已经了解到,两个人被赋予了访问权限。我们将为每个被授权用户重复这个添加访问权限的过程。
具有访问权限的用户可以添加,但此时加密文件仍未更新,并且没有变为所有具有权限的用户都可以访问的状态。因此,需要重新执行git secret hide命令进行再次加密。
$ git secret hide
done. all 1 files are hidden.
$ git commit -a -m 'added yyyy'
[master cf53b2d] added yyyy
3 files changed, 0 insertions(+), 0 deletions(-)
rewrite secret.txt.secret (100%)
$ git push
通过上述操作,yyyy@yyyy.org用户也可以通过克隆该远程仓库来解密并获取secret.txt文件。
用户的过期
我会尝试剥夺yyyy@yyyy.org的访问权限。
$ git secret killperson yyyy@yyyy.org
removed keys.
now [yyyy@yyyy.org] do not have an access to the repository.
make sure to hide the existing secrets again.
$ git secret whoknows
xxxx@xxxxxx.org
在这个阶段,yyyy@yyyy.org还可以对加密文件secret.txt.secret进行解密。因此,就像授予访问权限一样,我们可以使用git secret hide命令对其进行再次加密,以确保无法再次访问远程仓库的文件。
$ git secret hide
done. all 1 files are hidden.
$ git commit -a -m 'revoked yyyy'
[master ec49af1] revoked yyyy
2 files changed, 0 insertions(+), 0 deletions(-)
rewrite secret.txt.secret (100%)
$ git push
需要注意的是,过去的提交中包含了未重新加密的文件。因此,即使用户被撤销,他们也能够回溯提交并解密文件。因此,在撤销用户之后,更新机密信息本身也是很重要的。可以重新发行访问密钥等,并将其覆盖和更新到文件中。
问答
问题:如何查看git-secret的加密设置对象文件列表?
A:可以使用“git secret list”命令来获取列表。
$ git secret list
secret.txt
问:如何解除 git-secret 的加密设置目标?
A: 你可以使用 “git secret remove <文件名>”。
$ git secret remove secret.txt
secret.txt -> secret.txt -> /Users/xxxx/git-secret/secret.txt
removed from index.
ensure that files: [secret.txt] are now not ignored.
cleaning up...
如果在删除之后不需要重新加密,但是在Git仓库中共享原始文件,那么需要进行.gitignore文件的编辑等操作。
问:可以与git-secrets(有s)一起使用吗?
A: 可以的。如果我们制定一个规则,在使用git进行commit之前,必须加密包含有敏感信息的文件以避免被git-secrets检查到,这样不仅可以减少人为错误,还可以通过git共享敏感信息,是不是很好呢?
概述
尽管GPG非常繁琐而且令人困惑,但通过使用git-secret,可以从将服务器访问密钥等机密信息“保持在内部”运营切换到“安全共享”运营,这一点是非常重要的。如果共享访问密钥变得困难,或者方便性受损,我认为考虑引入git-secret可能是个不错的选择。
另外,git-secret的当前版本中
git secret tell後などに必要となるgit secret hideによる再暗号化
git secret addしたファイルの.gitignoreへの追加
需要进行一些繁琐的处理。只需通过编辑git的hooks文件,就可以在执行git commit等操作时自动进行,从而显著改善git-secret的繁琐步骤。首先打算自己编辑并进行一段时间的运用。
参考 : 谨供参考
How to keep your repository’s sensitive data secure using git-secret (Medium)
git-secret (official)
附加内容:关于访问控制
在介绍实际使用方法之后,为了大致理解git-secret(及其背后的GPG)的思想,重要的是先介绍数据访问控制的概念作为额外补充。
在情报安全领域的访问控制中,大致有两种方法。一种是“基于会话的访问控制”,另一种是“基于加密的访问控制”。git-secret是一个利用后者“基于加密的访问控制”概念的应用程序。
会话基础的访问控制
セッションベースのアクセス制御は非常容易理解,其基于诸如ID/密码等的“认证”方式。通过认证,允许主体(例如数据所有者)授予访问权限。
-
- 認証を要求してきた相手は誰なのか
- その相手にどこまでアクセスを許していいのか
在确认之后,我们将与对方建立安全且临时的“会话”,只有通过该会话才能获得对数据的访问权限。像需要用户管理的Web服务一般都是采用这种思路进行访问控制的。更进一步地说,SSL/TLS等协议就是基于这种思路设计的。
基于加密的访问控制
这是一种与基于会话的访问控制完全不同的思想方法。简而言之,基于加密的访问控制是一种“只有允许访问的对象才能正确解密并适当地加密数据进行分发”的方法。换句话说,只要加密数据不被授权的人解密,就可以公开加密数据本身,这种想法。只要不知道数据内容就可以了。
正如您所了解的,git-secret是一个完全符合这一思想的应用程序,它在进行适当加密之后将其存储在git仓库中并公开给全世界。另外,媒体数据也被加密并在内容传递网络(CDN)上进行公开和分发,可以说这种DRM服务是根据我们的理念而创建的,需要购买解密密钥才能解密。
各自的优点和缺点。
我可以尝试将以下内容简单地总结如下。
基于会话的访问控制
-
- pros:
アクセスユーザの追加、失効、権限(アクセス範囲)変更が容易。
cons:
アクセスユーザ管理、認証、セッション管理のインフラ整備が比較的大変。
アクセス制御するデータが1ファイルであったとしても、アクセスユーザ数分のセッション構築・帯域確保が必要。
基于加密的访问控制
-
- pros:
各ユーザの公開鍵を用いて、(適切な暗号アルゴリズムにより) データを暗号化するのみでアクセス制御が可能。
データを復号するために必要なのは、全ユーザで同じ暗号化データとなり、データ再利用性が高い。6
cons:
一度配信してしまったデータに対しては、アクセスユーザの追加、失効、権限変更が困難。7
并不是说哪个好哪个不好,很显然它们各有优缺点。根据使用场景和对数据的访问控制需求,选择合适的是很重要的。
由于git-secrets和git-secret的名称非常相似,为了强调区别,可以使用“无s”和“有s”来进行明确标记。
例如,可以参考以下链接:https://qiita.com/moutend/items/5c22d6e57a74845578f6
在新建中→输入名称和密码→点击“生成”进行生成。
更多安装详情,请查看http://git-secret.io/installation
然而,法律和技术之间存在差异,因此是否适用需要根据具体使用情况而定。例如,根据经济产业省的个人信息保护指南的解释,即使个人信息已经被加密,在数年前个人信息仍然被视为个人信息,因此加密的个人信息数据泄露给外部即被视为个人信息的泄露。有点奇怪。
然而,这取决于加密算法和加密方法的选择。最糟糕的情况是,需要为每个用户准备不同的加密数据。
正如前面所提到的,过去的提交对于已失效的用户仍然是可访问的,而且仅对未来的数据有效,即包括添加、失效和更改等操作。