Где поставить пароль от хранилища

26

Мы планируем использовать ansible vault в нашем проекте, чтобы предотвратить утечку паролей или ключей в git.

Идея состоит в том, чтобы поместить все наши конфиденциальные данные в простой файл, а затем зашифровать этот файл с помощью ansible-vault с помощью пароля, прежде чем нажимать на git.

Чтобы расшифровать файл, мы должны передать пароль хранилища в ansible, я думаю о 3 возможностях:

  • Храните его в переменной окружения сервера
  • Передайте его как опцию команде ansible-playbook
  • Сохраните его в не версионный файл.

Есть ли какие-либо другие варианты, которые являются лучшим (и безопасным) способом для хранения пароля ansible-vault, в документации по ANSI ничего не сказано об этом.

буря
источник
Очень актуальный разговор: danielsomerfield.github.io/turtles
Сюн Чиамов
Есть некоторые хорошие ответы здесь: devops.stackexchange.com/questions/3806/...
Вишь

Ответы:

13

Идея состоит в том, чтобы поместить все наши конфиденциальные данные [...]

Значение «все» в этом предложении должно быть тщательно проанализировано, прежде чем внедрять решение, которое вы планируете.

Ansible vault - очень полезный инструмент, но его следует использовать только для хранения секретов, которые:

  1. Специально необходим для развертывания
  2. Легко сделать бесполезным для владельцев, которые должны не знать о них, но которые могут незаконно «запомнить» их (как правило, уволенные сотрудники)

Второй момент имеет решающее значение.

Многие люди и, возможно, вся команда DevOps будут иметь доступ к паролю к хранилищу и, следовательно, ко всем секретам.

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

В частности, если вы используете ansible для развертывания базы данных и ее пользователей, вы можете хранить пароли в хранилище, но вам придется быть очень осторожным (и, скорее всего, рассмотреть другое решение), если эта служба будет доступна из Интернета. и без необходимости какой-либо аутентификации VPN!

Пользователи (DevOps), раскрывающие секрет, должны быть неспособны использовать «запомненные» пароли, если на них наложен один барьер безопасности (например, аннулирован доступ к VPN). В дополнение к этому, доступ к хранилищу исходного кода (где хранится хранилище) также должен быть аннулирован до изменения паролей.

В этих условиях ансайловое хранилище является очень полезным инструментом.

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

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

В условиях предыдущего параграфа, я думаю, что хорошей практикой будет:

  1. Храните пароль хранилища во внешнем безопасном хранилище (что-то вроде Vault от HashiCorp или любого SaaS для управления учетными данными)
  2. Разрешить доступ к внешнему элементу хранилища для DevOps (для тестирования им потребуется пароль), а также для системы CI / CD или контроллера ANSI
  3. Соблюдайте соглашение об использовании секретов ! Вы не сможете просматривать изменения в секретах, и вы не сможете найти доступные переменные в файлах секретов! Так что будьте внимательны с самого начала. Хорошим соглашением является присвоение secret_префиксам всех переменных, хранящихся в хранилище ansible . Когда вы увидите что-то вроде:

    postgres.yml:

    postgres_password: "{{ secret_postgres_password }}"
    

    вы будете знать, что значение хранится в хранилище ansible.

Винченцо Пии
источник
1
Полезно хранить пароль Ansible Vault в более безопасном месте (хранилище HashiCorp или SaaS, например, AWS Secrets Manager). Тем не менее, он все равно должен быть повернут (изменен), если кто-то покидает команду, так как он имел к ней доступ, даже если ненадолго. Это может быть смягчено, возможно, с помощью отдельных хранилищ (dev, test, production), то есть секретных файлов в YAML. Ansible 2.4+ также позволяет указывать разные пароли для таких файлов с помощью «идентификатора хранилища» - страница документов
RichVel
1
В Ansible 2.3 появилась функция, которая шифрует только значения в файлах YAML, а не весь файл - это проще поддерживать, чем старое соглашение, которое вы упомянули в пункте 3 в конце этого ответа.
RichVel
7

