ansible-vault命令的特殊之处在于它不是幂等的(它每次在相同的数据上调用它时,都会创建一个不同的二进制文件。)
我从此博客页面建议的实现开始。不幸的是,它无法正常工作,因为每当调用smudge时(无论是git checkout还是git status),秘密文件的git看起来都是经过修改的,即使不是git。
所以我想知道git是否会将他在索引中的二进制文件与干净的过滤后的当前文件进行比较,所以我尝试建立在如下脚本上:
#!/bin/sh -x
# clean filter, it is invoked with %f
if [ ! -r "$HOME/.vault_password" ]; then
exit 1
fi
tmp=`mktemp`
cat > $tmp
# get the plain text from the binary in the index
tmphead=`mktemp`
git show HEAD: > $tmphead
contenthead=`echo "embedded" | ansible-vault view $tmphead --vault-password-file=$HOME/.vault_password`
export PAGER=cat
echo -n "$contenthead" | tee $tmphead
# if current and index plain text version differ
if [ "`md5sum $tmp | cut -d' ' -f1`" != "`md5sum $tmphead | cut -d' ' -f1`" ]; then
tmpcrypt=`mktemp`
cp $tmp $tmpcrypt
# generate a new crypted blob
echo "embedded" | ansible-vault encrypt $tmpcrypt --vault-password-file=$HOME/.vault_password > /dev/null 2>&1
cat "$tmpcrypt"
else
# just return the HEAD version
cat "$tmphead"
fi
rm $tmp $tmphead $tmpcrypt
这里的区别在于,它试图比较纯文本(未加密)秘密文件的当前版本和HEAD版本,并且只有在它们不同的情况下,才会输出新的二进制blob用ansible-vault加密。
不幸的是,此更改之后git继续认为秘密文件总是被修改。即使在再次
git add
文件后,计算出git blob后,git仍认为文件不同,然后将更改提交到提交中。请注意,git diff
会按原样返回空更改。作为参考,这是污点:
#!/bin/sh
if [ ! -r "$HOME/.vault_password" ]; then
exit 1
fi
tmp=`mktemp`
cat > $tmp
export PAGER='cat'
CONTENT="`echo "embedded" | ansible-vault view "$tmp" --vault-password-file=$HOME/.vault_password 2> /dev/null`"
if echo "$CONTENT" | grep 'ERROR: data is not encrypted' > /dev/null; then
echo "Looks like one file was commited clear text"
echo "Please fix this before continuing !"
exit 1
else
echo -n "$CONTENT"
fi
rm $tmp
,这是差异:
#!/bin/sh
if [ ! -r "$HOME/.vault_password" ]; then
exit 1
fi
export PAGER='cat'
CONTENT=`echo "embedded" | ansible-vault view "" --vault-password-file=$HOME/.vault_password 2> /dev/null`
if echo "$CONTENT" | grep 'ERROR: data is not encrypted' > /dev/null; then
cat ""
else
echo "$CONTENT"
fi
#1 楼
这里的问题是由ansible-vault加密中的随机盐引起的。您可以修改VaultEditor类,以将ansible-vault中的参数传递给盐。此行上的lib/ansible/parsing/vault/__init__.py
中会生成随机盐。从lib / ansible / cli / vault.py中调用它,您可以在其中轻松添加固定盐的参数。如果确实要更改它,请向Ansible提交上游补丁,我很乐意使用它。有关此问题的更多信息,请参阅黑客新闻。还有其他采用固定方式的工具的实现,即gitcrypt,transcrypt。这也是使用ansible-vault的另一种实现的链接,称为ansible-vault-tools,但据我所知,这也存在相同的问题。
评论
如果您检查代码,我正在使用校验和来解决可变盐问题,即。首先,在tmp文件夹中解密HEAD保险库,并在生成新的二进制Blob之前比较纯文本文件的校验和。有点慢,但实际上还可以。我的问题是现在合并。在某些情况下它可以工作,在其他情况下,我可以将blob自动合并,然后才能对其解密并破坏。
–ᴳᵁᴵᴰᴼ
17 Mar 14 '17在8:29
如果您查看我链接的三个示例,那么在合并中也有一些解决方法。黑客新闻评论中也对此进行了讨论。
–吉里·克劳达(Jiri Klouda)
17年3月14日在13:53
BTW合并非常棘手。您需要意识到的是,如果您在合并过程中选择了所有更改或从上游选择所有更改,则git会通过哈希比较来解决这一问题,如果盐正确的话,它将起作用。临时文件不足以进行清理/涂抹。您需要在合并时执行相同的操作,如果发生非冲突合并,请从git中检出正确的已加密版本,并使用该版本而不是使用新的随机盐重新加密。
–吉里·克劳达(Jiri Klouda)
17-3-14在13:58
不知道我明白你在说什么;合并将在保管库的纯文本上进行(通过差异进行),并且即使对于自动合并,也始终将机密标记为冲突,因此不会在任何合并提交中包含合并的重新加密的机密,真的代表一个问题(对我而言)。
–ᴳᵁᴵᴰᴼ
17 Mar 14 '17 at 16:51
自从写了这个答案以来,有人确实提交了补丁以使保险库加密具有确定性,但是好像讨论已经结束了一段时间。
–幼虫
20-10-12在18:30
评论
我已更新了脚本,这些脚本的行为正常,但当git试图自动合并文件库上的冲突时,我会在不久后发布在海上扔瓶子,但是:由于行尾不同或代码页不同,文件是否可能不同?
我会尝试从污迹回显中删除-n,但这是一个猜测。没有git diff的隐藏选项,告诉它忽略单行结尾吗?
还有一个想法:github.com/dellis23/ansible-toolkit(这一天我会更深入地研究)