Как зашифровать бинарные файлы в Ansible?

9

Мы используем Ansible Vault для хранения паролей, личных ключей для сертификатов и т. Д. В нашем git-репозитории Ansible Playbook. Все наши существующие личные данные находятся в текстовой форме, поэтому мы можем хранить их в переменных. Затем они используются в шаблонах или с contentпараметром модуля копирования.

Теперь у нас есть файл Java KeyStore, который, к сожалению, имеет двоичный формат. Как таковой, он не может храниться внутри переменной - или, по крайней мере, я не знаю, как это сделать. Какой самый простой способ правильно зашифровать наш файл, пока он находится в git, но доступен при запуске ansible-playbook?

Что я уже попробовал без успеха:

  • Кодирование двоичного файла в base64, сохранение закодированных данных в переменной и использование модуля шаблона с {{base64_data | b64decode}}. Приводит к большому количеству EF BF BDв шестнадцатеричном дампе полученного файла. Три байта кодируют символ замены Unicode в UTF-8, поэтому существует проблема с интерпретацией двоичных данных как текста.
  • Кодирование двоичного файла в base64, сохранение закодированных данных в переменной и использование модуля копирования с content="{{base64_data | b64decode}}". Ansible жалуется на «переменная вставила новый параметр в аргументы модуля». При использовании одинарных кавычек вместо двойных кавычек, Ansible жалуется с «ошибкой разбора строки аргумента» и копией всех двоичных данных, сбрасываемых в терминал ...
Даниэль Сеитер
источник
Из обсуждения в groups.google.com/d/topic/ansible-project/IinZK14FyX4 я пришел к выводу, что ansible не поддерживает это, и что вам придется делать некоторые вещи base64 самостоятельно, но могут быть какие-то сторонние вещи это может сделать это легче.
Антонис Христофидес,
Спасибо, это выглядит хорошо. Попробую и
доложу
Нет, к сожалению, это не работает (см. Отредактированный вопрос). Существует несколько дискуссий по поводу запроса на извлечение
ответа,
Задумывались ли вы об этом с помощью вызовов GPG? Вы можете иметь ASCII-представление закрытого ключа GPG, хранящегося в Ansible Vault, и использовать его для расшифровки вашего двоичного файла, который затем можно без проблем сохранить в git.
Кристофер Карел
Спасибо за ваше предложение, но этот обходной путь немного сложнее, чем хотелось бы. Я уже думал о копировании KeyStore в кодировке base64 на целевую машину и наличии обработчика, который декодирует файл при обновлении, но я бы предпочел решение, которое не разбрасывает временные файлы.
Даниэль Сеит

Ответы:

4

Для этого вы можете использовать команду оболочки с переменной base64.

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

Эрик

elhostis
источник
Это определенно вариант, тем более что он не использует временный файл. К сожалению, это не позволяет Ansible определить, было ли внесено изменение, но это лучше, чем все другие решения, которые я видел.
Даниэль Сеитер
1
Я думаю, что хранилище поддерживает это сейчас: «Функция хранилища может также зашифровать произвольные файлы, даже двоичные файлы. Если зашифрованный в хранилище файл задается в качестве аргумента src для модуля копирования, файл будет помещен в место назначения на целевом хосте. расшифрован (при условии, что при запуске воспроизведения указан действительный пароль хранилища). " - docs.ansible.com/ansible/playbooks_vault.html
Майк Глисон, младший кутюрье,
2
Обратите внимание, что они, кажется, переместили текст, цитируемый @MikeGleasonjrCouturier, на другую страницу в документации. см. docs.ansible.com/ansible/latest/vault.html сейчас.
Лиам
2

То, как мы делаем это для нашей ANSIBLE установки:

-Мы шифруем отдельные конфиденциальные материалы (небольшое подмножество нашего репозитория), используя https://www.agwa.name/projects/git-crypt/ -Мы все всегда фиксируем, используя теги git sign -Мы периодически проверяем, есть ли какие-либо неподписанные файлы

Преимущество git-crypt заключается в том, что, поскольку он использует фильтры git, шифрование прозрачно. Кроме того, вы можете предоставить разработчикам доступ к хранилищу без ущерба для зашифрованного содержимого (оно будет игнорировать зашифрованные файлы, если ключ дешифрования не может быть получен).

MemCtrl
источник