Перейти к содержанию

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 выглядит:

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

а для dev:

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

prod - имя/метка может быть любое (обычно dev, test, stage, prod.....)

@ - разделитель

prompt - спросить пароль в терминале

Пример

есть проект:

project/
- dev_vault.yml
- prod_vault.yml
- site.yml

тогда можно запустить playbook через:

ansible-playbook site.yml --vault-id dev@prompt --vault-id prod@prompt

Ansible знает:


graph TD
A[dev_vault.yml]
--> B[внутри файла содержится метка dev]
B --> C[использовать пароль dev]

graph TD
A[prod_vault.yml]
--> B[внутри файла содержится метка prod]
B --> C[использовать пароль prod]

Откуда брать пароль

Интерактивный ввод пароля

--vault-id prod@prompt

Из файла:

--vault-id prod@/home/user/.vault_prod

Пример: шифрование файла

Импорт файла с секретами:

- hosts: all
  vars_files:
   - secrets.yml

Пример содержимого файла до и после шифрования:

secret_repo_user: admin
secret_repo_pass: some_long_pass
$ANSIBLE_VAULT;1.1;AES256
62875170457138578347108591734572348567801287561234974891340685213491273487123904819720347819234
62875170457138578347108591734572348567801287561234974891340685213491273487123904819720347819234
...

Порядок работы с ansible vault

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

ansible-vault encrypt secrets.yml

Файл с секретами будет запаролен, в будущем, когда мы захотим выполнить playbook с использованием secrets.yml, необходимо передать параметр --ask-vault-pass. Либо мы можем указать в ansible.cfg опцию vault_password_file, которая указывает на файл с ключом.

Пример:

ansible-playbook myplaybook.yml --ask-vault-pass

Пример: шифрование строки

ansible-vault encrypt_string  --vault-id dev@prompt 'fooodev' --name 'the_dev_secret'

Результат можно вставить в код сценария:

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.

Схема взаимодействия Vault и CI/CD
Схема взаимодействия Vault и CI/CD