Ansible Vault
- Что можно зашифровать с помощью Vault
- Создание зашифрованных файлов
- Редактирование зашифрованных файлов
- Переключить ключи в зашифрованных файлах
- Шифрование незашифрованных файлов
- Расшифровка зашифрованных файлов
- Просмотр зашифрованных файлов
- Использование encrypt_string для создания зашифрованных переменных для вставки в YAML
- Идентификаторы Vault и несколько паролей Vault
- Предоставление паролей Vault
- Ускорение операций Vault
- Формат Vault
- Формат полезной нагрузки Vault 1.1
Новая функция «Vault» в Ansible 1.5 позволяет хранить конфиденциальные данные, такие как пароли или ключи, в зашифрованных файлах вместо обычного текста в ваших playbook или ролях. Эти файлы Vault можно затем распространять или размещать в системе контроля версий.
Для активации этой функции используется командная утилита - ansible-vault - для редактирования файлов, и флаг командной строки (--ask-vault-pass или --vault-password-file) используется. В качестве альтернативы вы можете указать расположение файла пароля или использовать команду Ansible, чтобы всегда запрашивать пароль в файле ansible.cfg. Эти параметры не требуют использования флага командной строки.
Для получения рекомендаций по лучшим практикам обратитесь к Переменные и Vault.
Что можно зашифровать с помощью Vault
Функция vault может зашифровать любой структурированный файл данных, используемый Ansible. Это может включать переменные инвентаризации «group_vars/» или «host_vars/», переменные, загруженные с помощью «include_vars» или «vars_files», или файлы переменных, передаваемые в командной строке ansible-playbook с помощью -e @file.yml или -e @file.json. Также включаются переменные и значения по умолчанию ролей.
Задачи, обработчики и т. д. Ansible также являются данными, поэтому их можно зашифровать с помощью vault. Чтобы скрыть имена используемых переменных, вы можете зашифровать файлы задач целиком.
Функция 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 1.8
Если вы хотите просмотреть содержимое зашифрованного файла без редактирования, вы можете использовать команду 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'
Результат:
some_foo: !vault |
$ANSIBLE_VAULT;1.1;AES256
62313365396662343061393464336163383764373764613633653634306231386433626436623361
6134333665353966363534333632666535333761666131620a663537646436643839616531643561
63396265333966386166373632626539326166353965363262633030333630313338646335303630
3438626666666137650a353638643435666633633964366338633066623234616432373231333331
6564
Чтобы использовать метку идентификатора vault для идентификатора vault ‘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 '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)
Пользователь вводит ‘hunter42’ и нажимает 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 — это зашифрованный текст, закодированный в armored виде. Каждая строка будет шириной 80 символов, за исключением последней строки, которая может быть короче.
Формат полезной нагрузки хранилища 1.1
Vaulttext — это конкатенация зашифрованного текста и хэш-суммы SHA256 с результатом «hexlifyied».
«hexlify» относится к методу hexlify() модуля binascii Python.
Результат hexlify()’ed:
- строка salt, закодированная в hexlify(), с последующей новой строкой (‘n’)
-
строка crypted HMAC, закодированная в hexlify(), с последующей новой строкой. HMAC:
- HMAC-стиль
RFC2104 <https://www.ietf.org/rfc/rfc2104.txt>- входы:
- Зашифрованный с помощью AES256 ciphertext
- Ключ PBKDF2. Этот ключ, ключ шифра и iv шифра генерируются из:
- соль в байтах
- 10000 итераций
- алгоритм SHA256()
- первые 32 байта — ключ шифра
- вторые 32 байта — ключ HMAC
- оставшиеся 16 байт — iv шифра
- входы:
- строка ciphertext, закодированная в hexlify(). Ciphertext:
- данные, зашифрованные с помощью AES256. Данные зашифрованы с использованием:
- потоковый шифр AES-CTR
- b_pkey1
- iv
- блок счётчика 128 бит, заданный целочисленным iv
- открытый текст
- исходный открытый текст
- дополнение до размера блока AES256. (Данные, используемые для заполнения, основаны на
RFX5652 <https://tools.ietf.org/html/rfc5652#section-6.3>)
- HMAC-стиль
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.4/vault.html