Ansible Vault
- Что можно зашифровать с помощью Vault
- Создание зашифрованных файлов
- Редактирование зашифрованных файлов
- Переключение ключей для зашифрованных файлов
- Шифрование незашифрованных файлов
- Дешифрование зашифрованных файлов
- Просмотр зашифрованных файлов
- Использование encrypt_string для создания зашифрованных переменных для встраивания в YAML
- Vault-идентификаторы и несколько паролей Vault
- Предоставление паролей Vault
- Ускорение операций Vault
- Формат Vault
- Формат полезной нагрузки Vault 1.1
Ansible Vault — это функция Ansible, которая позволяет хранить конфиденциальные данные, такие как пароли или ключи, в зашифрованных файлах вместо открытого текста в playbook или ролях. Эти файлы Vault можно затем распространять или размещать в системе управления версиями.
Для включения этой функции используется командная утилита — ansible-vault — для редактирования файлов, а командный флаг (--ask-vault-pass или --vault-password-file) используется. В качестве альтернативы вы можете указать расположение файла пароля или попросить Ansible всегда запрашивать пароль в файле ansible.cfg. Эти параметры не требуют использования флагов командной строки.
Для получения рекомендаций по лучшим практикам обратитесь к Переменные и хранилища Vault.
Что можно зашифровать с помощью Vault
Ansible Vault может шифровать любые файлы структурированных данных, используемые Ansible. Это может включать переменные инвентаризации в каталогах «group_vars/» или «host_vars/», переменные, загруженные с помощью «include_vars» или «vars_files», или файлы переменных, передаваемые в командную строку ansible-playbook с помощью -e @file.yml или -e @file.json. Также включаются переменные и значения по умолчанию ролей.
Также задачи, обработчики и так далее Ansible являются данными, поэтому их также можно зашифровать с помощью Vault. Чтобы скрыть имена переменных, которые вы используете, можно зашифровать файлы задач целиком.
Ansible Vault также может шифровать произвольные файлы, даже двоичные файлы. Если зашифрованный файлом Vault файл передается в качестве аргумента src модулям copy, template, unarchive, script или assemble, файл будет размещен на целевом хосте в дешифрованном виде (при условии, что при выполнении задачи предоставлен действительный пароль vault).
Начиная с версии 2.3, Ansible поддерживает шифрование отдельных значений внутри файла YAML с помощью тега !vault для информирования YAML и Ansible об использовании специальной обработки. Эта функция рассматривается более подробно ниже.
Создание зашифрованных файлов
Для создания нового зашифрованного файла данных выполните следующую команду:
ansible-vault create foo.yml
Сначала вам будет предложено ввести пароль. Пароль, используемый с Vault, в настоящее время должен быть одинаковым для всех файлов, которые вы хотите использовать вместе в одно и то же время.
После ввода пароля инструмент запустит редактор, который вы определили с помощью переменной $EDITOR, по умолчанию это vi (до версии 2.1 по умолчанию был vim). После завершения сессии редактора файл будет сохранён как зашифрованные данные.
По умолчанию используется шифр AES (который основан на общем секрете).
Редактирование зашифрованных файлов
Для редактирования зашифрованного файла на месте используйте команду ansible-vault edit. Эта команда дешифрует файл во временный файл и позволит вам отредактировать его, сохранив его после завершения и удалив временный файл:
ansible-vault edit foo.yml
Переключение ключей для зашифрованных файлов
Если вам нужно изменить пароль для файла или файлов, зашифрованных с помощью Vault, вы можете сделать это с помощью команды rekey:
ansible-vault rekey foo.yml bar.yml baz.yml
Эта команда может переключить ключи для нескольких файлов данных одновременно и запросит исходный пароль, а также новый пароль.
Шифрование незашифрованных файлов
Если у вас есть существующие файлы, которые вы хотите зашифровать, используйте команду ansible-vault encrypt. Эта команда может обрабатывать несколько файлов одновременно:
ansible-vault encrypt foo.yml bar.yml baz.yml
Дешифрование зашифрованных файлов
Если у вас есть существующие файлы, которые вы больше не хотите хранить в зашифрованном виде, вы можете окончательно дешифровать их, выполнив команду ansible-vault decrypt. Эта команда сохранит их в незашифрованном виде на диске, поэтому убедитесь, что вам не нужен ansible-vault edit:
ansible-vault decrypt foo.yml bar.yml baz.yml
Просмотр зашифрованных файлов
Если вы хотите просмотреть содержимое зашифрованного файла, не редактируя его, вы можете использовать команду ansible-vault view:
ansible-vault view foo.yml bar.yml baz.yml
Использование encrypt_string для создания зашифрованных переменных для встраивания в YAML
Команда ansible-vault encrypt_string зашифрует и отформатирует предоставленную строку в формате, который можно включить в файлы YAML ansible-playbook.
Для шифрования строки, предоставленной как аргумент командной строки:
ansible-vault encrypt_string --vault-id a_password_file 'foobar' --name 'the_secret'
Результат:
the_secret: !vault |
$ANSIBLE_VAULT;1.1;AES256
62313365396662343061393464336163383764373764613633653634306231386433626436623361
6134333665353966363534333632666535333761666131620a663537646436643839616531643561
63396265333966386166373632626539326166353965363262633030333630313338646335303630
3438626666666137650a353638643435666633633964366338633066623234616432373231333331
6564
Для использования метки vault-id для vault-id «dev»:
ansible-vault encrypt_string --vault-id dev@password 'foooodev' --name 'the_dev_secret'
Результат:
the_dev_secret: !vault |
$ANSIBLE_VAULT;1.2;AES256;dev
30613233633461343837653833666333643061636561303338373661313838333565653635353162
3263363434623733343538653462613064333634333464660a663633623939393439316636633863
61636237636537333938306331383339353265363239643939666639386530626330633337633833
6664656334373166630a363736393262666465663432613932613036303963343263623137386239
6330
Для шифрования строки, считанной из стандартного ввода, и именования её «db_password»:
echo -n 'letmein' | ansible-vault encrypt_string --vault-id dev@password --stdin-name 'db_password'
Результат:
Reading plaintext input from stdin. (ctrl-d to end input)
db_password: !vault |
$ANSIBLE_VAULT;1.2;AES256;dev
61323931353866666336306139373937316366366138656131323863373866376666353364373761
3539633234313836346435323766306164626134376564330a373530313635343535343133316133
36643666306434616266376434363239346433643238336464643566386135356334303736353136
6565633133366366360a326566323363363936613664616364623437336130623133343530333739
3039
Для запроса строки для шифрования, её шифрования и присвоения имени «new_user_password»:
ansible-vault encrypt_string --vault-id dev@./password --stdin-name 'new_user_password'
Вывод:
Reading plaintext input from stdin. (ctrl-d to end input)
Пользователь вводит «hunter2» и нажимает ctrl-d.
Результат:
new_user_password: !vault |
$ANSIBLE_VAULT;1.2;AES256;dev
37636561366636643464376336303466613062633537323632306566653533383833366462366662
6565353063303065303831323539656138653863353230620a653638643639333133306331336365
62373737623337616130386137373461306535383538373162316263386165376131623631323434
3866363862363335620a376466656164383032633338306162326639643635663936623939666238
3161
См. также Одиночная зашифрованная переменная
Vault-идентификаторы и несколько паролей Vault
Доступно начиная с Ansible 2.4
Vault-идентификатор — это идентификатор одного или нескольких секретов Vault. Начиная с Ansible 2.4, Ansible поддерживает несколько паролей Vault. Vault-идентификаторы — это способ присвоения метки конкретному паролю Vault.
Зашифрованное содержимое Vault может указывать, с каким vault-идентификатором оно было зашифровано.
До версии Ansible 2.4 одновременно можно было использовать только один пароль Vault. После Ansible 2.4 можно использовать несколько паролей Vault каждый раз при запуске Ansible, поэтому все файлы Vault или переменные, которые нужно было расшифровать, должны были использовать один и тот же пароль.
Начиная с Ansible 2.4, можно использовать файлы Vault или переменные, зашифрованные с помощью разных паролей одновременно.
Например, playbook теперь может включать файл переменных, зашифрованный с vault-идентификатором «dev», и vault-идентификатором «prod».
Предоставление паролей Vault
Начиная с Ansible 2.4, рекомендуемый способ предоставления пароля Vault из командной строки — использовать параметр командной строки --vault-id.
Например, для использования хранилища паролей в текстовом файле /path/to/my/vault-password-file:
ansible-playbook --vault-id /path/to/my/vault-password-file site.yml
Для запроса пароля:
ansible-playbook --vault-id @prompt site.yml
Для получения пароля из исполняемого скрипта пароля Vault my-vault-password.py:
ansible-playbook --vault-id my-vault-password.py
Значение параметра --vault-id может указывать тип vault-идентификатора (запрос, путь к файлу и т. д.) и метку vault-идентификатора («dev», «prod», «cloud» и т. д.).
Например, для использования файла пароля dev-password для vault-идентификатора «dev»:
ansible-playbook --vault-id dev@dev-password site.yml
Для запроса vault-идентификатора «dev»:
ansible-playbook --vault-id dev@prompt site.yml
До версии Ansible 2.4
Для запроса пароля Vault используйте параметр командной строки --ask-vault-pass:
ansible-playbook --ask-vault-pass site.yml
Для указания пароля Vault в текстовом файле «dev-password» используйте параметр --vault-password-file:
ansible-playbook --vault-password-file dev-password site.yml
Есть параметр конфигурации (DEFAULT_VAULT_PASSWORD_FILE), чтобы указать файл пароля Vault для использования без необходимости параметра --vault-password-file командной строки.
Несколько паролей Vault
Начиная с Ansible 2.4 и более поздних версий, для использования нескольких паролей Vault, параметр --vault-id может быть указан несколько раз.
Если указано несколько паролей хранилища, по умолчанию Ansible попытается расшифровать содержимое хранилища, перебирая каждый секрет хранилища в порядке их предоставления в командной строке.
Например, чтобы использовать пароль «dev», считанный из файла, и запросить пароль «prod»:
ansible-playbook --vault-id dev@dev-password --vault-id prod@prompt site.yml
В приведенном выше случае пароль «dev» будет проверен в первую очередь, затем пароль «prod» в тех случаях, когда Ansible не знает, какой идентификатор хранилища используется для шифрования чего-либо.
Если содержимое хранилища было зашифровано с помощью параметра --vault-id, то метка идентификатора хранилища сохраняется вместе с содержимым хранилища. Когда Ansible знает правильный идентификатор хранилища, он сначала попробует секрет соответствующего идентификатора хранилища, прежде чем перебирать остальные идентификаторы хранилищ.
Существует параметр конфигурации (DEFAULT_VAULT_ID_MATCH) для принудительного соответствия метки идентификатора хранилища содержимого хранилища одному из предоставленных идентификаторов хранилища. Но по умолчанию сначала проверяется соответствие, а затем остальные идентификаторы хранилища в порядке.
Также есть параметр конфигурации (DEFAULT_VAULT_IDENTITY_LIST), чтобы указать список по умолчанию используемых идентификаторов хранилища. Например, вместо того, чтобы требовать параметр командной строки при каждом использовании, можно использовать параметр конфигурации (DEFAULT_VAULT_IDENTITY_LIST):
ansible-playbook --vault-id dev@dev-password --vault-id prod@prompt site.yml
Можно использовать --vault-id вместо --vault-password-file или --ask-vault-pass, или использовать его в сочетании с ними.
При использовании команд ansible-vault, которые шифруют содержимое (ansible-vault encrypt, ansible-vault encrypt_string и т. д.), можно использовать только один идентификатор хранилища.
Примечание
До Ansible 2.4 в каждом запуске Ansible можно было использовать только один пароль хранилища. Параметр --vault-id не поддерживался до Ansible 2.4.
Ускорение операций с хранилищем
По умолчанию Ansible использует PyCrypto для шифрования и дешифрования файлов хранилища. Если у вас много зашифрованных файлов, их дешифровка при запуске может вызвать заметную задержку. Чтобы ускорить этот процесс, установите пакет cryptography:
pip install cryptography
Формат хранилища
Файл, зашифрованный в хранилище, — это текстовый файл UTF-8.
Формат файла включает заголовок с новой строкой.
Например:
$ANSIBLE_VAULT;1.1;AES256
Заголовок содержит идентификатор формата хранилища, версию формата хранилища и идентификатор шифра, разделенные точкой с запятой «;»
Первое поле $ANSIBLE_VAULT — это идентификатор формата. В настоящее время $ANSIBLE_VAULT — единственный допустимый идентификатор формата файла. Он используется для идентификации файлов, зашифрованных в хранилище (через vault.is_encrypted_file()).
Второе поле (1.1) — это версия формата хранилища. Все поддерживаемые версии Ansible в настоящее время по умолчанию устанавливаются в «1.1».
Формат «1.0» поддерживается только для чтения (и будет автоматически преобразован в формат «1.1» при записи). В настоящее время версия формата используется только для точного сравнения строк (номера версий в настоящее время не «сравниваются»).
Третье поле (AES256) идентифицирует алгоритм шифра, используемый для шифрования данных. В настоящее время единственным поддерживаемым шифром является «AES256». [Формат хранилища 1.0 использовал «AES», но текущий код всегда использует «AES256»]
Примечание: в будущем заголовок может измениться. Все, что следует после идентификатора и версии хранилища, можно считать зависящим от версии формата хранилища. Это включает идентификатор шифра и любые дополнительные поля, которые могут следовать за ним.
Остальное содержимое файла — это «vaulttext». vaulttext — это текстовая бронированная версия зашифрованного шифротекста. Каждая строка будет иметь ширину 80 символов, за исключением последней строки, которая может быть короче.
Формат загрузки хранилища 1.1
vaulttext представляет собой конкатенацию шифротекста и хэш-суммы SHA256 с результатом «hexlifyied».
«hexlify» относится к методу hexlify() модуля binascii в Python.
Результат hexlify() от:
- строка salt, преобразованная в hexlify(), за которой следует новая строка (‘n’)
-
строка crypted HMAC, преобразованная в hexlify(), за которой следует новая строка. HMAC:
- HMAC в стиле RFC2104
- входные данные:
- AES256 зашифрованный шифротекст
- Ключ PBKDF2. Этот ключ, ключ шифра и IV шифра генерируются из:
- соль в байтах
- 10000 итераций
- алгоритм SHA256()
- первые 32 байта — ключ шифра
- вторые 32 байта — ключ HMAC
- оставшиеся 16 байтов — IV шифра
- входные данные:
- строка шифротекста, преобразованная в hexlify. Шифротекст:
- зашифрованные данные AES256. Данные шифруются с использованием:
- потокового шифра AES-CTR
- b_pkey1
- IV
- 128-битовый блок счетчика, инициализированный целочисленным значением IV
- открытый текст
- исходный открытый текст
- заполнение до размера блока AES256. (Данные, используемые для заполнения, основаны на RFC5652)
- HMAC в стиле RFC2104
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.6/user_guide/vault.html