5

ansible-vaultコマンドを使用してシークレットを含むファイルを自動的に暗号化および復号化するために、git でclean/smudge フィルターをセットアップしようとしています。

ansible-vault コマンドの特徴は、べき等ではないことです (同じデータに対して呼び出されるたびに異なるバイナリが作成されます)。

このブログページで提案されている実装から始めました。残念ながら、smudge が呼び出されるたびに ( git checkout であれ、単に git status であれ)、シークレット ファイルは 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 addgit blob が計算されるようにファイルを再度 ing した後でも、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
4

0 に答える 0