Шифрование содержимого с помощью Ansible Vault
После того как вы выбрали стратегию управления паролями хранилища и их хранения, можно приступать к шифрованию содержимого. С помощью Ansible Vault можно шифровать два типа содержимого: переменные и файлы. Зашифрованное содержимое всегда включает тег !vault, который сообщает Ansible и YAML, что содержимое необходимо расшифровать, и символ |, позволяющий использовать многострочные строки. Зашифрованное содержимое, созданное с помощью --vault-id, также содержит метку идентификатора хранилища. Подробнее о процессе шифрования и формате содержимого, зашифрованного с помощью Ansible Vault, см. в разделе Формат файлов, зашифрованных с помощью Ansible Vault. В этой таблице показаны основные различия между зашифрованными переменными и зашифрованными файлами:
Зашифрованные переменные | Зашифрованные файлы | |
|---|---|---|
Что именно шифруется? | Переменные в незашифрованном файле | Весь файл |
Когда выполняется расшифровка? | По запросу, только при необходимости | При каждой загрузке или ссылке на файл [1] |
Что можно зашифровать? | Только переменные | Любой файл со структурированными данными |
Шифрование отдельных переменных с помощью 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.
- Отключите файлы подкачки, которые действуют как автосохранение при сбое или прерывании работы.
set noswapfile
- Отключите создание файлов резервных копий.
set nobackup set nowritebackup
- Отключите файл viminfo, чтобы он не копировал данные из текущего сеанса.
set viminfo=
- Отключите копирование в системный буфер обмена.
set clipboard=
При необходимости добавьте эти настройки в .vimrc для всех файлов или только для определенных путей либо расширений. Подробнее см. в руководстве vim.
Emacs
Чтобы избежать утечек, можно задать следующие параметры Emacs. Возможно, для обеспечения безопасности потребуется изменить и другие настройки, особенно при использовании плагинов, поэтому ознакомьтесь с документацией Emacs.
- Запретите копирование данных в системный буфер обмена.
(setq x-select-enable-clipboard nil)
- Отключите создание файлов резервных копий.
(setq make-backup-files nil)
- Отключите файлы автосохранения.
(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