Як запустити ігрові книги Ansible Azure, уникаючи збереження облікових даних у файлах?


13

Фон

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

У такому сценарії у мене виникають труднощі при розробці цілісної стратегії, щоб забезпечити доступ моїх ігрових книжок до секретів Azure, дотримуючись наведених вище вказівок.

Питання

Як я можу уникнути зберігання облікових даних Ansible Vault та Azure у файлах, при цьому забезпечуючи доступ до них моїх ігрових книжок?

Що я спробував

Поки що я придумав сценарій обгортки, який

  1. запитує у користувача пароль Vault
  2. Використовує це, щоб розшифрувати скріплений скрипт оболонки
  3. Оцінює сценарій, який завантажує змінні середовища Azure у середовище;
  4. Керує ігровою книжкою на створеному таким чином середовищі.

Будь-які кращі (більш елегантні, менш складні, більш "відповідальні") рішення там?


Що вас найбільше турбує у цьому робочому процесі?
Костянтин Суворов

1
@KonstantinSuvorov, головним чином, це кількість обручів, які мені потрібно стрибнути, щоб досягти, що здається (мені щонайменше) досить поширеною вимогою на важких підприємствах, що відповідають вимогам.
Vish

Відповіді:


8

Пароль сховища

Перш за все, вам слід ознайомитись з тим, що файл паролів Vault може бути виконавчим сценарієм. У цьому випадку 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

Цей скрипт паролів vault використовується key.gpgяк фактичний ключ vault, а також показує спливаюче сповіщення (для MacOS) з іменем батьківського процесу, коли використовується сценарій. Gpg-агент кешує розблокування пароля на деякий час, тому немає необхідності вводити пароль щоразу, коли ви запускаєте книгу.

Просто встановіть 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

У цей момент баш оцінює set_envі secure_env(розшифровується через ansible-vault). Після цієї команди у вас є визначені облікові дані Azure для поточної оболонки, тому ви можете виконувати ігрові книги, як зазвичай:

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

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


Дякую за відповідь Дозвольте спробувати це протягом тижня.
Виш

Отже, головна перевага перед моїм оригінальним підходом полягає в тому, що він використовує GPG - що приносить користь кешування --- так? Підхід до навколишнього середовища схожий на те, що я придумав.
Виш

1
З вашого ОП я розумію, що ви використовуєте обгортку кожен раз, коли ви запускаєте книгу. З sourceпідходом ви встановлюєте оточення один раз на сеанс терміналу і можете використовувати весь спектр інструментів окремо: ansible-playbooks, сценарії інвентаря, блакитний кліп, без обгортки.
Костянтин Суворов

Ах, зрозумів. Я підкажу це моїй команді. Прийняття вашої відповіді як більш зручного рішення. Дякуємо за дослідження та пояснення! Також мені сподобався ваш блог :)
Vish,

Основна перевага використання GPG (або брелка на macOS або Linux) полягає в тому, що кожен член команди має власну автентифікацію, щоб розблокувати унікальний для них приватний ключ. Цей ключ потім використовується для розблокування пароля Ansible Vault, який є загальним секретом. Ви повинні повернути всі свої секрети, якщо хтось покине команду, включаючи пароль Ansible Vault, але принаймні паролі GPG / keychain не потрібно змінювати.
RichVel

2

Прочитайте https://docs.ansible.com/ansible/2.4/vault.html Так як Ansible 2.4 можна використовувати --vault-id @prompt.

Зашифруйте файл за допомогою ansible-treult:

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

Запустіть ігрову книгу, і це призведе до:

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):

Після введення пароля Сейфу, програвач повинен мати успіх.


1
Читаючи сторінку, схоже, що там є рішення, але не вдається зрозуміти, використовуючи лише посилання. Чи можете ви, будь ласка, докладно?
Виш

Дякую, що ви працювали. Я дійсно вимагаю запитати у користувача пароль сейфа - використовуючи старіший --ask-vault-passваріант. І я не розумію, як його заміна --vault-idвідповість на більші питання про кращий робочий процес.
Vish

Коли ви відсилали мене до заслання , яку я зробив бачити один інтригуючий варіант: ansible-playbook --vault-id my-vault-password.py. Я подумав, що, можливо, у вас є рішення щодо використання сценарію python :) Я також роздумую над цим.
Виш
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.