用于安全保险库秘密的Git清洁/涂抹过滤器

时间:2016-06-06 14:30:34

标签: git ansible gitattributes ansible-vault

我正在尝试在git中设置clean/smudge filter以通过ansible-vault命令自动加密和解密包含机密的文件。

ansible-vault命令的特性是它不是幂等的(每次在同一数据上调用时它会创建不同的二进制文件)。

我从this blog page中建议的实施开始。不幸的是它无法正常工作,因为无论何时调用涂抹(无论是git checkout还是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:$1 > $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版本,并且仅在它们不同的情况下输出一个用ansible-vault加密的新二进制blob。

不幸的是,在这个改变之后,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 "$1" --vault-password-file=$HOME/.vault_password 2> /dev/null`

if echo "$CONTENT" | grep 'ERROR: data is not encrypted' > /dev/null; then
  cat "$1"
else
  echo "$CONTENT"
fi

0 个答案:

没有答案