Ansible Vault
Описание
-
механизм Ansible для шифрования переменных и файлов
-
Переменные можно подключать через vars_files
-
Позволяет хранить в общих репозиториях файлы, в которых содержится приватная информация (пароли, токены)
-
Использование зашифрованных переменных полностью прозрачно. В процессе выполнения ansible получает к ним доступ.
-
Ansible расшифровывает Vault-контент при необходимости во время выполнения playbook, при этом исходный Vault-файл на диске остаётся зашифрованным
Основные команды
| Команда | Описание |
|---|---|
ansible-vault create group_vars/prod/vault.yml |
Создать зашифрованный файл vault.yml + задать пароль |
ansible-vault view group_vars/prod/vault.yml |
Посмотреть содержимое файла vault.yml + ввести пароль |
ansible-vault edit group_vars/prod/vault.yml |
Отредактировать содержимое файла vault.yml + ввести пароль |
ansible-vault encrypt secrets.yml |
зашифровать существующий файл secret.yml + ввести пароль |
ansible-vault decrypt secrets.yml |
расшифровать файл secret.yml + ввести пароль |
ansible-playbook site.yml --ask-vault-pass |
запустить playbook с Vault |
ansible-playbook site.yml --vault-password-file ~/.vault_pass |
запустить playbook с использованием Vault, но пароль от него брать в файле .vault_pass |
ansible-vault encrypt_string 'MyPassword' --name 'db_password' |
зашифровать строку (переменная db_password) |
ansible-vault rekey secrets.yml |
Смена пароля от Vault |
Vault ID
Описание
это метка + способ получить пароль для конкретного Vault.
--vault-id <МЕТКА>@<ОТКУДА_ВЗЯТЬ_ПАРОЛЬ>
Допустим у вас два набора секретов: dev и prod
тогда Vault для prod выглядит:
а для dev:
prod - имя/метка может быть любое (обычно dev, test, stage, prod.....)
@ - разделитель
prompt - спросить пароль в терминале
Пример
есть проект:
тогда можно запустить playbook через:
Ansible знает:
graph TD
A[dev_vault.yml]
--> B[внутри файла содержится метка dev]
B --> C[использовать пароль dev]
graph TD
A[prod_vault.yml]
--> B[внутри файла содержится метка prod]
B --> C[использовать пароль prod]
Откуда брать пароль
Интерактивный ввод пароля
Из файла:
Пример: шифрование файла
Импорт файла с секретами:
Пример содержимого файла до и после шифрования:
$ANSIBLE_VAULT;1.1;AES256
62875170457138578347108591734572348567801287561234974891340685213491273487123904819720347819234
62875170457138578347108591734572348567801287561234974891340685213491273487123904819720347819234
...
Порядок работы с ansible vault
Чтобы зашифровать существующий файл выполняем команды:
Файл с секретами будет запаролен, в будущем, когда мы захотим выполнить playbook с использованием secrets.yml, необходимо передать параметр --ask-vault-pass.
Либо мы можем указать в ansible.cfg опцию vault_password_file, которая указывает на файл с ключом.
Пример:
Пример: шифрование строки
Результат можно вставить в код сценария:
the_dev_secret: !vault |
$ANSIBLE_VAULT;1.2;AES256;dev
90750891247857140957890123478509173098587913479457893247158342
90750891247857140957890123478509173098587913479457893247158342
90750891247857140957890123478509173098587913479457893247158342
90750891247857140957890123478509173098587913479457893247158342
Как указать ключ (Vault key)
-
Из командной строки:
--vault-id <label>@prompt -
Из plain text файла:
--vault-id <label>@/path/to/vault.key -
Из исполняемого файла:
--vault-id <label>@key.sh -
Сразу несколько:
--vault-id messages_db@/path/to/db.key --vault-id users_db@/path/to/users.key
Можно использовать label для того, чтобы работать с несколькими окружениями с разными ключами Vault
no_log
Описание
Vault защищает секрет в файле, но секрет всё ещё может попасть в вывод Ansible. Для чувствительных задач используется no_log: true.
- name: Login to service
ansible.builtin.uri:
url: https://example.com/login
method: POST
body:
username: "{{ api_user }}"
password: "{{ api_password }}"
no_log: true
Безопасность password файла
Предупреждение
Если используется файл-пароль --vault-password-file ~/.vault_pass, то обязательно использовать chmod 600 ~/.vault_pass и обязательно добавить файл в .gitignore
primer
Зашифрованный Vault можно хранить в Git. Пароль от него рядом с Vault хранить нельзя.
Vault в CI/CD
Главная идея
Vault файл находится в репозитории, а ключ приходит из зашифровванного хранилища CI/CD.