Ansible Vault и no_log: где секреты остаются после расшифровки

Секрет перенесли в Ansible Vault, затем запустили playbook с --diff и увидели его в журнале изменения конфигурации. Противоречия нет: Vault защищает зашифрованное содержимое при хранении, а во время выполнения Ansible должен получить исходное значение. Дальше оно может попасть в результат задачи, template, аргументы процесса или лог приложения.

Поэтому защищать нужно несколько точек. Vault — файл или значение в репозитории. No_log — чувствительный вывод определённой задачи. Права файла — доступ к конфигурации на управляемой машине. Эти настройки дополняют друг друга и не включаются автоматически одна из другой.

Создадим зашифрованный файл без секрета в аргументах

На стенде выполните команду создания Vault-файла. Она запросит пароль и откроет редактор; введите фиктивный app_token, чтобы проверить весь путь без рабочего credential.

ansible-vault create secrets.yml

Содержимое до шифрования должно быть YAML вида app_token: demo-token-for-training. Сохранённый secrets.yml начинается с заголовка Ansible Vault и содержит шифротекст. Пароль Vault храните отдельно от репозитория: файл с паролем рядом с шифротекстом в Git устраняет полезную границу доступа.

Редактор способен оставлять swap, backup и временные файлы. Для рабочей процедуры проверьте его поведение и правила доступа к каталогу. Команда create не делает любые промежуточные копии автоматически безопасными.

Расшифруем значение только для нужной задачи

Создайте app.conf.j2 с одной строкой token={{ app_token }}. Следующий playbook записывает её в отдельный локальный каталог и выводит только статус успешного выполнения, без значения.

- name: Render a protected application file
  hosts: localhost
  connection: local
  gather_facts: false
  vars_files:
    - secrets.yml
  tasks:
    - name: Prepare private directory
      ansible.builtin.file:
        path: /tmp/latorn-vault-demo
        state: directory
        mode: '0700'
    - name: Write application credentials
      ansible.builtin.template:
        src: app.conf.j2
        dest: /tmp/latorn-vault-demo/app.conf
        mode: '0600'
      no_log: true
      diff: false
    - name: Report completion without the token
      ansible.builtin.debug:
        msg: Application credential file has been rendered
ansible-playbook -i localhost, demo.yml --ask-vault-pass

В обычном выводе чувствительная template-задача должна быть скрыта, а готовый файл доступен только владельцу. Сообщение debug не содержит app_token и не сериализует результат template. Сам app.conf теперь хранит открытый токен, потому что именно такой файл ожидает приложение. Его нельзя считать зашифрованным только из-за происхождения переменной из Vault.

No_log действует на конкретный вывод

No_log ограничивает стандартное отображение чувствительной задачи. Но следующая debug с var: app_token снова раскроет значение, если её отдельно не защитить. Аналогично register сохраняет данные в памяти и позволяет последующей задаче вывести их. Не печатайте целиком результаты, которые могли содержать секреты.

Diff: false явно запрещает сравнение содержимого для этой задачи при --diff. Для несекретной части конфигурации diff полезен, поэтому обычно проще защитить конкретные чувствительные задачи, а не полностью лишать диагностики весь playbook.

Где ещё остаются копии

Приложение может записывать конфигурацию в собственный лог, crash dump или backup. Команда с токеном в аргументах способна показать его в списке процессов. No_log не меняет поведение внешней программы и не шифрует её файлы. Выбирайте способ передачи секрета, который поддерживает приложение, и проверяйте конечный журнал на стендовых значениях.

Пользователь с правом прочитать app.conf получает токен независимо от доступа к Vault. Поэтому определите владельца процесса и права назначения; в реальном сервисе это может быть отдельная учётная запись приложения, а не пользователь локального примера. Удалённые резервные копии должны соблюдать ту же политику.

Проверим защиту фиктивным токеном

Запустите стенд с подробным выводом и diff только на учебном значении. Убедитесь, что токен не появляется в стандартном журнале, а приложение получает ожидаемый файл. Не включайте внутренний ANSIBLE_DEBUG для рабочего запуска: отладочные пути могут раскрыть секреты вопреки обычному no_log.

Vault решает хранение, но пароль расшифрования тоже требует выдачи и ротации. Для CI определите, откуда он приходит и кто может запускать код с этим доступом. После реальной утечки недостаточно заново зашифровать YAML: нужно заменить сам credential и разобраться с доступными копиями журналов и файлов.

Ещё по теме

Продолжить изучение

Хотите собрать настройку серверов в повторяемый процесс? Inventory, роли, шаблоны и обновление сервисов входят в программу «Ansible: автоматизация инфраструктуры».

Продолжить на практике

  • Ansible: автоматизация инфраструктуры ↗

    Настраивайте серверы воспроизводимо: inventory, playbooks, роли, шаблоны и секреты. Соберите автоматизацию для нескольких окружений, проверьте повторный запуск и обновляйте сервисы управляемо.