Spec-Zone.ru › Ansible

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

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

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

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

Что именно шифруется?

Переменные в незашифрованном файле

Весь файл

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

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

При каждой загрузке или ссылке на файл [1]

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

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

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

[1]

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

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

С помощью команды ansible-vault encrypt_string можно зашифровать отдельные значения в YAML-файле. Один из способов безопасно отображать переменные из хранилища см. в разделе Безопасное отображение переменных из хранилища.

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

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

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

Команда ansible-vault encrypt_string шифрует любую введенную (или скопированную либо сгенерированную) строку и форматирует ее так, чтобы ее можно было включить в плейбук, роль или файл переменных. Чтобы создать простую зашифрованную переменную, передайте команде 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», считанную из stdin, добавить идентификатор хранилища «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

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

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

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

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

Чтобы создать новый зашифрованный файл данных «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

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

Если нужно лишь проверить содержимое зашифрованной строки, ее можно просмотреть, передав через stdin:

echo -e '$ANSIBLE_VAULT;1.1;V2\neyJrZXkiOiAiZ0FBQUFBQm5UYzlPUVgzeUc5NFo3R2pzYVNMSXVsdXA3Z0paMmczNVRtS0NqMUcwMTVx\nSU1JVDlJZlRrSXBkVThmLXhKS00xZGl6X3F3YXZmWWUteGJWaHNZZXZNWl9hMWZvLVRYM3ZUZDRvaHRR\nWkhIdkJmZEZWNlBwVjhNVjJFT05QbDFwandaazAiLCAiY2lwaGVydGV4dCI6ICJnQUFBQUFCblRjOU9u\nWmM2dDh2VEN5c3NTQVlyV0hMclNEOFZfSGd2eEVHdERCdkJfakFpcUpaWWNTV19sR2hPY0VsWEVweS0z\nQ0NBcmJfdUdsUEt0NzJuSmFxVVVmRFIzdz09In0=' | ansible-vault decrypt

Кроме того, можно использовать следующую команду, чтобы Ansible запросил ввод (нажмите Ctrl+D дважды, чтобы завершить ввод), как и при использовании encrypt_string:

ansible-vault decrypt
Reading ciphertext input from stdin

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

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)

© 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_encrypting_content.html

Spec-Zone.ru

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