Использование зашифрованных переменных и файлов
При запуске задачи или плейбука, в которых используются зашифрованные переменные или файлы, необходимо предоставить пароли для их расшифровки. Это можно сделать в командной строке или задать источник пароля по умолчанию с помощью параметра конфигурации или переменной окружения.
Передача одного пароля
Если для всех зашифрованных переменных и файлов в задаче или плейбуке требуется один пароль, можно использовать параметры командной строки --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
Чтобы получить пароль с помощью клиентского скрипта для пароля хранилища my-vault-password-client.py:
ansible-playbook --vault-password-file my-vault-password-client.py
Передача идентификаторов хранилища
Также можно использовать параметр --vault-id, чтобы передать один пароль с его меткой хранилища. Такой подход удобнее, если в одном инвентаре используется несколько хранилищ.
Чтобы запросить пароль для идентификатора хранилища ‘dev’:
ansible-playbook --vault-id dev@prompt site.yml
Чтобы получить пароль для идентификатора хранилища ‘dev’ из файла dev-password:
ansible-playbook --vault-id dev@dev-password site.yml
Чтобы получить пароль для идентификатора хранилища ‘dev’ с помощью клиентского скрипта для пароля хранилища my-vault-password-client.py:
ansible-playbook --vault-id dev@my-vault-password-client.py
Передача нескольких паролей хранилищ
Если для задачи или плейбука требуются несколько зашифрованных переменных или файлов, зашифрованных с разными идентификаторами хранилища, необходимо использовать параметр --vault-id, передав несколько параметров --vault-id, чтобы указать идентификаторы хранилищ (‘dev’, ‘prod’, ‘cloud’, ‘db’) и источники паролей (запрос, файл, скрипт). Например, чтобы использовать пароль ‘dev’, прочитанный из файла, и запросить пароль ‘prod’:
ansible-playbook --vault-id dev@dev-password --vault-id prod@prompt site.yml
По умолчанию метки идентификаторов хранилища (dev, prod и т. д.) служат только подсказками. Ansible пытается расшифровать содержимое хранилища с помощью каждого пароля. Сначала проверяется пароль с той же меткой, что и у зашифрованных данных, затем проверяется каждый секрет хранилища в порядке их передачи в командной строке.
Если у зашифрованных данных нет метки или метка не совпадает ни с одной из указанных меток, пароли проверяются в заданном порядке. В примере выше сначала будет проверен пароль ‘dev’, затем пароль ‘prod’ — в случаях, когда Ansible не знает, какой идентификатор хранилища использовался для шифрования.
Использование --vault-id без идентификатора хранилища
Параметр --vault-id можно использовать и без указания идентификатора хранилища. Такое поведение эквивалентно использованию --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
Настройка параметров по умолчанию для работы с зашифрованным содержимым
Настройка идентификатора хранилища по умолчанию
Если вы используете один идентификатор хранилища чаще остальных, можно задать параметр конфигурации DEFAULT_VAULT_IDENTITY_LIST, чтобы указать идентификатор хранилища и источник пароля по умолчанию. Ansible будет использовать идентификатор хранилища и источник по умолчанию, если вы не укажете --vault-id. Для этого параметра можно задать несколько значений. Указание нескольких значений эквивалентно передаче нескольких параметров командной строки --vault-id.
Настройка источника пароля по умолчанию
Если вы не хотите указывать файл пароля в командной строке или используете один файл пароля хранилища чаще остальных, можно задать параметр конфигурации 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, файл на целевом хосте не будет зашифрован (при условии, что при запуске плейбука указан правильный пароль хранилища). Такое поведение предусмотрено и полезно. Можно зашифровать файл конфигурации или шаблон, чтобы не раскрывать подробности конфигурации, но при копировании этой конфигурации на серверы в вашей среде ее нужно расшифровать, чтобы локальные пользователи и процессы могли получить к ней доступ.
Формат файлов, зашифрованных с помощью 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()). - Версия формата хранилища (
1.X). Все поддерживаемые версии Ansible по умолчанию используют ‘1.1’ или ‘1.2’, если указан идентификатор хранилища с меткой. Формат ‘1.0’ поддерживается только для чтения (при записи он автоматически преобразуется в формат ‘1.1’). В настоящее время версия формата сравнивается только как точная строка (номера версий не «сравниваются»). - Алгоритм шифрования данных (
AES256). В настоящее времяAES256— единственный поддерживаемый алгоритм шифрования. В формате хранилища 1.0 использовался ‘AES’, но текущий код всегда использует ‘AES256’. - Метка идентификатора хранилища, использованная для шифрования данных (необязательный элемент,
vault-id-label). Например, если зашифровать файл с помощью--vault-id dev@prompt, метка идентификатора хранилища будетdev.
Примечание. В будущем заголовок может измениться. Поля после идентификатора формата и версии формата зависят от версии формата. В будущих версиях формата хранилища могут появиться дополнительные алгоритмы шифрования и/или поля.
Оставшаяся часть содержимого файла — это «vaulttext». Vaulttext — это текстовое представление зашифрованного шифротекста. Длина каждой строки составляет 80 символов, кроме последней строки, которая может быть короче.
Формат полезной нагрузки Ansible Vault 1.1–1.2
Vaulttext представляет собой объединение шифротекста и дайджеста SHA256, результат которого преобразован в шестнадцатеричное представление.
«hexlify» — это метод hexlify() из модуля binascii стандартной библиотеки Python.
Результат hexlify() для:
- строки соли, преобразованной с помощью hexlify(), за которой следует символ новой строки (
0x0a) -
строки зашифрованного HMAC, преобразованной с помощью hexlify(), за которой следует символ новой строки. HMAC — это:
-
HMAC в стиле RFC2104
-
с входными данными:
- Зашифрованный шифротекст AES256
-
Ключ PBKDF2. Этот ключ, ключ шифра и вектор инициализации шифра генерируются на основе:
- соли в байтах
- 10000 итераций
- алгоритма SHA256()
- первые 32 байта — это ключ шифра
- следующие 32 байта — это ключ HMAC
- оставшиеся 16 байт — это вектор инициализации шифра
-
-
- строки шифротекста, преобразованной с помощью hexlify(). Шифротекст — это:
-
Зашифрованные данные AES256. Данные шифруются с использованием:
- поточного шифра AES-CTR
- ключа шифра
- вектора инициализации
- 128-битного блока счетчика, инициализированного целочисленным значением вектора инициализации
-
открытого текста
- исходного открытого текста
- заполнения до размера блока AES256. Данные для заполнения формируются на основе RFC5652.
© 2012–2018 Michael DeHaan
© 2018–2025 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/projects/ansible/latest/vault_guide/vault_using_encrypted_content.html