backlog: добавлена идея о хранении пароля ansible-vault
- Пароль лежит открытым текстом рядом с репозиторием, а `ansible.cfg` подставляет его в любую ansible-команду — отсюда дамп секретов через `ansible-inventory --list`. - Заведена идеей, а не задачей: компромисс «удобство против доступности автоматизации агенту» не разрешён, варианты с KeePassXC записаны с ценой.
This commit is contained in:
@@ -46,3 +46,4 @@ _(sec-ревью)_ — три независимых security-ревью на м
|
|||||||
- [Инвентарь: `host_vars`, именованные группы, точечный `become`](ansible-inventory-hostvars.md) — хост-специфику в `host_vars/server.yml`, хост в именованную группу, глобальный root → точечный become _(ансибл-ревью)_
|
- [Инвентарь: `host_vars`, именованные группы, точечный `become`](ansible-inventory-hostvars.md) — хост-специфику в `host_vars/server.yml`, хост в именованную группу, глобальный root → точечный become _(ансибл-ревью)_
|
||||||
- [Фоновая зачистка стиля и конфигурации Ansible](ansible-style-nits.md) — sudoers.d, профиль ansible-lint, `ansible.cfg`, кавычки, `cache_valid_time` _(ансибл-ревью)_
|
- [Фоновая зачистка стиля и конфигурации Ansible](ansible-style-nits.md) — sudoers.d, профиль ansible-lint, `ansible.cfg`, кавычки, `cache_valid_time` _(ансибл-ревью)_
|
||||||
- [Logrotate для логов бэкапов](backup-logs-logrotate.md) — логи `backup-all.py`/restic копятся без ротации _(tududi)_
|
- [Logrotate для логов бэкапов](backup-logs-logrotate.md) — логи `backup-all.py`/restic копятся без ротации _(tududi)_
|
||||||
|
- [[idea] Где хранить пароль ansible-vault](vault-password-storage.md) — пароль открытым текстом рядом с репо, `ansible.cfg` подставляет его в любую ansible-команду; вариант — доставать из KeePassXC
|
||||||
|
|||||||
@@ -0,0 +1,49 @@
|
|||||||
|
# [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-env-to-file](secrets-env-to-file.md) — тот же вопрос слоем ниже
|
||||||
|
(секреты в `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.
|
||||||
Reference in New Issue
Block a user