Spec-Zone.ru › Ansible

Использование зашифрованных переменных и файлов

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

Передача одного пароля

Если для всех зашифрованных переменных и файлов в задаче или плейбуке требуется один пароль, можно использовать параметры командной строки --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

Заголовок содержит до четырех элементов, разделенных точками с запятой (;).

  1. Идентификатор формата ($ANSIBLE_VAULT). В настоящее время $ANSIBLE_VAULT — единственный допустимый идентификатор формата. Он указывает на содержимое, зашифрованное с помощью Ansible Vault (с помощью vault.is_encrypted_file()).
  2. Версия формата хранилища (1.X). Все поддерживаемые версии Ansible по умолчанию используют ‘1.1’ или ‘1.2’, если указан идентификатор хранилища с меткой. Формат ‘1.0’ поддерживается только для чтения (при записи он автоматически преобразуется в формат ‘1.1’). В настоящее время версия формата сравнивается только как точная строка (номера версий не «сравниваются»).
  3. Алгоритм шифрования данных (AES256). В настоящее время AES256 — единственный поддерживаемый алгоритм шифрования. В формате хранилища 1.0 использовался ‘AES’, но текущий код всегда использует ‘AES256’.
  4. Метка идентификатора хранилища, использованная для шифрования данных (необязательный элемент, 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API