Spec-Zone.ru › Ansible 2.11

Шифрование содержимого с помощью Ansible Vault

Ansible Vault шифрует переменные и файлы, чтобы вы могли защитить конфиденциальное содержимое, такое как пароли или ключи, вместо того, чтобы оставлять его в виде открытого текста в playbooks или ролях. Для использования Ansible Vault вам нужен один или несколько паролей для шифрования и дешифрования содержимого. Если вы храните пароли Vault в стороннем инструменте, таком как менеджер секретов, вам потребуется скрипт для доступа к ним. Используйте пароли с помощью инструмента командной строки ansible-vault для создания и просмотра зашифрованных переменных, создания зашифрованных файлов, шифрования существующих файлов или редактирования, перешифрования или дешифрования файлов. Затем вы можете разместить зашифрованное содержимое под управлением системы контроля версий и безопасно его разделить.

Предупреждение

  • Шифрование с помощью Ansible Vault ТОЛЬКО защищает «данные в состоянии покоя». После дешифрования содержимого («данные в использовании») авторы play и плагинов несут ответственность за предотвращение раскрытия секретов, см. no_log для получения подробностей о скрытии вывода и Шаги по защите вашего редактора для вопросов безопасности по использованию редакторов с Ansible Vault.

Вы можете использовать зашифрованные переменные и файлы в ad hoc командах и playbooks, предоставляя пароли, которые вы использовали для их шифрования. Вы можете изменить свой ansible.cfg файл, чтобы указать расположение файла паролей или всегда запрашивать пароль.

  • Управление паролями Vault

    • Выбор между одним паролем и несколькими паролями
    • Управление несколькими паролями с помощью идентификаторов Vault

      • Ограничения идентификаторов Vault
      • Принудительное соответствие идентификаторам Vault
    • Хранение и доступ к паролям Vault

      • Хранение паролей в файлах
      • Хранение паролей в сторонних инструментах с помощью скриптов клиентов паролей Vault
  • Шифрование содержимого с помощью Ansible Vault

    • Шифрование отдельных переменных с помощью Ansible Vault

      • Преимущества и недостатки шифрования переменных
      • Создание зашифрованных переменных
      • Просмотр зашифрованных переменных
    • Шифрование файлов с помощью Ansible Vault

      • Преимущества и недостатки шифрования файлов
      • Создание зашифрованных файлов
      • Шифрование существующих файлов
      • Просмотр зашифрованных файлов
      • Редактирование зашифрованных файлов
      • Изменение пароля и/или идентификатора Vault в зашифрованных файлах
      • Дешифрование зашифрованных файлов
      • Шаги по защите вашего редактора

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

    • Передача одного пароля
    • Передача идентификаторов Vault
    • Передача нескольких паролей Vault
    • Использование --vault-id без идентификатора Vault
  • Настройка по умолчанию для использования зашифрованного содержимого

    • Установка идентификатора Vault по умолчанию
    • Установка источника пароля по умолчанию
  • Когда зашифрованные файлы становятся видимыми?
  • Ускорение Ansible Vault
  • Формат файлов, зашифрованных с помощью Ansible Vault

    • Формат полезной нагрузки Ansible Vault 1.1 — 1.2

Управление паролями Vault

Управление зашифрованным содержимым упрощается, если вы разработаете стратегию управления паролями Vault. Пароль Vault может быть любой строкой по вашему выбору. Нет специальной команды для создания пароля Vault. Однако вам нужно отслеживать свои пароли Vault. Каждый раз, когда вы шифруете переменную или файл с помощью Ansible Vault, вы должны указать пароль. При использовании зашифрованной переменной или файла в команде или playbook вы должны использовать тот же пароль, который был использован для ее шифрования. Чтобы разработать стратегию управления паролями Vault, начните с двух вопросов:

  • Вы хотите зашифровать все содержимое одним паролем или использовать разные пароли для разных потребностей?
  • Где вы хотите хранить свой пароль или пароли?

Выбор между одним паролем и несколькими паролями

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

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

Управление несколькими паролями с помощью идентификаторов Vault

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

  • Передайте его с --vault-id команде ansible-vault при создании зашифрованного содержимого
  • Включите его там, где вы храните пароль для этого идентификатора Vault (см. Хранение и доступ к паролям Vault)
  • Передайте его с --vault-id команде ansible-playbook при запуске playbook, использующего содержимое, которое вы зашифровали с помощью этого идентификатора Vault

При передаче идентификатора Vault в качестве параметра команде ansible-vault, вы добавляете метку (подсказку или псевдоним) к зашифрованному содержимому. Эта метка документирует, какой пароль вы использовали для его шифрования. Зашифрованная переменная или файл включают метку идентификатора Vault в открытом тексте в заголовке. Идентификатор Vault — это последний элемент перед зашифрованным содержимым. Например:

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

В дополнение к метке вам необходимо указать источник соответствующего пароля. Источник может быть запросом, файлом или скриптом, в зависимости от того, как вы храните пароли Vault. Шаблон выглядит следующим образом:

--vault-id label@source

