Utilizza filtri puliti / sfumati per i segreti di Vault


20

Sto cercando di installare il filtro clean / smudge in git per avere la crittografia e la decrittografia automatica dei file contenenti segreti tramite il comando ansible-vault .

La particolarità del comando ansible-vault è che non è idempotente (crea un binario diverso ogni volta che viene invocato sugli stessi dati).

Ho iniziato con l'implementazione suggerita in questa pagina del blog . Sfortunatamente non ha funzionato correttamente, come ogni volta che viene chiamato smudge (sia esso un checkout git, o solo lo stato git), i file segreti sembrano modificati per git, anche se non lo sono.

Quindi mi chiedevo se git avrebbe confrontato il file binario che aveva nell'indice con il file corrente filtrato pulito, e ho provato a costruire su quegli script come segue:

#!/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

La differenza qui è che tenta di confrontare le versioni correnti e HEAD dei file segreti di testo semplice (non crittografati) e solo nel caso in cui differiscano generano un nuovo BLOB binario crittografato con ansible-vault.

Sfortunatamente, dopo questa modifica git continua a pensare che il file segreto sia sempre modificato. Anche dopo aver git addreindirizzato il file, in modo che il blob git sia calcolato, git pensa che il file sia diverso e lascia che la modifica entri nel commit. Si noti che git diffrestituisce modifiche vuote, come dovrebbe.

Per riferimento, questo è sbavatura:

#!/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

e questo è 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

Ho degli script aggiornati che si comportano correttamente tranne quando Git tenta di far emergere conflitti sui depositi che pubblicherò a breve
ᴳᵁᴵᴰᴼ

1
Lanciare una bottiglia al mare ma: il file potrebbe essere diverso a causa di diversi finali di linea o di una tabella codici diversa?
Tensibai,

Proverei a rimuovere l' -neco dell'eco, ma è una supposizione. Nessuna opzione nascosta per git diff che gli dice di ignorare le terminazioni a riga singola?
Tensibai,

Ancora un'altra idea: github.com/dellis23/ansible-toolkit (un giorno approfondirò più approfonditamente)
Tensibai

Risposte:


8

Il problema qui è causato dal salt casuale nella crittografia ansible-vault. Puoi hackerare la classe VaultEditor per passargli il sale da un argomento in ansible-vault. Il sale casuale viene generato lib/ansible/parsing/vault/__init__.pysu questa linea . Si chiama da lib / ansible / cli / vault.py dove è possibile aggiungere facilmente l'argomento per salt fisso. Se lo cambi, ti preghiamo di inviare una patch upstream ad Ansible, mi piacerebbe usarlo.

Questo problema è ulteriormente discusso qui sulle notizie degli hacker . E ci sono altre implementazioni con strumenti che prendono sale fisso, vale a dire gitcrypt , transcrypt . Qui c'è anche un collegamento a un'altra implementazione che utilizza ansible-vault chiamato ansible-vault-tools , ma questo ha lo stesso problema di sale per quanto ne so.


Se controlli il codice, sto usando una somma di controllo per risolvere il problema relativo alla variabile salt, ad es. decifrare prima il vault HEAD in una cartella tmp e confrontare i checksum dei file di testo normale prima di generare il nuovo BLOB binario. È un po 'lento ma in realtà va bene. Il mio problema è sulle fusioni ora; in alcune situazioni funziona, in altre ottengo il BLOB automatizzato prima di poterlo decrittografare e si rompe.
ᴳᵁᴵᴰᴼ

Se guardi ai tre esempi che ho collegato, ci sono anche alcune soluzioni alternative alle fusioni. E si sta discutendo anche nei commenti sulle notizie degli hacker.
Jiri Klouda,

BTW La fusione è complicata. Quello che devi capire è che nel caso in cui prendessi tutte le modifiche o tutte le modifiche dall'upstream durante l'unione, git avrebbe capito attraverso il confronto hash, che avrebbe funzionato se il sale fosse giusto. Il file temporaneo non è sufficiente su clean / smudge. Dovresti fare lo stesso su merge e in caso di merge unge check out la corretta versione già crittografata da git e utilizzare quella invece di ricodificare con nuovo salt casuale.
Jiri Klouda,

Non sono sicuro di aver capito cosa stai dicendo qui; la fusione avverrebbe sul semplice testo delle volte (mentre passa attraverso la diff), e avere i segreti sempre contrassegnati come un conflitto anche per le fusioni automatiche, includendo così un segreto re-crittografato unito all'interno di qualsiasi commit di unione, non rappresentano davvero un problema (per me).
ᴳᵁᴵᴰᴼ

Puoi quindi essere specifico sui problemi di unione? È necessario fornire un caso riproducibile. Ma suggerirei ancora di cercare idee nei 3 progetti sopra menzionati. Per quanto riguarda i problemi di fusione, quando unisci il contenuto A con il contenuto B e tutti hai deciso di prendere sempre A o sempre B, per i sistemi di controllo della versione che è un caso speciale e talvolta lo faranno collegando insieme la versione. Git lo fa attraverso l'hash sul contenuto, quindi supporrà che l'hash sia lo stesso, ma se si ricrittografa, anche se il contenuto è tutto A, l'hash non sarà lo stesso. Ma potresti avere altri problemi
Jiri Klouda
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.