Spec-Zone.ru › Ansible 2.4

Ansible Vault

  • Что можно зашифровать с помощью Vault
  • Создание зашифрованных файлов
  • Редактирование зашифрованных файлов
  • Переключить ключи в зашифрованных файлах
  • Шифрование незашифрованных файлов
  • Расшифровка зашифрованных файлов
  • Просмотр зашифрованных файлов
  • Использование encrypt_string для создания зашифрованных переменных для вставки в YAML
  • Идентификаторы Vault и несколько паролей Vault
  • Предоставление паролей Vault
    • Несколько паролей Vault
  • Ускорение операций Vault
  • Формат Vault
  • Формат полезной нагрузки Vault 1.1

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

Для активации этой функции используется командная утилита - ansible-vault - для редактирования файлов, и флаг командной строки (--ask-vault-pass или --vault-password-file) используется. В качестве альтернативы вы можете указать расположение файла пароля или использовать команду Ansible, чтобы всегда запрашивать пароль в файле ansible.cfg. Эти параметры не требуют использования флага командной строки.

Для получения рекомендаций по лучшим практикам обратитесь к Переменные и Vault.

Что можно зашифровать с помощью Vault

Функция vault может зашифровать любой структурированный файл данных, используемый Ansible. Это может включать переменные инвентаризации «group_vars/» или «host_vars/», переменные, загруженные с помощью «include_vars» или «vars_files», или файлы переменных, передаваемые в командной строке ansible-playbook с помощью -e @file.yml или -e @file.json. Также включаются переменные и значения по умолчанию ролей.

Задачи, обработчики и т. д. Ansible также являются данными, поэтому их можно зашифровать с помощью vault. Чтобы скрыть имена используемых переменных, вы можете зашифровать файлы задач целиком.

Функция vault также может шифровать произвольные файлы, даже двоичные файлы. Если зашифрованный файлом vault файл задается в качестве параметра src модулям copy, template, unarchive, script или assemble, файл будет помещен в целевой каталог на целевом хосте расшифрованным (предполагая, что при выполнении воспроизведения предоставлен действительный пароль vault).

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

Создание зашифрованных файлов

Для создания нового зашифрованного файла данных выполните следующую команду:

ansible-vault create foo.yml

Сначала вам будет предложено ввести пароль. Пароль, используемый с vault, должен быть одинаковым для всех файлов, которые вы хотите использовать вместе в одно время.

После ввода пароля утилита запустит ваш текстовый редактор, определенный в переменной $EDITOR, или по умолчанию vi (до версии 2.1 значением по умолчанию был vim). После завершения сессии редактора файл будет сохранён как зашифрованные данные.

По умолчанию используется шифр AES (на основе общего секрета).

Редактирование зашифрованных файлов

Чтобы отредактировать зашифрованный файл на месте, используйте команду ansible-vault edit. Эта команда расшифрует файл в временный файл, позволит вам отредактировать его, сохранит изменения и удалит временный файл после завершения:

ansible-vault edit foo.yml

Переключить ключи в зашифрованных файлах

Если вам нужно изменить пароль для файла или файлов vault, вы можете сделать это с помощью команды rekey:

ansible-vault rekey foo.yml bar.yml baz.yml

Эта команда может переключить ключи для нескольких файлов данных одновременно и запросит исходный пароль, а также новый пароль.

Шифрование незашифрованных файлов

Если у вас есть существующие файлы, которые вы хотите зашифровать, используйте команду ansible-vault encrypt. Эта команда может обрабатывать несколько файлов одновременно:

ansible-vault encrypt foo.yml bar.yml baz.yml

Расшифровка зашифрованных файлов

Если у вас есть существующие файлы, которые вы больше не хотите хранить в зашифрованном виде, вы можете окончательно их расшифровать, выполнив команду ansible-vault decrypt. Эта команда сохранит их в незашифрованном виде на диске, поэтому убедитесь, что вам не нужна команда ansible-vault edit вместо этого:

ansible-vault decrypt foo.yml bar.yml baz.yml

Просмотр зашифрованных файлов

Доступно с Ansible 1.8

Если вы хотите просмотреть содержимое зашифрованного файла без редактирования, вы можете использовать команду ansible-vault view:

ansible-vault view foo.yml bar.yml baz.yml

Использование encrypt_string для создания зашифрованных переменных для вставки в YAML

Команда ansible-vault encrypt_string зашифрует и отформатирует предоставленную строку в формат, который можно включить в файлы YAML ansible-playbook.

Чтобы зашифровать строку, переданную в качестве аргумента командной строки:

ansible-vault encrypt_string --vault-id a_password_file 'foobar' --name 'the_secret'

Результат:

some_foo: !vault |
      $ANSIBLE_VAULT;1.1;AES256
      62313365396662343061393464336163383764373764613633653634306231386433626436623361
      6134333665353966363534333632666535333761666131620a663537646436643839616531643561
      63396265333966386166373632626539326166353965363262633030333630313338646335303630
      3438626666666137650a353638643435666633633964366338633066623234616432373231333331
      6564

