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 addenn 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

Antworten auf die Frage(0)

Ihre Antwort auf die Frage