Files
pet-project-server/docs/backlog/vault-password-storage.md
T
av f3c76ca583 backlog: добавлена идея о хранении пароля ansible-vault
- Пароль лежит открытым текстом рядом с репозиторием, а `ansible.cfg`
  подставляет его в любую ansible-команду — отсюда дамп секретов
  через `ansible-inventory --list`.
- Заведена идеей, а не задачей: компромисс «удобство против доступности
  автоматизации агенту» не разрешён, варианты с KeePassXC записаны с ценой.
2026-07-25 11:43:14 +03:00

4.0 KiB
Raw Blame History

[idea] Где хранить пароль ansible-vault

Приоритет: Низкий

Пароль vault лежит открытым текстом в ./ansible-vault-password-file.gitignore, есть .dist-заглушка), а ansible.cfg:4 объявляет vault_password_file глобально — значит расшифровка происходит неявно в любой ansible-команде, не только в деплое. Из-за этой связки 24 июля ansible-inventory --list вывалил в транскрипт 53 из 64 vault-переменных открытым текстом.

Зацепка: если файл из vault_password_file исполняемый, ansible запускает его и берёт пароль из stdout. То есть пароль можно не хранить на диске, а доставать из KeePassXC — ansible.cfg при этом не меняется, достаточно chmod +x. Сам скрипт секрета не содержит, его можно закоммитить и выкинуть связку .gitignore + .dist.

Два способа достать, оба проверены на наличие в системе:

  • Secret Servicesecret-tool lookup к разблокированной базе по D-Bus. Требует libsecret-tools (не установлен) и включённой в KeePassXC интеграции с экспортом отдельной группы. Деплой без запросов пароля, при заблокированной базе — fail-closed.
  • keepassxc-cli show -s -a Password <db> <entry> — без D-Bus и без новых пакетов (keepassxc-cli установлен), но пароль от базы спрашивается на каждый вызов; inv pl придётся перевести на pty=True, как уже сделано в authelia-cli и vault-edit.

Нерешённый компромисс — ради него задача и заведена. Вводить пароль руками на каждый деплой неудобно. Но любая автоматизация, которая эту неудобность снимает (разблокированная база, D-Bus, кэш), ровно так же доступна агенту: он найдёт скрипт и вызовет его сам. То есть выбор хранилища не защищает от агента — от него защищают только deny-правила в ~/.claude/settings.json, которые enforcement-слой применяет снаружи. Что смена хранилища действительно даёт: пароля больше нет на диске (а значит в снапшотах restic и в Syncthing), и при заблокированной базе всё падает закрыто для всех.

Прежде чем решать, стоит честно ответить: от чего именно защищаемся — от случайного дампа, от копии ~ в чужих руках, или от агента. Ответы ведут к разным вариантам, а третий не решается на этом уровне вообще.

Смежное: secrets-env-to-file — тот же вопрос слоем ниже (секреты в environment: контейнеров). Отдельно не заведена, но обсуждалась, идея скоупинга: вернуть group_vars/all/secrets.yml в vars_files, оставив main.yml в group_vars — это режет потолок утечки с 53 переменных до ~11, ценой возврата boilerplate в плейбуки.

Связано: ansible.cfg, tasks.py, group_vars/all/secrets.yml, ansible-vault-password-file.dist, .gitignore.