Шифрование содержимого с помощью Ansible Vault
Ansible Vault шифрует переменные и файлы, позволяя защитить конфиденциальную информацию, такую как пароли или ключи, вместо того, чтобы оставлять её в виде открытого текста в playbooks или ролях. Для использования Ansible Vault вам нужен один или несколько паролей для шифрования и расшифрования содержимого. Если вы храните пароли vault в стороннем инструменте, например, в менеджере секретов, вам потребуется скрипт для доступа к ним. Используйте пароли с инструментом командной строки ansible-vault для создания и просмотра зашифрованных переменных, создания зашифрованных файлов, шифрования существующих файлов или редактирования, перешифрования или расшифрования файлов. Затем вы можете поместить зашифрованное содержимое под контроль версий и обмениваться им более безопасно.
Предупреждение
- Шифрование с помощью Ansible Vault ЗАЩИЩАЕТ ТОЛЬКО данные в состоянии покоя. После расшифровки содержимого (данные в процессе использования), авторы play и плагинов несут ответственность за предотвращение раскрытия секретов, см. no_log для получения подробной информации о скрытии вывода и Шаги по защите вашего редактора для соображений безопасности по редактору, который вы используете с Ansible Vault.
Вы можете использовать зашифрованные переменные и файлы в ад-хок командах и playbooks, предоставив пароли, которые вы использовали для их шифрования. Вы можете изменить свой ansible.cfg файл, чтобы указать расположение файла пароля или всегда запрашивать пароль.
-
Шифрование содержимого с помощью Ansible Vault
-
Настройка значений по умолчанию для использования зашифрованного содержимого
- Когда зашифрованные файлы становятся видимыми?
- Ускорение Ansible Vault
Управление паролями 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_encrytped_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, взаимодействующими с vault, включая ansible-vault, ansible-playbook и т. д.
Ограничения идентификаторов vault
Ansible не требует использования одного и того же пароля каждый раз, когда вы используете конкретную метку ID хранилища. Вы можете шифровать различные переменные или файлы с одной и той же меткой ID хранилища, но разными паролями. Это обычно происходит, когда вы вводите пароль в запросе и делаете ошибку. Можно намеренно использовать разные пароли с одной и той же меткой ID хранилища. Например, вы можете использовать каждую метку как ссылку на класс паролей, а не на один пароль. В этом случае вы всегда должны знать, какой конкретный пароль или файл использовать в контексте. Однако, скорее всего, вы случайно зашифруете два файла с одной и той же меткой ID хранилища и разными паролями. Если вы случайно зашифровали два файла с одной и той же меткой, но разными паролями, вы можете перешифровать один файл, чтобы исправить проблему.
Принудительное соответствие ID хранилища
По умолчанию метка ID хранилища — это лишь подсказка, чтобы напомнить вам, какой пароль вы использовали для шифрования переменной или файла. Ansible не проверяет, соответствует ли ID хранилища в заголовке зашифрованного содержимого ID хранилища, который вы предоставляете при использовании содержимого. Ansible расшифровывает все файлы и переменные, вызываемые вашей командой или playbook, которые зашифрованы с помощью предоставленного вами пароля. Чтобы проверить зашифрованное содержимое и расшифровать его только тогда, когда ID хранилища в нём соответствует тому, который вы предоставили с --vault-id, установите параметр конфигурации DEFAULT_VAULT_ID_MATCH. При установке DEFAULT_VAULT_ID_MATCH каждый пароль используется только для расшифровки данных, которые были зашифрованы с той же меткой. Это эффективно, предсказуемо и может уменьшить ошибки, когда разные значения шифруются с разными паролями.
Примечание
Даже при включенном параметре DEFAULT_VAULT_ID_MATCH, Ansible не требует использования одного и того же пароля каждый раз, когда вы используете конкретную метку ID хранилища.
Хранение и доступ к паролям хранилища
Вы можете запомнить свой пароль хранилища или вручную скопировать пароли хранилища из любого источника и вставить их в командную строку, но большинство пользователей хранят их безопасно и получают доступ к ним по мере необходимости в рамках Ansible. У вас есть два варианта для хранения паролей хранилища, которые работают внутри Ansible: в файлах или в стороннем инструменте, таком как системный ключ или менеджер секретов. Если вы храните пароли в стороннем инструменте, вам понадобится скрипт-клиент пароля хранилища для их извлечения внутри Ansible.
Хранение паролей в файлах
Чтобы сохранить пароль хранилища в файле, введите пароль в файле как строку на одной строке. Убедитесь, что разрешения файла соответствуют требованиям. Не добавляйте файлы паролей в систему управления версиями.
Хранение паролей в сторонних инструментах с помощью скриптов-клиентов паролей хранилища
Вы можете хранить пароли хранилища в системном ключе, базе данных или менеджере секретов и извлекать их внутри Ansible с помощью скрипта-клиента паролей хранилища. Введите пароль как строку на одной строке. Если ваш пароль имеет ID хранилища, сохраните его так, чтобы это работало с вашим инструментом хранения паролей.
Чтобы создать скрипт-клиента паролей хранилища:
- Создайте файл с именем, заканчивающимся на
-client.py - Сделайте файл исполняемым
-
- Внутри самого скрипта:
-
- Выведите пароли в стандартный вывод
- Примите опцию
--vault-id - Если скрипт запрашивает данные (например, пароль базы данных), отправьте запросы в стандартный вывод ошибок
При запуске playbook, использующего пароли хранилища, хранящиеся в стороннем инструменте, укажите скрипт в качестве источника внутри флага --vault-id. Например:
ansible-playbook --vault-id dev@contrib/vault/vault-keyring-client.py
Ansible выполняет скрипт-клиент с опцией --vault-id, чтобы скрипт знал, какую метку ID хранилища вы указали. Например, скрипт, загружающий пароли из менеджера секретов, может использовать метку 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, также содержит метку 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:
- источник пароля хранилища (запрос, файл или скрипт с или без ID хранилища)
- строка для шифрования
- имя строки (имя переменной)
Шаблон выглядит следующим образом:
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’, добавить метку ID хранилища ‘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’, взятую из стандартного ввода, добавить метку ID хранилища ‘test’ с использованием пароля хранилища ‘test’, хранящегося в a_password_file, и назвать переменную ‘test_db_password’:
echo -n 'letmein' | ansible-vault encrypt_string --vault-id test@a_password_file --stdin-name 'test_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’ и назначить ей метку ID хранилища ‘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 - файлы переменных в ролях
- файлы defaults в ролях
- файлы задач
- файлы обработчиков
- бинарные файлы или другие произвольные файлы
Полный файл зашифрован в хранилище.
Примечание
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.
- Отключить файлы-дубликаты, которые действуют как функция автосохранения в случае сбоя или прерывания.
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)
Использование зашифрованных переменных и файлов
При выполнении задачи или playbook, использующих зашифрованные переменные или файлы, необходимо предоставить пароли для расшифровки переменных или файлов. Вы можете сделать это в командной строке или в самом playbook.
Передача одного пароля
Если все зашифрованные переменные и файлы, необходимые вашей задаче или playbook, используют один пароль, вы можете использовать опции командной строки --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
Передача нескольких паролей хранилищ
Если вашей задаче или playbook требуются несколько зашифрованных переменных или файлов, которые вы зашифровали с помощью разных идентификаторов хранилищ, вам необходимо использовать опцию --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
Заголовок содержит до четырёх элементов, разделённых точкой с запятой (;).
- Идентификатор формата (
$ANSIBLE_VAULT). В настоящее время$ANSIBLE_VAULT— единственный допустимый идентификатор формата. Идентификатор формата идентифицирует содержимое, зашифрованное с помощью Ansible Vault (через vault.is_encrypted_file()). - Версия формата хранилища (
1.X). Все поддерживаемые версии Ansible в настоящее время по умолчанию используют ‘1.1’ или ‘1.2’, если указан идентификатор хранилища с меткой. Формат ‘1.0’ поддерживается только для чтения (и будет автоматически преобразован в формат ‘1.1’ при записи). Версия формата в настоящее время используется только для точного сравнения строк (версии в настоящее время не «сравниваются»). - Используемый алгоритм шифрования данных (
AES256). В настоящее времяAES256— единственный поддерживаемый алгоритм шифрования. Формат хранилища 1.0 использовал ‘AES’, но текущий код всегда использует ‘AES256’. - Метка идентификатора хранилища, используемого для шифрования данных (необязательно,
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–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.10/user_guide/vault.html