Мы планируем использовать ansible vault в нашем проекте, чтобы предотвратить утечку паролей или ключей в git.

Поскольку вы еще ничего не реализовали, вы можете пересмотреть это. Использование системы, подобной Ansible Vault, имеет ряд недостатков безопасности:

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

Потенциально гораздо более безопасная, хотя и более сложная система, которая не имеет этих недостатков, - это использовать Hashicorp Vault для хранения ваших секретов. Затем вы все равно можете извлечь значения из него почти так же легко, как из хранилища Ansible, используя https://github.com/jhaals/ansible-vault .

Затем вам придется управлять аутентификацией в Hashicorp Vault, и это вопрос черепахи . Для людей, я думаю, лучшее решение - периодически запрашивать пароль и истекать токен через короткое время; для машин - использовать бэкэнд аутентификации AWS или аналогичный. Вы никогда не сможете полностью избавиться от необходимости аутентификации где-либо, но вы можете усложнить злоумышленнику доступ к нему.

Теперь, если настройка и администрирование сервера секретов слишком сложны для вас, тогда, конечно, вы можете просто использовать Ansible vault. Зачем вообще хранить пароль на отдельных машинах? Для интерактивного использования вы можете просто запросить пароль, и пользователи могут сохранить его в выбранном менеджере паролей. iTerm на OS X имеет менеджер паролей, который интегрируется с Keychain.app, что делает это особенно легко там.

Xiong Chiamiov
источник
2
Лучший способ использовать ansible vault - не использовать его. Спасибо, что указали на это!
шторм
1
Для малых и средних организаций я бы порекомендовал обратиться к облачному менеджеру секретов, такому как AWS Secrets Manager - это гораздо меньше работы, чем запуск высокодоступного кластера для HashiCorp Vault, но значительное улучшение безопасности, которую вы получаете с Ansible Хранилище, включая аудит и гранулярный контроль доступа. Конечно, вы в конечном итоге зависите от этой службы, но она может быть инкапсулирована с помощью некоторого кодирования приложения и работы Ansible. Основным преимуществом является то, что Ansible вообще не нужно управлять некоторыми секретами, например паролями БД - просто дайте приложению получить секрет от менеджера секретов.
RichVel
3

Это в значительной степени касается внутренних политик обработки конфиденциальных данных.

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

export ANSIBLE_VAULT_PASSWORD_FILE=/deep/dark/place

У меня это есть на моей рабочей станции (так как мне нужно тестировать и разрабатывать игровые книги), у некоторых коллег оно есть, и, конечно, у нас оно есть на главном управляющем компьютере Ansible.

Плюсы:

  • не в общей папке / хранилище (как вы говорите, это не версионный файл)
  • для запуска игры не нужно знать пароль Ansible vault (это при условии, что у вас есть инструмент CI, например Jenkins, где вы можете легко запускать playbooks)

Минусы:

  • не легко повернуть пароль
  • каждый, кто работает над вашими пьесами, должен иметь его на своей рабочей станции

У минусов есть свои недостатки, но опять-таки это зависит от политик и правил, которые вы приняли в своей повседневной деятельности.

13dimitar
источник
1
Хорошая комбинация ... проверьте другой ответ, хотя он может быть вам интересен.
шторм
0

Взгляните на этот проект, чтобы управлять паролями, зашифровывающими ваши ответные хранилища https://github.com/Smile-SA/ansible-vault-manager

Он поддерживает несколько платформ хранения ключей с помощью плагинов (на данный момент реализован только AWS SSM). Более того, интеграция с текущим проектом Ansible очень проста ...

gillg
источник
Было бы полезно, если бы вы сделали проще более конкретным, а не добавив что-то общее. Я прочитал README на странице github, но не могли бы вы изменить ответ, чтобы он содержал наглядный пример? Я хотел бы попробовать это.
030