Чтобы использовать метку идентификатора vault для идентификатора vault ‘dev’:

ansible-vault encrypt_string --vault-id dev@password 'foooodev' --name 'the_dev_secret'

Результат:

the_dev_secret: !vault |
          $ANSIBLE_VAULT;1.2;AES256;dev
          30613233633461343837653833666333643061636561303338373661313838333565653635353162
          3263363434623733343538653462613064333634333464660a663633623939393439316636633863
          61636237636537333938306331383339353265363239643939666639386530626330633337633833
          6664656334373166630a363736393262666465663432613932613036303963343263623137386239
          6330

Чтобы зашифровать строку, прочитанную из стандартного потока ввода, и назвать её ‘db_password’:

echo 'letmein' | ansible-vault encrypt_string --vault-id dev@password --stdin-name 'db_password'

Результат:

Reading plaintext input from stdin. (ctrl-d to end input)
db_password: !vault |
          $ANSIBLE_VAULT;1.2;AES256;dev
          61323931353866666336306139373937316366366138656131323863373866376666353364373761
          3539633234313836346435323766306164626134376564330a373530313635343535343133316133
          36643666306434616266376434363239346433643238336464643566386135356334303736353136
          6565633133366366360a326566323363363936613664616364623437336130623133343530333739
          3039

Чтобы запросить строку для шифрования, зашифровать её и назвать ‘new_user_password’:

ansible-vault encrypt_string --vault-id dev@./password --stdin-name 'new_user_password'

Вывод:

Reading plaintext input from stdin. (ctrl-d to end input)

Пользователь вводит ‘hunter42’ и нажимает ctrl-d.

Результат:

new_user_password: !vault |
          $ANSIBLE_VAULT;1.2;AES256;dev
          37636561366636643464376336303466613062633537323632306566653533383833366462366662
          6565353063303065303831323539656138653863353230620a653638643639333133306331336365
          62373737623337616130386137373461306535383538373162316263386165376131623631323434
          3866363862363335620a376466656164383032633338306162326639643635663936623939666238
          3161

См. также Одиночная зашифрованная переменная

Идентификаторы Vault и несколько паролей Vault

Доступно с Ansible 2.4

Идентификатор vault — это идентификатор одного или нескольких секретов vault. Начиная с Ansible 2.4, Ansible поддерживает несколько паролей vault. Идентификаторы Vault — это способ добавить метку к конкретному паролю vault.

Зашифрованное содержимое Vault может указывать, с каким идентификатором vault оно было зашифровано.

До Ansible 2.4 можно было использовать только один пароль vault за раз. После Ansible 2.4 можно использовать несколько паролей vault при каждом запуске Ansible, поэтому все файлы или переменные vault, которые нужно было расшифровать, должны были использовать один и тот же пароль.

Начиная с Ansible 2.4, можно использовать файлы vault или переменные, которые зашифрованы различными паролями одновременно.

Например, playbook теперь может включать файл переменных, зашифрованный с идентификатором vault ‘dev’ и идентификатором vault ‘prod’.

Предоставление паролей Vault

С Ansible 2.4 рекомендуемым способом предоставления пароля vault из командной строки является использование параметра командной строки --vault-id.

Например, чтобы использовать хранилище паролей в текстовом файле /path/to/my/vault-password-file:

ansible-playbook --vault-id /path/to/my/vault-password-file site.yml

Чтобы запросить пароль:

ansible-playbook --vault-id @prompt site.yml

Чтобы получить пароль из скрипта программы vault my-vault-password.py:

ansible-playbook --vault-id my-vault-password.py

Значение для --vault-id может указывать тип идентификатора vault (запрос, путь к файлу и т. д.) и метку для идентификатора vault (‘dev’, ‘prod’, ‘cloud’ и т. д.).

Например, чтобы использовать файл паролей dev-password для идентификатора vault ‘dev’:

ansible-playbook --vault-id dev@dev-password site.yml

Чтобы запросить идентификатор vault ‘dev’:

ansible-playbook --vault-id dev@prompt site.yml

До Ansible 2.4

Чтобы запросить пароль vault, используйте параметр командной строки --ask-vault-pass:

ansible-playbook --ask-vault-pass site.yml

Чтобы указать пароль vault в текстовом файле ‘dev-password’, используйте параметр --vault-password-file:

ansible-playbook --vault-password-file dev-password site.yml

Есть параметр конфигурации (DEFAULT_VAULT_PASSWORD_FILE), чтобы указать файл пароля vault для использования без необходимости в параметре --vault-password-file командной строки.

Несколько паролей Vault

Начиная с Ansible 2.4 и более поздних версий, для использования нескольких паролей vault параметр --vault-id можно указывать несколько раз.

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

Например, чтобы использовать пароль «dev», прочитанный из файла, и запросить пароль «prod»:

ansible-playbook --vault-id dev@dev-password --vault-id prod@prompt site.yml

