Ich versuche, einen Clean / Smudge-Filter in Git einzurichten, um Dateien, die Geheimnisse enthalten, automatisch durch den Befehl ansible-vault zu verschlüsseln und zu entschlüsseln .
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 auf dieser Blog-Seite vorgeschlagenen Implementierung begonnen . 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) geheimen Dateien im Klartext zu vergleichen, und nur dann, wenn sie sich unterscheiden, ein neues mit ansible-vault verschlüsseltes Binär-Blob ausgegeben wird.
Leider glaubt git nach dieser Änderung weiterhin, dass die geheime Datei immer geändert wird. Auch nachdem git add
die Datei erneut erstellt wurde, sodass der Git-Blob berechnet wird, denkt Git, dass die Datei anders ist, und lässt die Änderung in das Festschreiben übergehen. Beachten Sie, dass git diff
leere Änderungen wie gewünscht zurückgegeben werden.
Als Referenz ist dies 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
quelle
-n
Fleck-Echo zu entfernen , aber das ist eine Vermutung. Keine versteckte Option für git diff, um einzelne Zeilenenden zu ignorieren?Antworten:
Das Problem wird hier durch das zufällige Salt bei der Ansible-Vault-Verschlüsselung verursacht. Sie können die VaultEditor-Klasse hacken, um das Salt von einem Argument in Ansible-Vault an sie weiterzuleiten. Das zufällige Salz wird in
lib/ansible/parsing/vault/__init__.py
dieser Zeile erzeugt . Es wird von lib / ansible / cli / vault.py aufgerufen, wo Sie leicht das Argument für Fixed Salt hinzufügen können. Wenn Sie es ändern, senden Sie bitte einen Upstream-Patch an Ansible. Ich würde ihn gerne verwenden.Dieses Problem wird hier in den Hacker-News weiter diskutiert . Und es gibt andere Implementierungen mit Werkzeugen , das Salz Fest nehmen, nämlich gitcrypt , Transcrypt . Hier ist auch ein Link zu einer weiteren Implementierung mit ansible-vault namens ansible-vault-tools , aber diese hat meines Wissens das gleiche Salt-Problem.
quelle