一千萬個為什麽

搜索

Git clean/smudge過濾器用於保存秘密



我正在嘗試在git中設置清潔/塗抹過濾器通過 ansible-vault 自動加密和解密包含秘密的文件>命令。

ansible-vault命令的獨特之處在於它不是冪等的(每當它在同一數據上被調用時它會創建一個不同的二進制)。

我從此博客頁面中建議的實施開始。不幸的是,它無法正常工作,因為每當調用汙點時(無論是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

轉載註明原文: Git clean/smudge過濾器用於保存秘密

一共有 1 個回答:

這裏的問題是由anault-vault加密中的隨機salt造成的。你可以破解VaultEditor類,通過anault-vault中的參數將salt傳遞給它。隨機salt在 lib/ansible/parsing/vault/__ init __。py 上生成行。它從 lib/ansible/cli/vault中調用.py ,您可以在其中輕松添加固定鹽的參數。如果你確實改變了它,請向Ansible提交一個上遊補丁,我很樂意使用它。

這個問題將在黑客新聞中進一步討論。另外還有一些工具可以采用固定鹽,即 gitcrypttranscrypt 。這裏還有一個鏈接,指向使用名為 ansible-vault-tools ,但據我所知,這個鹽問題相同。