Git clean / smudge filter สำหรับความลับของห้องนิรภัย


20

ฉันกำลังพยายามตั้งค่าตัวกรอง clean / smudgeใน git ให้มีการเข้ารหัสและถอดรหัสไฟล์ที่มีความลับโดยอัตโนมัติผ่านคำสั่งansible-vault

ความผิดปกติของคำสั่ง ansible-vault คือมันไม่ใช่ idempotent (มันสร้างไบนารีที่แตกต่างกันในแต่ละครั้งที่เรียกใช้กับข้อมูลเดียวกัน)

ฉันเริ่มต้นด้วยการดำเนินงานข้อเสนอแนะในหน้าบล็อกนี้ น่าเสียดายที่มันไม่ทำงานอย่างถูกต้องเนื่องจากเมื่อใดก็ตามที่มีการเรียกรอยเปื้อน (ไม่ว่าจะเป็นเช็คเอาต์ git หรือเพียงแค่สถานะ git) ไฟล์ลับดูเหมือนว่าแก้ไขสำหรับ 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

ความแตกต่างที่นี่ก็คือมันพยายามที่จะเปรียบเทียบไฟล์ลับในปัจจุบันและส่วนหัวของไฟล์ข้อความธรรมดา (ไม่ได้เข้ารหัส) และเฉพาะในกรณีที่พวกมันแตกต่างกันไปส่งออกเป็น binary blob ใหม่ที่เข้ารหัสด้วย ansible-vault

น่าเสียดายที่หลังจากการเปลี่ยนแปลงนี้คอมไพล์ยังคงคิดว่าไฟล์ลับถูกแก้ไขอยู่เสมอ แม้หลังจากgit addนำไฟล์เข้ามาอีกครั้งเพื่อคำนวณ git blob แล้ว 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

ฉันได้อัปเดตสคริปต์ที่ทำงานได้อย่างถูกต้องแล้วยกเว้นเมื่อ git พยายามทำให้เกิดข้อขัดแย้งอัตโนมัติในห้องใต้ดินซึ่งฉันจะโพสต์ในไม่ช้า
ᴳᵁᴵᴰᴼ

1
โยนขวดลงทะเล แต่: ไฟล์อาจแตกต่างกันเนื่องจากการสิ้นสุดบรรทัดที่แตกต่างกันหรือหน้ารหัสที่แตกต่างกัน?
Tensibai

ฉันจะลองลบ-nเสียงสะท้อนออกจากรอยเปื้อน แต่นั่นเป็นการคาดเดา ไม่มีตัวเลือกที่ซ่อนสำหรับคอมไพล์บอกให้ละเว้นปลายบรรทัดเดียวหรือไม่
Tensibai

อีกแนวคิดหนึ่ง: github.com/dellis23/ansible-toolkit (ฉันจะขุดลึกลงไปในวันนี้)
Tensibai

คำตอบ:


8

ปัญหาที่นี่เกิดจากการสุ่มเกลือในการเข้ารหัส ansible-vault คุณสามารถแฮ็กคลาส VaultEditor เพื่อส่งเกลือนั้นจากอาร์กิวเมนต์ใน ansible-vault เกลือสุ่มถูกสร้างขึ้นในlib/ansible/parsing/vault/__init__.pyเกี่ยวกับเรื่องนี้บรรทัด มันถูกเรียกจากlib / ansible / cli / vault.pyซึ่งคุณสามารถเพิ่มอาร์กิวเมนต์สำหรับเกลือคงที่ได้อย่างง่ายดาย หากคุณเปลี่ยนแปลงโปรดส่งแพทช์อัปสตรีมไปยัง Ansible ฉันชอบที่จะใช้

ปัญหานี้จะกล่าวถึงต่อไปที่นี่ในข่าวแฮ็กเกอร์ และมีการใช้งานอื่น ๆ ที่มีเครื่องมือที่ใช้คงเกลือคือgitcrypt , transcrypt นี่คือลิงค์ไปสู่การใช้งานอีกหนึ่งอย่างโดยใช้ ansible-vault ที่เรียกว่าansible-vault-toolsแต่อันนี้มีปัญหาเรื่องเกลือเท่าที่ฉันรู้


