Ansible वॉल्ट सीक्रेट्स के लिए क्लीन / स्मज फिल्टर को पकड़ें


20

मैं स्वत: एन्क्रिप्ट और डिक्रिप्ट -वॉल्ट कमांड के माध्यम से युक्त फाइलों को डिक्रिप्ट करने के लिए git में क्लीन / स्मज फिल्टर को सेटअप करने की कोशिश कर रहा हूं ।

Ansible-वॉल्ट कमांड की ख़ासियत यह है कि यह idempotent नहीं है (यह एक ही डेटा पर लागू होने पर प्रत्येक बार एक अलग बाइनरी बनाता है)।

मैंने इस ब्लॉग पृष्ठ में सुझाए गए कार्यान्वयन से शुरू किया । दुर्भाग्य से यह सही ढंग से काम नहीं करता था, जब भी स्मूदी कहा जाता है (यह एक गिट चेकआउट, या सिर्फ गिट स्थिति), गुप्त फ़ाइलों को गिट के लिए संशोधित किया गया दिखता है, भले ही वह ऐसा न हो।

तो मुझे आश्चर्य हुआ कि अगर 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

यहाँ अंतर यह है कि यह सादे पाठ के वर्तमान और प्रमुख संस्करणों (अनएन्क्रिप्टेड) ​​गुप्त फाइलों की तुलना करने की कोशिश करता है, और केवल मामले में वे अलग-अलग नए बाइनरी ब्लॉब को ansible-वॉल्ट के साथ एन्क्रिप्टेड आउटपुट करते हैं।

दुर्भाग्य से, इस परिवर्तन के बाद भी यह सोचना जारी है कि गुप्त फ़ाइल को हमेशा संशोधित किया जाता है। git addफ़ाइल को फिर से इनग करने के बाद भी , ताकि git बूँद की गणना की जाती है, 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

मैंने उन लिपियों को अपडेट किया है जो सही तरीके से व्यवहार करती हैं सिवाय जब जीएटी वाल्टों पर संघर्ष को स्वचालित करने की कोशिश करता है जो मैं जल्द ही पोस्ट
करूंगा

1
समुद्र में एक बोतल फेंकना लेकिन: क्या फ़ाइल अलग-अलग लाइन एंडिंग या अलग-अलग कोड पेज की वजह से अलग हो सकती है?
तैंसीबाई

मैं -nधब्बा गूंज से हटाने की कोशिश करूँगा , लेकिन यह एक अनुमान है। गिट लाइन के लिए कोई भी छिपा विकल्प यह नहीं बता रहा है कि सिंगल लाइन एंडिंग को अनदेखा करें?
Tensibai

अभी तक एक और विचार: github.com/dellis23/ansible-toolkit (मैं इस एक दिन में और अधिक गहराई से खुदाई करूँगा)
तेनसीबाई

जवाबों:


8

यहाँ समस्या यादृच्छिक-तिजोरी एन्क्रिप्शन में यादृच्छिक नमक के कारण होती है। आप नमक को पास करने के लिए वॉल्टएडिटर क्लास को हैक कर सकते हैं, इसे एक तर्क-तिजोरी में एक तर्क से पारित कर सकते हैं। lib/ansible/parsing/vault/__init__.pyइस लाइन पर यादृच्छिक नमक उत्पन्न होता है । इसे lib / ansible / cli / vault.py से कहा जाता है जहां आप आसानी से निश्चित नमक के लिए तर्क जोड़ सकते हैं। यदि आप इसे बदलते हैं, तो कृपया एक अपस्ट्रीम पैच को Ansible में जमा करें, मुझे इसका उपयोग करना अच्छा लगेगा।

हैकर की खबरों पर यहां इस समस्या पर चर्चा की गई है । और उपकरण के साथ अन्य कार्यान्वयन हैं जो निश्चित नमक लेते हैं, अर्थात् गिटक्रिप्ट , ट्रांसक्रिप्ट । यहाँ ansible-वॉल्ट-टूल्स नामक ansible-vault का उपयोग करते हुए एक और कार्यान्वयन के लिए एक लिंक भी दिया गया है, लेकिन जहाँ तक मुझे पता है, यह एक ही नमक मुद्दा है।


