Git sạch / smudge bộ lọc cho bí mật hầm ansible


20

Tôi đang cố gắng thiết lập bộ lọc sạch / smudge trong git để tự động mã hóa và giải mã các tập tin có chứa các bí mật thông qua lệnh ansible-vault .

Điểm đặc biệt của lệnh ansible-vault là nó không phải là idempotent (nó tạo ra một nhị phân khác nhau mỗi khi nó được gọi trên cùng một dữ liệu).

Tôi bắt đầu với việc thực hiện được đề xuất trong trang blog này . Thật không may, nó không hoạt động chính xác, vì bất cứ khi nào smudge được gọi (có thể là kiểm tra git hoặc chỉ trạng thái git), các tệp bí mật trông như được sửa đổi cho git, ngay cả khi nó không phải là.

Vì vậy, tôi tự hỏi nếu git sẽ so sánh nhị phân anh ta có trong chỉ mục với tệp hiện tại được lọc sạch và tôi đã cố gắng xây dựng trên các tập lệnh như sau:

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

Sự khác biệt ở đây là nó cố gắng so sánh các phiên bản hiện tại và CHÍNH của các tệp bí mật văn bản thuần túy (không được mã hóa) và chỉ trong trường hợp chúng khác nhau xuất ra một blob nhị phân mới được mã hóa với ansible-vault.

Thật không may, sau khi thay đổi này, git tiếp tục nghĩ rằng tập tin bí mật luôn được sửa đổi. Ngay cả sau khi git addnhập lại tệp, để git blob được tính toán, git nghĩ rằng tệp là khác nhau và để thay đổi đi vào cam kết. Lưu ý rằng git difftrả lại các thay đổi trống, như nó nên.

Để tham khảo, đây là smudge:

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

và đây là khác:

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

Tôi đã cập nhật các kịch bản mà cư xử một cách chính xác, ngoại trừ cố gắng khi git để xung đột automerge vào hầm mà tôi sẽ đăng trong thời gian ngắn
ᴳᵁᴵᴰᴼ

1
Ném một cái chai trên biển nhưng: tập tin có thể khác nhau vì kết thúc dòng khác nhau hoặc trang mã khác nhau?
Tensibai

Tôi sẽ thử loại bỏ -ntiếng vang nhoè, nhưng đó là một phỏng đoán. Không có tùy chọn ẩn nào cho git diff bảo nó bỏ qua các kết thúc dòng đơn?
Tensibai

Còn một ý tưởng khác: github.com/dellis23/ansible-toolkit (Tôi sẽ đào sâu hơn vào một ngày này)
Tensibai

Câu trả lời:


8

Vấn đề ở đây là do muối ngẫu nhiên trong mã hóa ansible-vault. Bạn có thể hack lớp VaultEditor để truyền muối cho nó từ một đối số trong ansible-vault. Các muối ngẫu nhiên được tạo ra lib/ansible/parsing/vault/__init__.pytrên dòng này . Nó được gọi từ lib / ansible / cli / vault.py nơi bạn có thể dễ dàng thêm đối số cho muối cố định. Nếu bạn thay đổi nó, vui lòng gửi một bản vá ngược dòng tới Ansible, tôi rất thích sử dụng nó.

Vấn đề này được thảo luận thêm ở đây về tin tức hacker . Và có những triển khai khác với các công cụ lấy muối cố định, cụ thể là gitcrypt , transcrypt . Đây cũng là một liên kết đến một triển khai nữa bằng cách sử dụng ansible-vault được gọi là ansible-vault-tools , nhưng cái này có vấn đề về muối giống như tôi biết.


Nếu bạn kiểm tra mã, tôi đang sử dụng tổng kiểm tra để giải quyết vấn đề muối biến đổi, tức là. trước tiên hãy giải mã vault HEAD trong thư mục tmp và so sánh tổng kiểm tra của các tệp văn bản thuần trước khi tạo blob nhị phân mới. Đó là một chút chậm nhưng thực sự ok. Vấn đề của tôi là về việc sáp nhập bây giờ; trong một số tình huống nó hoạt động, trong những tình huống khác tôi có được blob tự động hóa trước khi tôi có thể giải mã nó và nó bị hỏng.
ᴳᵁᴵᴰᴼ

Nếu bạn nhìn vào ba ví dụ tôi đã liên kết, có một số cách giải quyết về việc sáp nhập là tốt. Và nó đang được thảo luận trong các bình luận tin tức hacker.
Jiri Klouda

Sáp nhập BTW là khó khăn. Những gì bạn cần nhận ra là trong trường hợp bạn chọn tất cả các thay đổi hoặc tất cả các thay đổi từ thượng nguồn trong quá trình hợp nhất, git sẽ tìm ra điều đó thông qua so sánh băm, sẽ hoạt động nếu muối đúng. Các tập tin tạm thời là không đủ trên sạch / smudge. Bạn sẽ cần phải làm tương tự khi hợp nhất và trong trường hợp kiểm tra hợp nhất không xung đột, phiên bản đã được mã hóa chính xác từ git và sử dụng phiên bản đó thay vì mã hóa lại bằng muối ngẫu nhiên mới.
Jiri Klouda

Không chắc chắn tôi hiểu những gì bạn đang nói ở đây; sáp nhập sẽ xảy ra trên văn bản đơn giản của kho tiền (vì nó rất khác biệt) và các bí mật luôn được đánh dấu là xung đột ngay cả đối với tự động sáp nhập, do đó bao gồm cả các bí mật được mã hóa lại được hợp nhất trong bất kỳ cam kết hợp nhất nào, sẽ không thực sự đại diện cho một vấn đề (đối với tôi).
ᴳᵁᴵᴰᴼ

Bạn có thể sau đó cụ thể về các vấn đề hợp nhất? Bạn nên cung cấp trường hợp tái sản xuất. Nhưng tôi vẫn sẽ đề nghị tìm kiếm ý tưởng vào 3 dự án nêu trên. Đối với các vấn đề hợp nhất, khi bạn hợp nhất nội dung A với nội dung B và bạn đã quyết tâm lấy luôn A hoặc luôn B, đối với các hệ thống kiểm soát phiên bản là trường hợp đặc biệt và đôi khi chúng sẽ làm điều đó bằng cách liên kết phiên bản với nhau. Git thực hiện thông qua hàm băm trên nội dung, vì vậy nó sẽ cho rằng hàm băm sẽ giống nhau, nhưng nếu bạn mã hóa lại, ngay cả khi nội dung là tất cả A, thì hàm băm sẽ không giống nhau. Nhưng bạn có thể có vấn đề khác
Jiri Klouda
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.