Spec-Zone.ru › Ansible 2.6

Ansible Vault

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

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

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

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

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

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

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

Ansible 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-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'

Результат:

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

Для использования метки vault-id для vault-id «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 -n '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)

Пользователь вводит «hunter2» и нажимает 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 — это текстовая бронированная версия зашифрованного шифротекста. Каждая строка будет иметь ширину 80 символов, за исключением последней строки, которая может быть короче.

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

vaulttext представляет собой конкатенацию шифротекста и хэш-суммы SHA256 с результатом «hexlifyied».

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

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

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

    • HMAC в стиле RFC2104
      • входные данные:
        • AES256 зашифрованный шифротекст
        • Ключ PBKDF2. Этот ключ, ключ шифра и IV шифра генерируются из:
          • соль в байтах
          • 10000 итераций
          • алгоритм SHA256()
          • первые 32 байта — ключ шифра
          • вторые 32 байта — ключ HMAC
          • оставшиеся 16 байтов — IV шифра
    • строка шифротекста, преобразованная в hexlify. Шифротекст:
    • зашифрованные данные AES256. Данные шифруются с использованием:
      • потокового шифра AES-CTR
      • b_pkey1
      • IV
      • 128-битовый блок счетчика, инициализированный целочисленным значением IV
      • открытый текст
        • исходный открытый текст
        • заполнение до размера блока AES256. (Данные, используемые для заполнения, основаны на RFC5652)

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

Spec-Zone.ru

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