Jak szyfrować pliki binarne w Ansible?

9

Używamy Ansible Vault do przechowywania haseł, kluczy prywatnych do certyfikatów itp. W naszym repozytorium git w Ansible Playbook. Wszystkie nasze prywatne dane są w formie tekstowej, więc możemy przechowywać je w zmiennych. Są one następnie używane w szablonach lub z contentparametrem modułu kopiowania.

Teraz mamy plik Java KeyStore, który niestety ma format binarny. Jako taki nie może być przechowywany w zmiennej - a przynajmniej nie wiem, jak to zrobić. Jaki byłby najłatwiejszy sposób na prawidłowe zaszyfrowanie naszego pliku, gdy jest on w git, ale dostępny podczas działania ansible-playbook?

Co próbowałem już bez powodzenia:

  • Kodowanie pliku binarnego w base64, przechowywanie zakodowanych danych w zmiennej i używanie modułu szablonu z {{base64_data | b64decode}}. Prowadzi do wielu EF BF BDzrzutów szesnastkowych wynikowego pliku. Trzy bajty kodują znak zastępujący Unicode w UTF-8, więc występuje problem z interpretacją danych binarnych jako tekstu.
  • Kodowanie pliku binarnego w base64, przechowywanie zakodowanych danych w zmiennej i używanie modułu kopiującego z content="{{base64_data | b64decode}}". Ansible narzeka na: „Zmienna wstawiła nowy parametr do argumentów modułu”. Gdy używasz pojedynczych cudzysłowów zamiast podwójnych cudzysłowów, Ansible skarży się na „ciąg argumentu analizujący błąd” i kopię wszystkich danych binarnych, zrzuconych do terminala ...
Daniel Seither
źródło
Z dyskusji w grupach.google.com/d/topic/ansible-project/IinZK14FyX4 dochodzę do wniosku, że ansible tego nie obsługuje i że musisz zrobić kilka rzeczy base64 na własną rękę, ale mogą istnieć pewne rzeczy osób trzecich to może to ułatwić.
Antonis Christofides,
Dzięki, to wygląda dobrze. Spróbuję i
zdam
Nie, to niestety nie działa (patrz zredagowane pytanie). Istnieje pewna dyskusja wokół żądania pull pull, które może być istotne: github.com/ansible/ansible-modules-extras/pull/142
Daniel Seither
Czy zastanawiałeś się nad tym, aby połączyć to z połączeniami GPG? Możesz mieć reprezentację ASCII klucza prywatnego GPG przechowywaną w Ansible Vault i użyć go do odszyfrowania pliku binarnego, który można bez problemu przechowywać w git.
Christopher Karel
Dziękuję za twoją sugestię, ale to obejście jest nieco bardziej zaangażowane niż chciałbym. Już myślałem o skopiowaniu magazynu kluczy zakodowanego w standardzie base64 na maszynę docelową i posiadaniu modułu obsługi, który dekoduje plik podczas aktualizacji, ale wolałbym rozwiązanie, które nie obrzuca plików tymczasowych.
Daniel Seither

Odpowiedzi:

4

W tym celu można użyć polecenia powłoki ze zmienną base64.

- vars:
  - myvar: "<my_base64_var>"
- name: Create binary file
  shell: "echo '{{myvar}}' | base64 -d > /var/tmp/binary.dat"

Eric

elhostis
źródło
Jest to zdecydowanie opcja, zwłaszcza że nie używa pliku tymczasowego. Niestety, nie pozwala Ansible'owi wykryć zmiany, ale jest lepsza niż wszystkie inne rozwiązania, które widziałem.
Daniel Seither
1
Myślę, że Vault obsługuje go teraz: „Funkcja Vault może również szyfrować dowolne pliki, nawet pliki binarne. Jeśli plik zaszyfrowany w repozytorium zostanie podany jako argument src dla modułu kopiującego, plik zostanie umieszczony w miejscu docelowym na hoście docelowym odszyfrowane (przy założeniu, że podczas uruchamiania gry podano prawidłowe hasło do skarbca). ” - docs.ansible.com/ansible/playbooks_vault.html
Mike Gleason jr Couturier
2
Zauważ, że najwyraźniej przenieśli tekst cytowany przez @MikeGleasonjrCouturier na inną stronę w dokumentacji ansible; zobacz docs.ansible.com/ansible/latest/vault.html teraz.
Liam,
2

Sposób, w jaki to robimy dla naszej konfiguracji ansible:

- Szyfrujemy poszczególne wrażliwe materiały (niewielki podzbiór naszego repozytorium) za pomocą https://www.agwa.name/projects/git-crypt/ - Wszyscy zawsze zatwierdzamy za pomocą znaczników git - Okresowo sprawdzamy, czy są jakieś niepodpisane pliki

Zaletą git-crypt jest to, że ponieważ polega on na filtrach git, szyfrowanie jest przezroczyste. Ponadto możesz przyznać programistom dostęp do repozytorium bez narażania zaszyfrowanej zawartości (będzie ignorować zaszyfrowane pliki, jeśli nie będzie można uzyskać klucza deszyfrującego).

MemCtrl
źródło