Если ваш playbook использует несколько зашифрованных переменных или файлов, которые вы зашифровали с помощью разных паролей, вам необходимо передать идентификаторы Vault при запуске этого playbook. Вы можете использовать --vault-id сам по себе, с --vault-password-file или с --ask-vault-pass. Шаблон аналогичен тому, как вы создаете зашифрованное содержимое: включите метку и источник соответствующего пароля.

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

Ограничения идентификаторов Vault

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

Принудительное соответствие идентификаторам хранилища

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

Примечание

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

Хранение и доступ к паролям хранилища

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

Хранение паролей в файлах

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

Хранение паролей в сторонних инструментах с помощью скриптов-клиентов паролей хранилища

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

Чтобы создать скрипт-клиент пароля хранилища:

  • Создайте файл с именем, оканчивающимся на -client.py
  • Сделайте файл исполняемым
  • Внутри самого скрипта:
    • Выведите пароли в стандартный вывод
    • Примите параметр --vault-id
    • Если скрипт запрашивает данные (например, пароль базы данных), отправьте запросы в стандартный поток ошибок

При выполнении playbook, использующего пароли хранилища, хранящиеся в стороннем инструменте, укажите скрипт в качестве источника в флаго --vault-id. Например:

ansible-playbook --vault-id dev@contrib/vault/vault-keyring-client.py

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

contrib/vault/vault-keyring-client.py --vault-id dev

Пример скрипта-клиента, загружающего пароли из системного ключа, см. contrib/vault/vault-keyring-client.py.

Шифрование содержимого с помощью Ansible Vault

После того, как вы разработали стратегию управления и хранения паролей хранилища, вы можете начать шифрование содержимого. Вы можете зашифровать два типа содержимого с помощью Ansible Vault: переменные и файлы. Зашифрованное содержимое всегда включает метку !vault, которая сообщает Ansible и YAML о необходимости расшифровки содержимого, и символ |, который позволяет использовать многострочные строки. Зашифрованное содержимое, созданное с помощью --vault-id, также содержит метку идентификатора хранилища. Более подробную информацию о процессе шифрования и формате содержимого, зашифрованного с помощью Ansible Vault, см. в Формат файлов, зашифрованных с помощью Ansible Vault. В этой таблице показаны основные различия между зашифрованными переменными и зашифрованными файлами:

Зашифрованные переменные

Зашифрованные файлы

Сколько зашифровано?

Переменные внутри текстового файла

Весь файл

Когда расшифровывается?

По запросу, только при необходимости

При каждом загрузке или ссылке 1

Что можно зашифровать?

Только переменные

Любой структурированный файл данных

1

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

Шифрование отдельных переменных с помощью Ansible Vault

Вы можете зашифровать отдельные значения внутри файла YAML с помощью команды ansible-vault encrypt_string. Один из способов безопасного отображения зашифрованных переменных см. в Keep vaulted variables safely visible.

Преимущества и недостатки шифрования переменных

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

Создание зашифрованных переменных

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

  • источник пароля хранилища (подсказка, файл или скрипт с идентификатором хранилища или без него)
  • строка для шифрования
  • имя строки (имя переменной)

Шаблон выглядит так:

ansible-vault encrypt_string <password_source> '<string_to_encrypt>' --name '<string_name_of_variable>'

Например, чтобы зашифровать строку ‘foobar’ с помощью пароля, хранящегося только в ‘a_password_file’, и назвать переменную ‘the_secret’:

ansible-vault encrypt_string --vault-password-file a_password_file 'foobar' --name 'the_secret'

Приведенная выше команда создает такое содержимое:

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

Чтобы зашифровать строку ‘foooodev’, добавить метку идентификатора хранилища ‘dev’ с паролем хранилища ‘dev’ в ‘a_password_file’, и назвать зашифрованную переменную ‘the_dev_secret’:

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

Приведенная выше команда создает такое содержимое:

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

Чтобы зашифровать строку ‘letmein’, считанную из стандартного ввода, добавить метку идентификатора хранилища ‘dev’ с использованием пароля хранилища ‘dev’, хранящегося в a_password_file, и назвать переменную ‘db_password’:

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

Предупреждение

Ввод секретного содержимого напрямую в командной строке (без запроса) оставляет секретную строку в истории вашей оболочки. Не делайте этого вне тестирования.

Приведенная выше команда создает этот вывод:

Reading plaintext input from stdin. (ctrl-d to end input, twice if your content does not already have a new line)
db_password: !vault |
          $ANSIBLE_VAULT;1.2;AES256;dev
          61323931353866666336306139373937316366366138656131323863373866376666353364373761
          3539633234313836346435323766306164626134376564330a373530313635343535343133316133
          36643666306434616266376434363239346433643238336464643566386135356334303736353136
          6565633133366366360a326566323363363936613664616364623437336130623133343530333739
          3039

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

ansible-vault encrypt_string --vault-id dev@a_password_file --stdin-name 'new_user_password'

Приведенная выше команда инициирует этот запрос:

Reading plaintext input from stdin. (ctrl-d to end input, twice if your content does not already have a new line)