หากคุณตรวจสอบรหัสฉันใช้ checksum เพื่อแก้ไขปัญหาเกลือแปรปรวนเช่น ถอดรหัส HEAD vault ในโฟลเดอร์ tmp ก่อนและเปรียบเทียบ checksums ของไฟล์ข้อความธรรมดาก่อนสร้าง binary blob ไบนารีใหม่ ค่อนข้างช้า แต่ก็ใช้ได้จริง ปัญหาของฉันอยู่ในการรวมตอนนี้; ในบางสถานการณ์ใช้งานได้ในบางกรณีฉันได้รับหยดอัตโนมัติก่อนที่ฉันจะถอดรหัสและหยุดพัก
ᴳᵁᴵᴰᴼ

หากคุณดูตัวอย่างสามอย่างที่ฉันเชื่อมโยงมีวิธีแก้ไขปัญหาบางประการเกี่ยวกับการรวมเช่นกัน และมันกำลังถูกกล่าวถึงในความคิดเห็นของแฮ็กเกอร์ด้วยเช่นกัน
Jiri Klouda

การผสาน BTW นั้นยุ่งยาก สิ่งที่คุณต้องรู้คือในกรณีที่คุณเลือกการเปลี่ยนแปลงทั้งหมดของคุณหรือการเปลี่ยนแปลงทั้งหมดจากต้นน้ำในระหว่างการรวมคอมไพล์จะคิดว่าผ่านการเปรียบเทียบแฮชซึ่งจะทำงานได้ถ้าเกลือถูกต้อง ไฟล์ temp ไม่เพียงพอในการทำความสะอาด / รอยเปื้อน คุณจะต้องทำแบบเดียวกันกับการผสานและในกรณีที่การผสานที่ไม่ขัดแย้งกันนั้นเป็นรุ่นที่เข้ารหัสที่ถูกต้องอยู่แล้วจากคอมไพล์และใช้อันนั้นเมื่อเทียบกับการเข้ารหัสด้วยเกลือแบบสุ่มใหม่
Jiri Klouda

ไม่แน่ใจว่าฉันเข้าใจสิ่งที่คุณกำลังพูดที่นี่; การรวมจะเกิดขึ้นกับข้อความธรรมดาของห้องใต้ดิน (เมื่อผ่านไปต่าง ๆ ) และการมีความลับจะถูกทำเครื่องหมายว่าเป็นความขัดแย้งเสมอแม้กระทั่งการรวมอัตโนมัติดังนั้นจึงรวมถึงความลับที่เข้ารหัสใหม่ที่ผสานภายในการกระทำใด ๆ แสดงถึงปัญหาจริงๆ (สำหรับฉัน)
ᴳᵁᴵᴰᴼ

คุณสามารถระบุประเด็นการผสานได้หรือไม่? คุณควรระบุกรณีที่สามารถทำซ้ำได้ แต่ฉันยังคงแนะนำให้มองหาแนวคิดใน 3 โครงการที่กล่าวถึงข้างต้น สำหรับปัญหาการรวมเมื่อคุณผสานเนื้อหา A กับเนื้อหา B และคุณได้รับการแก้ไขให้ใช้ A หรือ B เสมอสำหรับระบบควบคุมเวอร์ชันที่เป็นกรณีพิเศษและบางครั้งพวกเขาจะทำเช่นนั้นด้วยการเชื่อมโยงเวอร์ชันเข้าด้วยกัน Git ทำการแฮชผ่านเนื้อหาดังนั้นมันจะถือว่าแฮชนั้นเหมือนกัน แต่ถ้าคุณเข้ารหัสอีกครั้งแม้ว่าเนื้อหาทั้งหมดจะเป็น A แฮก็จะไม่เหมือนเดิม แต่คุณสามารถมีปัญหาอื่น ๆ
Jiri Klouda
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.