В приведенном выше случае пароль «dev» будет проверен в первую очередь, затем пароль «prod» в тех случаях, когда Ansible не знает, какой идентификатор хранилища используется для шифрования чего-либо.

Если содержимое хранилища было зашифровано с помощью параметра --vault-id, тогда метка идентификатора хранилища сохраняется вместе с содержимым хранилища. Когда Ansible знает правильный идентификатор хранилища, он будет пытаться использовать секрет соответствующего идентификатора хранилища в первую очередь, прежде чем проверять остальные идентификаторы хранилищ.

Существует параметр конфигурации (DEFAULT_VAULT_ID_MATCH) для принудительного соответствия метки идентификатора хранилища содержимого хранилища одному из предоставленных идентификаторов хранилища. Но по умолчанию сначала проверяется соответствие, а затем остальные идентификаторы хранилищ в порядке.

Также есть параметр конфигурации (DEFAULT_VAULT_IDENTITY_LIST) для указания списка идентификаторов хранилищ по умолчанию. Например, вместо необходимости параметра командной строки при каждом использовании, можно использовать параметр конфигурации (DEFAULT_VAULT_IDENTITY_LIST):

ansible-playbook --vault-id dev@dev-password --vault-id prod@prompt site.yml

Можно использовать --vault-id вместо параметров --vault-password-file или --ask-vault-pass, или можно использовать его в сочетании с ними.

При использовании команд ansible-vault, которые шифруют содержимое (ansible-vault encrypt, ansible-vault encrypt_string и т. д.), можно использовать только один идентификатор хранилища.

Примечание

До версии Ansible 2.4 в каждом запуске Ansible можно было использовать только один пароль хранилища. Параметр --vault-id не поддерживается до версии Ansible 2.4.

Ускорение операций с хранилищем

По умолчанию Ansible использует PyCrypto для шифрования и расшифрования файлов хранилища. Если у вас много зашифрованных файлов, их расшифровка при запуске может вызвать заметную задержку. Для ускорения этого процесса установите пакет cryptography:

pip install cryptography

Формат хранилища

Файл, зашифрованный с помощью хранилища, — это текстовый файл в кодировке UTF-8.

Формат файла включает заголовок с новой строкой.

Например:

$ANSIBLE_VAULT;1.1;AES256

Заголовок содержит идентификатор формата хранилища, версию формата хранилища и идентификатор шифра, разделенные точками с запятой «;»

Первый поле $ANSIBLE_VAULT — это идентификатор формата. В настоящее время $ANSIBLE_VAULT — единственный допустимый идентификатор формата файла. Он используется для идентификации файлов, зашифрованных с помощью хранилища (через vault.is_encrypted_file()).

Второе поле (1.1) — это версия формата хранилища. Все поддерживаемые версии Ansible в настоящее время по умолчанию устанавливают «1.1».

Формат «1.0» поддерживается только для чтения (и будет автоматически преобразован в формат «1.1» при записи). В настоящее время версия формата используется только для точного сравнения строк (версии в настоящее время не «сравниваются»).

Третье поле (AES256) определяет алгоритм шифра, используемый для шифрования данных. В настоящее время единственный поддерживаемый шифр — «AES256». [Формат хранилища 1.0 использовал «AES», но текущий код всегда использует «AES256»]

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

Остальная часть содержимого файла — это «vaulttext». Vaulttext — это зашифрованный текст, закодированный в armored виде. Каждая строка будет шириной 80 символов, за исключением последней строки, которая может быть короче.

Формат полезной нагрузки хранилища 1.1

Vaulttext — это конкатенация зашифрованного текста и хэш-суммы SHA256 с результатом «hexlifyied».

«hexlify» относится к методу hexlify() модуля binascii Python.

Результат hexlify()’ed:

  • строка salt, закодированная в hexlify(), с последующей новой строкой (‘n’)
  • строка crypted HMAC, закодированная в hexlify(), с последующей новой строкой. HMAC:

    • HMAC-стиль RFC2104 <https://www.ietf.org/rfc/rfc2104.txt>
      • входы:
        • Зашифрованный с помощью AES256 ciphertext
        • Ключ PBKDF2. Этот ключ, ключ шифра и iv шифра генерируются из:
          • соль в байтах
          • 10000 итераций
          • алгоритм SHA256()
          • первые 32 байта — ключ шифра
          • вторые 32 байта — ключ HMAC
          • оставшиеся 16 байт — iv шифра
    • строка ciphertext, закодированная в hexlify(). Ciphertext:
    • данные, зашифрованные с помощью AES256. Данные зашифрованы с использованием:
      • потоковый шифр AES-CTR
      • b_pkey1
      • iv
      • блок счётчика 128 бит, заданный целочисленным iv
      • открытый текст
        • исходный открытый текст
        • дополнение до размера блока AES256. (Данные, используемые для заполнения, основаны на RFX5652 <https://tools.ietf.org/html/rfc5652#section-6.3>)

© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.4/vault.html

Spec-Zone.ru

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