一尘不染

如何将我的秘密密钥和密码安全地保存在版本控制系统中?

django

我在版本控制系统中保留了重要的设置,例如开发和生产服务器的主机名和端口。但是我知道,将秘密(例如私钥和数据库密码)保存在VCS存储库中是一种不好的做法。

但是密码-像其他设置一样-似乎应该进行版本控制。那么保持密码版本控制的正确方法是什么?

我想这将涉及保持秘密,在自己的“秘密设置”文件,并有该文件的加密和版本控制。但是什么技术呢?以及如何正确执行此操作?有没有更好的方法可以完全解决这个问题?

我通常会问这个问题,但是在我的特定实例中,我想使用git和github存储Django / Python站点的秘密密钥和密码。

同样,当我使用git推/拉时,理想的解决方案也会做一些神奇的事情-例如,如果加密的密码文件更改了运行的脚本,该脚本会要求输入密码并将其解密到位。

编辑:为清楚起见,我正在询问在哪里存储的生产秘密。


阅读 405

收藏
2020-03-29

共1个答案

一尘不染

你完全想在保持版本控制的同时加密敏感设置文件是正确的。正如你提到的,最好的解决方案是Git在推送某些敏感文件时透明地对其进行加密,以便在本地(即在拥有证书的任何机器上)可以使用设置文件,但Git或Dropbox或任何人使用将文件存储在VC下不能读取纯文本信息。

推/拉期间的透明加密/解密教程

这个要点https://gist.github.com/873637显示了有关如何使用Git的sms / clean过滤器驱动程序和openssl来透明地加密推送文件的教程。你只需要进行一些初始设置即可。

工作原理摘要

你基本上将创建一个.gitencrypt包含3个bash脚本的文件夹,

clean_filter_openssl 
smudge_filter_openssl 
diff_filter_openssl 

Git用于解密,加密和支持Git差异。在这些脚本中定义了主密码和盐(已修复!),你必须确保.gitencrypt从未被实际推送。示例clean_filter_openssl脚本:

#!/bin/bash

SALT_FIXED=<your-salt> # 24 or less hex characters
PASS_FIXED=<your-passphrase>

openssl enc -base64 -aes-256-ecb -S $SALT_FIXED -k $PASS_FIXED

smudge_filter_open_ssl和类似diff_filter_oepnssl。参见要点。

你的带有敏感信息的仓库应该有一个.gitattribute文件(未加密并包含在仓库中),该文件引用.gitencrypt目录(其中包含Git透明地加密/解密项目所需的所有内容),并且该文件存在于本地计算机上。

.gitattribute 内容:

* filter=openssl diff=openssl
[merge]
    renormalize = true

最后,你还需要将以下内容添加到.git/config文件中

[filter "openssl"]
    smudge = ~/.gitencrypt/smudge_filter_openssl
    clean = ~/.gitencrypt/clean_filter_openssl
[diff "openssl"]
    textconv = ~/.gitencrypt/diff_filter_openssl

现在,当你将包含敏感信息的存储库推送到远程存储库时,文件将被透明加密。当你从具有.gitencrypt目录(包含密码)的本地计算机中提取文件时,文件将被透明解密。

笔记

我应该注意,本教程没有描述仅加密敏感设置文件的方法。这将透明地加密推送到远程VC主机的整个存储库,并解密整个存储库,以便在本地对其进行完全解密。为了实现所需的行为,你可以将一个或多个项目的敏感文件放在一个sensitive_settings_repo中。如果你确实需要将敏感文件存储在同一存储库中,则可以调查此透明加密技术如何与Git子模块http://git-scm.com/book/en/Git-Tools-Submodules一起使用。

如果攻击者可以访问许多加密的存储库/文件,则从理论上讲,使用固定的密码短语可能会导致暴力破解漏洞。海事组织,这种可能性非常低。如本教程底部所述,未使用固定密码短语将导致不同机器上的本地回购版本始终显示“ git status”已发生更改。

2020-03-29