Ansible tonoz sırları için Git temizleme / bulaşma filtreleri


20

Otomatik şifreleme ve ansible tonoz komutu aracılığıyla sırları içeren dosyaların şifresini çözmek için git temiz / bulaşma filtresi kurmaya çalışıyorum .

Ansible tonoz komutunun özelliği, idempotent olmamasıdır (aynı veride her çağrıldığında farklı bir ikili oluşturur).

Bu blog sayfasında önerilen uygulama ile başladım . Ne yazık ki, lekelenme çağrıldığında (bir git kasası veya sadece git durumu olsun), gizli dosyalar gitmemiş olsa bile, git için değiştirilmiş gibi görünüyor.

Bu yüzden git o dizinde sahip ikili ikili temiz filtrelenmiş geçerli dosya ile karşılaştırmak olup olmadığını merak ettim ve ben aşağıdaki gibi bu komut dosyası üzerinde inşa etmeye çalıştı:

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

Buradaki fark, düz metin (şifrelenmemiş) gizli dosyaların mevcut ve HEAD sürümlerini karşılaştırmaya çalışması ve yalnızca farklı olmaları durumunda ansible tonoz ile şifrelenmiş yeni bir ikili blob çıkarmasıdır.

Ne yazık ki, bu değişiklikten sonra git gizli dosyanın her zaman değiştirildiğini düşünmeye devam ediyor. git addGit blobunun hesaplanması için dosyayı yeniden girdikten sonra bile git, dosyanın farklı olduğunu düşünür ve değişikliğin işleme alınmasına izin verir. git diffBoş değişiklikleri gerektiği gibi döndürdüğünü unutmayın .

Referans için, bu leke:

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

ve bu farktır:

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

Git kısa süre sonra yayınlayacağım kasalardaki çakışmaları otomatikleştirmeye çalıştığında, doğru davranan komut dosyalarını güncelledim
ᴳᵁᴵᴰᴼ

1
Denizde bir şişe atmak ama: dosya farklı satır sonları veya farklı kod sayfası nedeniyle farklı olabilir mi?
17'de Tensibai

-nLekeyi yankıdan çıkarmayı denerdim , ama bu bir tahmin. Git diff için tek satır sonlarını yoksaymasını söyleyen gizli bir seçenek yok mu?
Tensibai

Yine başka bir fikir: github.com/dellis23/ansible-toolkit (Bu bir gün daha derinlemesine inceleyeceğim)
Tensibai

Yanıtlar:


8

Buradaki sorun ansible tonoz şifrelemesindeki rastgele tuzdan kaynaklanıyor. VaultEditor sınıfını, tuzu ansible tonozdaki bir argümandan geçirmek için hackleyebilirsiniz. Rastgele tuz lib/ansible/parsing/vault/__init__.pybu hatta üretilir . Bu çağrılır lib / yanıtlayıcı '/ cli / vault.py kolayca sabit tuz için argüman ekleyebileceğiniz. Bunu değiştirirseniz, lütfen Ansible'a yukarı doğru bir yama gönderin, kullanmak isterim.

Bu sorun burada hacker haberlerinde daha ayrıntılı olarak ele alınmaktadır . Sabit tuz alan, gitcrypt , transcrypt gibi araçlarla başka uygulamalar da var . Burada ayrıca, ansible-tonoz araçları adı verilen ansible tonoz kullanan bir uygulama daha vardır , ancak bu, bildiğim kadarıyla aynı tuz sorununa sahiptir.


Kodu kontrol ederseniz, değişken tuz sorunu, yani geçici bir çözüm için bir sağlama toplamı kullanıyorum. önce bir tmp klasöründeki HEAD kasasının şifresini çözün ve yeni ikili bloğu oluşturmadan önce düz metin dosyalarının sağlama toplamlarını karşılaştırın. Bu biraz yavaş ama aslında tamam. Benim sorunum şimdi birleşmelerde; Bazı durumlarda işe yarıyor, diğerlerinde ise şifresini çözmeden önce blobun otomatik hale getirilmesini sağlıyor ve kırılıyor.
ᴳᵁᴵᴰᴼ

Bağlantı verdiğim üç örneğe bakarsanız, birleşmelerde de bazı geçici çözümler vardır. Ve hacker haber yorumlarında da tartışılıyor.
Jiri Klouda

BTW Birleştirme zor. Gerçekleştirmeniz gereken şey, birleştirme sırasında tüm değişikliklerinizi veya yukarı akıştan tüm değişikliklerinizi seçmeniz durumunda git, tuz doğru olduğunda işe yarayacak olan karma karşılaştırma yoluyla anlayacaktır. Temp dosyası temiz / bulaşmaya yeterli değil. Birleştirme işleminde aynı şeyi yapmanız gerekir ve çakışma olmayan birleştirme kasası durumunda git'ten doğru şifrelenmiş sürümü doğru olarak kullanmanız ve bunu yeni rastgele tuzla yeniden şifrelemenin aksine kullanmanız gerekir.
Jiri Klouda

Burada ne dediğini anladığımdan emin değilim; tonozların düz metninde birleşme olur (farklılaştıkça) ve sırların otomatik birleştirme için bile her zaman bir çatışma olarak işaretlenmesi, böylece herhangi bir birleştirme taahhüdünde birleştirilmiş yeniden şifrelenmiş sırlar dahil olmak, gerçekten bir problemi temsil ediyor (benim için).
ᴳᵁᴵᴰᴼ

Bu durumda birleştirme sorunlarına özgü olabilir misiniz? Tekrarlanabilir kasa sağlamalısınız. Ancak yine de yukarıda belirtilen 3 projeyle ilgili fikir aramayı öneririm. Birleştirme sorunlarına gelince, A içeriğini B içeriği ile birleştirdiğinizde ve özel bir durum olan sürüm kontrol sistemleri için hep A veya her zaman B almaya karar verdiğinizde, bazen sürümü birbirine bağlayarak bunu yaparlar. Git bunu içerikteki karma yoluyla yapar, bu nedenle karma aynı olacağını varsayar, ancak yeniden şifrelerseniz, içerik A'nın tamamı olsa bile karma aynı olmaz. Ama başka bir sorun olabilir
Jiri Klouda
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.