Использование зашифрованных переменных и файлов
При выполнении задачи или плейбука, использующего зашифрованные переменные или файлы, необходимо предоставить пароли для расшифровки переменных или файлов. Это можно сделать в командной строке или задав источник пароля по умолчанию в параметре конфигурации или переменной среды.
Передача одного пароля
Если все зашифрованные переменные и файлы в вашей задаче или плейбуке должны использовать один пароль, вы можете использовать опции командной строки --ask-vault-pass или --vault-password-file.
Для запроса пароля:
ansible-playbook --ask-vault-pass site.yml
Для получения пароля из файла /path/to/my/vault-password-file:
ansible-playbook --vault-password-file /path/to/my/vault-password-file site.yml
Для получения пароля из скрипта-клиента Vault my-vault-password-client.py:
ansible-playbook --vault-password-file my-vault-password-client.py
Передача идентификаторов Vault
Вы также можете использовать опцию --vault-id, чтобы передать один пароль с его меткой Vault. Этот подход понятнее при использовании нескольких Vault в одном инвентаре.
Для запроса пароля для идентификатора Vault ‘dev’:
ansible-playbook --vault-id dev@prompt site.yml
Для получения пароля для идентификатора Vault ‘dev’ из файла dev-password:
ansible-playbook --vault-id dev@dev-password site.yml
Для получения пароля для идентификатора Vault ‘dev’ из скрипта-клиента Vault my-vault-password-client.py:
ansible-playbook --vault-id dev@my-vault-password-client.py
Передача нескольких паролей Vault
Если ваша задача или плейбук требуют несколько зашифрованных переменных или файлов, которые вы зашифровали с помощью разных идентификаторов Vault, вы должны использовать опцию --vault-id, передавая несколько опций --vault-id для указания идентификаторов Vault (‘dev’, ‘prod’, ‘cloud’, ‘db’) и источников паролей (запрос, файл, скрипт). Например, для использования пароля ‘dev’ из файла и запроса пароля ‘prod’:
ansible-playbook --vault-id dev@dev-password --vault-id prod@prompt site.yml
По умолчанию, метки идентификаторов Vault (dev, prod и т.д.) являются только подсказками. Ansible пытается расшифровать содержимое Vault с каждым паролем. Пароль с той же меткой, что и зашифрованные данные, будет опробован первым, после чего каждый секрет Vault будет опробован в порядке их предоставления в командной строке.
В тех случаях, когда зашифрованные данные не имеют метки или метка не совпадает ни с одной из предоставленных меток, пароли будут опробованы в указанном порядке. В примере выше, пароль ‘dev’ будет опробован первым, затем пароль ‘prod’ в тех случаях, когда Ansible не знает, какой идентификатор Vault используется для шифрования чего-либо.
Использование --vault-id без идентификатора Vault
Опция --vault-id также может быть использована без указания идентификатора Vault. Это поведение эквивалентно --ask-vault-pass или --vault-password-file, поэтому используется редко.
Например, для использования файла паролей dev-password:
ansible-playbook --vault-id dev-password site.yml
Для запроса пароля:
ansible-playbook --vault-id @prompt site.yml
Для получения пароля из исполняемого скрипта my-vault-password-client.py:
ansible-playbook --vault-id my-vault-password-client.py
Настройка значений по умолчанию для использования зашифрованного содержимого
Установка идентификатора Vault по умолчанию
Если вы используете один идентификатор Vault чаще, чем любой другой, вы можете установить параметр конфигурации DEFAULT_VAULT_IDENTITY_LIST, чтобы указать идентификатор Vault по умолчанию и источник пароля. Ansible будет использовать идентификатор Vault по умолчанию и источник каждый раз, когда вы не указываете --vault-id. Вы можете задать несколько значений для этого параметра. Установка нескольких значений эквивалентна передаче нескольких опций --vault-id командной строки.
Установка источника пароля по умолчанию
Если вы не хотите указывать файл пароля в командной строке или если вы используете один файл паролей Vault чаще, чем любой другой, вы можете установить параметр конфигурации DEFAULT_VAULT_PASSWORD_FILE или переменную среды ANSIBLE_VAULT_PASSWORD_FILE, чтобы указать файл по умолчанию для использования. Например, если вы установите ANSIBLE_VAULT_PASSWORD_FILE=~/.vault_pass.txt, Ansible автоматически будет искать пароль в этом файле. Это полезно, например, если вы используете Ansible из системы непрерывной интеграции, такой как Jenkins.
Файл, на который вы ссылаетесь, может быть файлом, содержащим пароль (в открытом виде), или скриптом (с установленными правами на выполнение), возвращающим пароль.
Когда зашифрованные файлы становятся видимыми?
В целом, содержимое, зашифрованное с помощью Ansible Vault, остается зашифрованным после выполнения. Однако есть одно исключение. Если вы передаете зашифрованный файл в качестве аргумента src модулю copy, template, unarchive, script или assemble, файл не будет зашифрован на целевом хосте (если вы предоставите правильный пароль Vault при запуске плейбука). Это поведение преднамеренно и полезно. Вы можете зашифровать файл конфигурации или шаблон, чтобы избежать раскрытия деталей вашей конфигурации, но когда вы копируете эту конфигурацию на сервера в вашей среде, вы хотите, чтобы она была расшифрована, чтобы локальные пользователи и процессы могли к ней получить доступ.
Формат файлов, зашифрованных с помощью Ansible Vault
Ansible Vault создает файлы txt в кодировке UTF-8. Формат файла включает заголовок с символом новой строки в конце. Например:
$ANSIBLE_VAULT;1.1;AES256
или
$ANSIBLE_VAULT;1.2;AES256;vault-id-label
Заголовок содержит до четырех элементов, разделенных точками с запятой (;).
- Идентификатор формата (
$ANSIBLE_VAULT). В настоящее время$ANSIBLE_VAULTявляется единственным допустимым идентификатором формата. Идентификатор формата определяет содержимое, зашифрованное с помощью Ansible Vault (с помощью vault.is_encrypted_file()). - Версия формата Vault (
1.X). Все поддерживаемые версии Ansible в настоящее время по умолчанию будут использовать ‘1.1’ или ‘1.2’, если предоставлен именованный идентификатор Vault. Формат ‘1.0’ поддерживается только для чтения (и будет автоматически преобразован в формат ‘1.1’ при записи). В настоящее время версия формата используется только для точного сравнения строк (версии в настоящее время не «сравниваются»). - Алгоритм шифрования, используемый для шифрования данных (
AES256). В настоящее времяAES256является единственным поддерживаемым алгоритмом шифрования. Формат Vault 1.0 использовал ‘AES’, но текущий код всегда использует ‘AES256’. - Метка идентификатора Vault, используемая для шифрования данных (необязательно,
vault-id-label) Например, если вы зашифруете файл с помощью--vault-id dev@prompt, метка идентификатора Vault будетdev.
Примечание: В будущем заголовок может измениться. Поля после идентификатора формата и версии формата зависят от версии формата. Будущие версии формата Vault могут добавить больше вариантов алгоритмов шифрования и/или дополнительные поля.
Остальное содержимое файла — это «vaulttext». Vaulttext — это текстовое представление зашифрованного шифрованного текста. Каждая строка имеет ширину 80 символов, за исключением последней строки, которая может быть короче.
Формат полезной нагрузки Ansible Vault 1.1 — 1.2
Vaulttext представляет собой конкатенацию шифрованного текста и дайджеста SHA256 с результатом «hexlifyied».
«hexlify» относится к методу hexlify() модуля binascii стандартной библиотеки Python binascii.
Результат hexlify() от:
- строки соли, закодированной в шестнадцатеричный вид с последующей новой строкой (
0x0a) -
строки зашифрованного HMAC, закодированной в шестнадцатеричный вид с последующей новой строкой. HMAC:
-
тип HMAC в формате RFC2104
-
входные данные:
- Зашифрованный текст AES256
-
Ключ PBKDF2. Этот ключ, ключ шифра и IV шифра генерируются из:
- соль в байтах
- 10000 итераций
- алгоритм SHA256()
- первые 32 байта — ключ шифра
- следующие 32 байта — ключ HMAC
- оставшиеся 16 байт — IV шифра
-
-
- строки шифрованного текста, закодированной в шестнадцатеричный вид. Шифрованный текст:
-
данные, зашифрованные с использованием AES256. Данные зашифрованы с использованием:
- потокового шифра AES-CTR
- ключ шифра
- IV
- 128-битный блок счетчика, инициализированный целым значением IV
-
исходные данные
- исходные данные
- заполнение до размера блока AES256. (Данные, используемые для заполнения, основаны на RFC5652)
© 2012–2018 Michael DeHaan
© 2018–2024 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/latest/vault_guide/vault_using_encrypted_content.html