Files
pet-project-server/docs/backlog/vault-password-storage.md
av fbd0a66f44 backlog: secrets-env-to-file разложена по приложениям
- Шесть задач `secrets-file-*` вместо одной: outline, wakapi, authelia,
  gramps (средний), gitea, tududi (низкий, выигрыш частичный). Wanderer
  отпал — файловых секретов не умеет ни meilisearch, ни pocketbase.
- Матрица механизмов со ссылками на код уехала в
  docs/drafts/secrets-file-support.md, родитель — на кладбище.
2026-07-25 12:25:50 +03:00

51 lines
4.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# [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 Service** — `secret-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-file-*` — тот же вопрос слоем ниже (секреты в
`environment:` контейнеров), разбор механизмов в
[справке](../drafts/secrets-file-support.md). Отдельно не заведена, но обсуждалась,
идея скоупинга: вернуть `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.