Введите строку для шифрования (например, ‘hunter2’), нажмите ctrl-d и подождите.

Предупреждение

Не нажимайте Enter после ввода строки для шифрования. Это добавит перевод строки к зашифрованному значению.

Вышеприведенная последовательность создаёт этот вывод:

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

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

Просмотр зашифрованных переменных

Вы можете просмотреть исходное значение зашифрованной переменной с помощью модуля debug. Вы должны передать пароль, который использовался для шифрования переменной. Например, если вы сохранили переменную, созданную в последнем примере, в файл под названием ‘vars.yml’, вы можете просмотреть незашифрованное значение этой переменной следующим образом:

ansible localhost -m ansible.builtin.debug -a var="new_user_password" -e "@vars.yml" --vault-id dev@a_password_file

localhost | SUCCESS => {
    "new_user_password": "hunter2"
}

Шифрование файлов с помощью Ansible Vault

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

  • файлы переменных групп из инвентаризации
  • файлы переменных узлов из инвентаризации
  • файлы переменных, передаваемые в ansible-playbook с -e @file.yml или -e @file.json
  • файлы переменных, загруженные с помощью include_vars или vars_files
  • файлы переменных в ролях
  • файлы параметров в ролях
  • файлы задач
  • файлы обработчиков
  • двоичные файлы или другие произвольные файлы

Полный файл зашифрован в хранилище.

Примечание

Ansible Vault использует редактор для создания или изменения зашифрованных файлов. См. Шаги по защите вашего редактора, чтобы получить рекомендации по защите редактора.

Преимущества и недостатки шифрования файлов

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

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

Чтобы создать новый зашифрованный файл данных под названием ‘foo.yml’ с паролем хранилища ‘test’ из ‘multi_password_file’:

ansible-vault create --vault-id test@multi_password_file foo.yml

Инструмент запускает редактор (любой редактор, который вы определили с помощью $EDITOR, по умолчанию редактор — vi). Добавьте содержимое. После закрытия сессии редактора файл сохраняется как зашифрованные данные. Заголовок файла отражает идентификатор хранилища, используемый для его создания:

``$ANSIBLE_VAULT;1.2;AES256;test``

Чтобы создать новый зашифрованный файл данных с присвоенным ему идентификатором хранилища ‘my_new_password’ и запросить пароль:

ansible-vault create --vault-id my_new_password@prompt foo.yml

Опять же, добавьте содержимое в файл в редакторе и сохраните его. Обязательно сохраните новый пароль, который вы создали в окне запроса, чтобы вы могли найти его, когда захотите расшифровать этот файл.

Шифрование существующих файлов

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

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

Чтобы зашифровать существующие файлы с идентификатором ‘project’ и запросить пароль:

ansible-vault encrypt --vault-id project@prompt foo.yml bar.yml baz.yml

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

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

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

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

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

ansible-vault edit foo.yml

Чтобы отредактировать файл, зашифрованный с помощью файла паролей vault2 и присвоенного идентификатора хранилища pass2:

ansible-vault edit --vault-id pass2@vault2 foo.yml

Изменение пароля и/или идентификатора хранилища в зашифрованных файлах

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

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

Эта команда может повторно задать ключ для нескольких файлов данных одновременно и запросит исходный пароль, а также новый пароль. Чтобы установить другой идентификатор для перешифрованных файлов, передайте новый идентификатор в --new-vault-id. Например, чтобы повторно задать ключ для списка файлов, зашифрованных с идентификатором хранилища ‘preprod1’ из файла ‘ppold’ в идентификатор хранилища ‘preprod2’ и запросить новый пароль:

ansible-vault rekey --vault-id preprod1@ppold --new-vault-id preprod2@prompt foo.yml bar.yml baz.yml

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

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

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

Шаги по защите вашего редактора

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

vim

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

  1. Отключить файлы-сводки, которые действуют как функция автосохранения в случае сбоя или прерывания.
set noswapfile
  1. Отключить создание резервных файлов.
set nobackup
set nowritebackup
  1. Отключить файл viminfo для копирования данных из текущей сессии.
set viminfo=
  1. Отключить копирование в буфер обмена системы.
set clipboard=

Вы можете дополнительно добавить эти параметры в .vimrc для всех файлов или только для определенных путей или расширений. Подробности см. в руководстве vim.

Emacs

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

  1. Не копировать данные в буфер обмена системы.
(setq x-select-enable-clipboard nil)
  1. Отключить создание резервных файлов.
(setq make-backup-files nil)
  1. Отключить файлы автосохранения.
(setq auto-save-default nil)

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

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

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

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

Если у вас много зашифрованных файлов, их расшифровка при запуске может привести к ощутимой задержке. Чтобы ускорить этот процесс, установите пакет cryptography:

pip install cryptography

Формат файлов, зашифрованных Ansible Vault

Ansible Vault создаёт текстовые файлы в кодировке 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 с результатом «hexlifyied».

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

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

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

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

    END_OF_DOCUMENT_MARKER

Spec-Zone.ru

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