- Шесть задач `secrets-file-*` вместо одной: outline, wakapi, authelia, gramps (средний), gitea, tududi (низкий, выигрыш частичный). Wanderer отпал — файловых секретов не умеет ни meilisearch, ни pocketbase. - Матрица механизмов со ссылками на код уехала в docs/drafts/secrets-file-support.md, родитель — на кладбище.
4.1 KiB
[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: контейнеров), разбор механизмов в
справке. Отдельно не заведена, но обсуждалась,
идея скоупинга: вернуть 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.