Git Clean / Smudge-Filter für anfällige Tresorgeheimnisse
Ich versuche, @ einzuricht Filter reinigen / verschmieren in git zum automatischen Ver- und Entschlüsseln von Dateien, die Geheimnisse enthalten, durch ansible-vault Befehl
Die Besonderheit des ansible-vault-Befehls besteht darin, dass er nicht idempotent ist (er erstellt jedes Mal eine andere Binärdatei, wenn er für dieselben Daten aufgerufen wird).
Ich habe mit der Implementierung begonnen, die in @ vorgeschlagen wurddiese Blog-Seite. Leider hat es nicht richtig funktioniert, da bei jedem Aufruf von smudge (sei es eine Git-Prüfung oder nur der Git-Status) die geheimen Dateien wie für git geändert aussehen, auch wenn dies nicht der Fall ist.
Also habe ich mich gefragt, ob git die Binärdatei, die er im Index hat, mit der sauber gefilterten aktuellen Datei vergleichen würde, und ich habe versucht, auf diesen Skripten wie folgt aufzubauen:
#!/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
Der Unterschied besteht darin, dass versucht wird, die aktuelle und die HEAD-Version der (unverschlüsselten) Geheimdateien im Klartext zu vergleichen, und nur dann, wenn sie sich unterscheiden, ein mit ansible-vault verschlüsseltes neues Binär-Blob ausgegeben wird.
Leider glaubt git nach dieser Änderung weiterhin, dass die geheime Datei immer geändert wird. Selbst nachgit add
enn Sie die Datei erneut @en, so dass der Git-Blob berechnet wird, denkt Git, dass die Datei anders ist, und lässt die Änderung in das Commit übergehen. Beachten Sie, dassgit diff
leere Änderungen zurückgeben, wie es sollte.
Zur Referenz ist dies ein Fleck:
#!/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
und das ist diff:
#!/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