Как запустить Plays книги Ansible Azure, избегая хранения учетных данных в файлах?

13

Фон

  1. Мы используем Ansible для предоставления и управления инфраструктурой Azure. На данный момент мы запускаем Ansible «вручную», то есть вручную запускаем playbooks для различных автоматизированных задач. Нет инфраструктуры CI.
  2. Вероятно, не актуально, но мы управляем нашим запасом, используя динамический скрипт azure_rm.py.
  3. Мы призваны быть максимально безопасными, т.е.
    1. Не храните пароли Vault ~/.vault_passни в каком локальном файле
    2. Не храните секреты Azure в ~/.azure/credentials
    3. Не храните ничего в безопасности .bashrc.

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

Вопрос

Как избежать хранения учетных данных Ansible Vault и Azure в файлах, при этом обеспечивая доступ к моим книгам воспроизведения?

Что я пробовал

До сих пор я придумал скрипт-обертку, который

  1. спрашивает пользователя пароль Vault
  2. Использует это для расшифровки скрипта Vapted Shell
  3. Оценивает сценарий, который загружает переменные среды Azure в среду;
  4. Запускает playbook в среде, которая была настроена таким образом.

Какие-нибудь лучшие (более изящные, менее сложные, более "Ansible") решения существуют?

Вишь
источник
Что беспокоит вас больше всего в этом рабочем процессе?
Константин Суворов
1
@KonstantinSuvorov в основном это количество обручей, которые мне нужно перепрыгнуть, чтобы достичь того, что кажется (по крайней мере, мне) довольно распространенным требованием на предприятиях с высоким уровнем соответствия.
Виш

Ответы:

8

Пароль хранилища

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

Например, вы можете использовать gpg-agentили, keychainчтобы сохранить свой действительный пароль и разблокировать его при необходимости. Подробнее читайте в этом блоге: https://benincosa.com/?p=3235

Если вы немного параноик, вы можете добавить уведомление при вызове скрипта пароля, например:

#!/bin/bash
PARENT_PROCESS=$(ps -p $PPID -o args | tail -n 1)
osascript -e "display notification \"Vault password used by ${PARENT_PROCESS}\" with title \"Ansible\" sound name \"default\""
gpg --batch --use-agent --no-tty --decrypt key.gpg 2>/dev/null

Этот скрипт пароля хранилища использует в key.gpgкачестве фактического ключа хранилища, а также показывает всплывающее уведомление (для MacOS) с именем родительского процесса при использовании сценария. Gpg-agent кеширует пароль разблокировки в течение некоторого времени, поэтому нет необходимости вводить пароль при каждом запуске playbook.

Просто установите vault_password_file = ./vault_pass.shв своем ansible.cfg.

Окружающая обстановка

Вы сказали, что используете в azure_rm.pyкачестве динамического инвентаря скрипт. Это означает, что вы должны установить учетные данные в переменных среды, прежде чем запускать ansible-playbook, чтобы они могли их использовать.

Вы можете сделать два файла:

secure_env (зашифровано с хранилищем):

export AZURE_SECRET=xxx;export AZURE_SUBSCRIPTION_ID=xxx;

set_env (простой текст):

echo -n "Setting secure vars... "
eval $(ansible-vault view secure_env)
echo "done."

Когда вы открываете новый терминал для выполнения ваших задач автоматизации, вы должны запустить:

source set_env

В этот момент bash оценивает set_envи secure_env(расшифровывается с помощью ansible-vault). После этой команды у вас есть учетные данные Azure, определенные для текущей оболочки, поэтому вы можете выполнять playbooks как обычно:

ansible-playbook provision-my-azure-instances.yml

Таким образом, используя эти два подхода, вы можете хранить key.gpgи secure_envв своем хранилище; затем в новом вызове терминала source set_envодин раз введите пароль gpg (чтобы разблокировать использование key.gpg в будущем); затем звоните ansible-playbookстолько раз, сколько хотите, без каких-либо паролей.

Константин Суворов
источник
Спасибо за ответ. Позвольте мне попробовать это в течение недели.
Виш
Итак, главное преимущество по сравнению с моим первоначальным подходом состоит в том, что он использует GPG - что повышает преимущества кэширования - верно? Экологический подход похож на то, что я придумал.
Виш
1
Из вашего ОП я понимаю, что вы используете обертку каждый раз, когда запускаете playbook. При sourceтаком подходе вы устанавливаете среду один раз за терминальную сессию и можете использовать весь спектр инструментов отдельно: ansible-playbooks, инвентаризационные скрипты, azure cli, без каких-либо оболочек.
Константин Суворов
Ах, понял. Я передам это моей команде. Принятие вашего ответа как более удобного решения. Спасибо за исследование и объяснение! Также мне понравился твой блог :)
Vish
Основное преимущество использования GPG (или цепочки для ключей в macOS или Linux) заключается в том, что каждый член команды имеет собственную аутентификацию для разблокировки личного ключа, уникального для них. Этот ключ затем используется для разблокировки пароля Ansible Vault, который является общим секретом. Вы должны повернуть все свои секреты, если кто-то покинет команду, включая пароль Ansible Vault, но, по крайней мере, пароли GPG / связки ключей не нужно менять.
RichVel
2

Пожалуйста, прочитайте https://docs.ansible.com/ansible/2.4/vault.html Начиная с Ansible 2.4 можно использовать --vault-id @prompt.

Зашифруйте файл с помощью ansible-vault:

ansible-vault encrypt /path/to/encrypted/file

Запустите playbook, и это приведет к:

fatal: [localhost]: FAILED! => {"msg": "A vault password or secret must be
specified to decrypt /path/to/encrypted/file"}

Существует несколько вариантов расшифровки файлов, в том числе @prompt:

ansible-playbook some-playbook --vault-id @prompt

подскажет:

Vault password (default):

После ввода пароля хранилища книга воспроизведения должна быть успешной.

030
источник
1
Читая страницу, она выглядит так, как будто есть решение, но не может понять, используя только ссылку. Не могли бы вы уточнить?
Виш
Спасибо за разработку. Я действительно требую, чтобы пользователь спросил пароль хранилища - используя более старую --ask-vault-passопцию. И я не понимаю, как заменить его --vault-idответом на более важный вопрос о лучшем рабочем процессе.
Виш
Когда вы отсылали меня к ссылке , которую я сделал видеть один интригующий вариант: ansible-playbook --vault-id my-vault-password.py. Я подумал, что, возможно, у вас есть решение об использовании скрипта на Python :) Я также немного обдумываю этот вопрос.
Виш