使用Git clean/smudge过滤器处理ansible vault secrets

108次阅读
没有评论

问题描述

想要设置Git的clean/smudge过滤器,以便通过ansible-vault命令自动加密和解密包含secrets的文件。ansible-vault命令的特殊之处在于它不是幂等的(每次在相同的数据上调用时都会创建一个不同的二进制文件)。用户已经尝试了一种实现方法,但是在使用smudge时,无论是通过git checkout还是git status,secret文件都会被git标记为已修改,即使实际上并没有修改。用户怀疑git是否在将索引中的二进制文件与当前的clean过滤后的文件进行比较,并尝试根据这些脚本进行修改,但是问题仍然存在。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

问题的根本原因是ansible-vault加密时使用了随机的salt。可以通过修改ansible-vault的代码,从ansible-vault的参数中传递salt。salt是在lib/ansible/parsing/vault/__init__.py文件中生成的,可以在lib/ansible/cli/vault.py文件中添加参数来传递固定的salt。如果你修改了代码,请提交一个上游补丁给Ansible,我很乐意使用它。
这个问题在hacker news上有进一步的讨论。还有其他一些工具可以使用固定的salt,比如gitcrypttranscrypt。这里还有一个使用ansible-vault的实现,叫做ansible-vault-tools,但是据我所知,它也有相同的salt问题。

方案2

请注意以下操作注意版本差异及修改前做好备份。
另一种方法是使用其他工具来处理加密文件,比如gitcrypt或transcrypt。这些工具可以使用固定的salt来加密文件,从而解决ansible-vault随机salt的问题。你可以尝试使用这些工具来代替ansible-vault,并根据你的需求进行配置。
请注意,合并操作可能会比较棘手。当你合并内容A和内容B,并且你已经决定始终选择A或始终选择B时,对于版本控制系统来说,这是一个特殊情况,它们有时会通过将版本链接在一起来处理这种情况。Git通过内容的哈希值来处理这种情况,所以它会假设哈希值是相同的,但是如果你重新加密,即使内容都是A,哈希值也不会相同。如果你遇到合并问题,请提供可重现的案例。另外,你可以参考上面提到的其他项目,可能会有一些解决方案。

方案3

请注意以下操作注意版本差异及修改前做好备份。
根据最新的信息,有人提交了一个补丁,使得vault加密变得确定性。你可以在这里找到相关的讨论。这个补丁已经合并到2.1.5版本中。

正文完