यदि आप कोड की जांच करते हैं, तो मैं चर नमक मुद्दे को हल करने के लिए एक चेकसम का उपयोग कर रहा हूं, अर्थात। पहले एक tmp फ़ोल्डर में HEAD वॉल्ट को डिक्रिप्ट करें और नए बाइनरी ब्लॉब को जेनरेट करने से पहले सादे टेक्स्ट फ़ाइलों के चेकसम की तुलना करें। यह थोड़ा धीमा है लेकिन वास्तव में ठीक है। मेरी समस्या अब मर्ज पर है; कुछ स्थितियों में यह काम करता है, दूसरों में मैं बूँद को स्वचालित होने से पहले मैं इसे डिक्रिप्ट कर सकता हूं और यह टूट जाता है।
ᴳᵁᴵᴰᴼ

यदि आप मेरे द्वारा जुड़े तीन उदाहरणों पर गौर करते हैं, तो मर्जों पर भी कुछ काम कर रहे हैं। और हैकर समाचार टिप्पणियों में भी इसकी चर्चा हो रही है।
जिरी क्लौडा

BTW मर्जिंग मुश्किल है। आपको यह महसूस करने की आवश्यकता है कि जब आप मर्ज के दौरान अपने सभी बदलाव या सभी बदलावों को ऊपर से उठाते हैं, तो यह पता चलता है कि हैश तुलना के माध्यम से यह पता चलेगा कि नमक सही था या नहीं। अस्थायी फ़ाइल साफ / धब्बा पर पर्याप्त नहीं है। आपको मर्ज पर ऐसा ही करने की आवश्यकता है और गैर-संघर्ष मर्ज चेकआउट के मामले में गिट से सही पहले से एन्क्रिप्ट किए गए संस्करण का उपयोग करें और नए यादृच्छिक नमक के साथ फिर से एन्क्रिप्ट करने का विरोध करें।
जिरी क्लौडा

मुझे यकीन नहीं है कि आप यहाँ क्या कह रहे हैं; विलय वाल्टों के सादे पाठ पर होता है (जैसा कि यह अलग-थलग होता है), और रहस्यों को हमेशा ऑटो-मर्ज के लिए एक संघर्ष के रूप में चिह्नित किया जाता है, इस प्रकार किसी भी मर्ज कमिट के भीतर मर्ज किए गए पुन: एन्क्रिप्टेड रहस्यों को शामिल नहीं किया जाएगा। वास्तव में एक समस्या का प्रतिनिधित्व करते हैं (मेरे लिए)।
ᴳᵁᴵᴰᴼ

क्या आप मर्ज के मुद्दों पर विशिष्ट हो सकते हैं? आपको प्रतिलिपि प्रस्तुत करने योग्य मामला प्रदान करना चाहिए। लेकिन मैं अभी भी ऊपर उल्लिखित 3 परियोजनाओं में विचारों की तलाश करने का सुझाव दूंगा। मर्जिंग समस्याओं के लिए, जब आप सामग्री A को सामग्री B के साथ मिलाते हैं और आपने हमेशा संस्करण नियंत्रण प्रणाली के लिए हमेशा A या हमेशा B लेने का संकल्प लिया है, जो एक विशेष मामला है और वे कभी-कभी संस्करण को एक साथ जोड़कर ऐसा करेंगे। Git इसे सामग्री पर हैश के माध्यम से करता है, इसलिए यह मान लेगा कि हैश समान होगा, लेकिन यदि आप पुनः एन्क्रिप्ट करते हैं, भले ही सामग्री सभी A की हो, हैश समान नहीं होगा। लेकिन आपके पास दूसरा मुद्दा हो सकता है
जिरी क्लौडा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.