Поиск по сайту:

Как использовать Ansible Vault для хранения секретных ключей


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

Как и в любой системе автоматизации, Ansible нуждается в безопасном способе хранения секретов. В случае с Ansible эта система называется Ansible Vault. Ansible Vault предоставляет кроссплатформенное решение для безопасного хранения учетных данных.

Представляем Ansible Vault

Ansible Vault можно использовать для шифрования любого файла или самих переменных из playbook. По умолчанию используется AES, который представляет собой шифрование на основе общего секрета. Как файловые, так и переменные методы шифрования имеют свои преимущества и недостатки.

Шифрование файлов

Чтобы создать новый зашифрованный файл с именем secrets.yml, просто используйте следующую команду ansible-vault.

ansible-vault create secrets.yml

После запроса пароля команда ansible-vault запустит редактор системных файлов по умолчанию, в результате чего при сохранении файл будет зашифрован.

Точно так же, чтобы зашифровать ранее незашифрованный файл, используйте следующую команду ansible-vault. Обратите внимание, что здесь используется параметр encrypt, а не параметр create.

ansible-vault encrypt secrets.yml

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

Переменное шифрование

В playbook можно использовать зашифрованную переменную, поставив перед зашифрованными данными тег !vault. Выполнение аргумента encrypt_string команды ansible_vault приведет к получению зашифрованной строки, которую вы сможете использовать в своих сборниках сценариев.

ansible-vault encrypt_string 'secret_data' --name 'my_secret'

После запроса пароля вы получите следующую зашифрованную строку.

my_secret: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          37636561366636643464376336303466613062633537323632306566653533383833366462366662
          6565353063303065303831323539656138653863353230620a653638643639333133306331336365
          62373737623337616130386137373461306535383538373162316263386165376131623631323434
          3866363862363335620a376466656164383032633338306162326639643635663936623939666238
          3161

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

Использование Ansible Vault на практике

Возможно, вы понимаете, что использование Ansible Vault в производственной среде — непростая задача. Чтобы эффективно использовать Ansible Vault, следующие методы упрощают этот процесс.

  • Расшифровка без запроса
  • Несколько хранилищ
  • Смена ключа

Неожиданная расшифровка

Одним из вариантов прозрачной расшифровки файла или переменной при использовании Ansible является сохранение пароля в защищенном и неверсионном файле паролей. Чтобы сослаться на этот сохраненный пароль, просто укажите путь к файлу с помощью параметра vault-password-file.

ansible-playbook --vault-password-file /path/vault-password-file secrets.yml

Это расшифрует любые включенные зашифрованные файлы или переменные, используя включенный пароль.

Очень важно не передавать файл паролей с открытым текстом в вашу систему контроля версий. Точно так же защитите этот файл только для пользователя или группы, которым требуется доступ к сохраненному паролю в файловой системе, используя списки управления доступом (ACL).

Несколько хранилищ

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

ansible-vault create --vault-id prod@prompt prod-secrets.yml

Приведенный выше код создаст хранилище prod и запросит ваш пароль во время выполнения (как указано в строке @prompt). Если у вас уже есть файл паролей, который вы хотели бы использовать, просто укажите путь к файлу.

ansible-vault create --vault-id prod@/path/prod-vault-password-file prod-secrets.yml

Допустим, мы хотим зашифровать ту же самую переменную my_secret, но на этот раз сохранить ее в нашем хранилище prod. Как и прежде, использование encrypt_string, но с соответствующим идентификатором хранилища позволяет хранить секрет в указанном месте.

ansible-vault encrypt_string --vault-id prod@/path/prod-vault-password-file 'secret_data' --name 'my_secret'

Вы заметите, что после строки AES256 отображается новый фрагмент текста prod. Это указывает на хранилище, в котором находится зашифрованный текст.

my_secret: !vault |
          $ANSIBLE_VAULT;1.1;AES256;prod
          37636561366636643464376336303466613062633537323632306566653533383833366462366662
          6565353063303065303831323539656138653863353230620a653638643639333133306331336365
          62373737623337616130386137373461306535383538373162316263386165376131623631323434
          3866363862363335620a376466656164383032633338306162326639643635663936623939666238
          3161

Что делать, если вы хотите включить несколько хранилищ в одну книгу? Вы можете легко передать несколько объявлений vault-id в командной строке ansible-playbook.

ansible-playbook --vault-id dev@/path/dev-vault-password-file --vault-id prod@/path/prod-vault-password-file site.yml

Смена ключей

Наконец, важно регулярно менять пароли. Для файлов, которые зашифрованы, вы можете использовать приведенную ниже командную строку. Передача параметра new-vault-id упрощает изменение пароля, которым зашифрованы секреты.

ansible-vault rekey --vault-id prod@/path/prod-vault-password-file-old --new-vault-id prod@/path/prod-vault-password-file-new site.yml

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

Лучшие практики

Безопасность сложна, особенно когда речь идет об использовании секретов в системах автоматизации. Имея это в виду, ниже приведены несколько рекомендаций по использованию Ansible Vault. Хотя мы рассмотрели некоторые из них ранее, благоразумно повторить эти практики.

  • Защищенные ACL и неверсированные файлы паролейФайлы паролей не должны храниться в системах контроля версий, таких как GIT. Кроме того, убедитесь, что только соответствующие пользователи могут получить доступ к файлу паролей.
  • Отдельные хранилищаОбычно используется много разных сред. Поэтому лучше всего разделить необходимые учетные данные в соответствующие хранилища.
  • Регулярная смена ключей для файлов и переменных. В случае повторного использования или утечки паролей лучше всего регулярно менять используемые пароли, чтобы ограничить уязвимость.

Заключение

Как и в любой системе автоматизации, критически важно, чтобы секреты были должным образом защищены и контролировались. С Ansible Vault этот процесс становится простым и гибким. Используя рекомендации, описанные выше, хранение и использование секретов в Ansible является безопасным и надежным.

Чтобы еще больше расширить Ansible Vault и вывести этот процесс на новый уровень, вы можете использовать сценарии, которые интегрируются в решения по управлению паролями. Как видите, Ansible Vault — отличный способ использовать секреты в плейбуках Ansible.