Commit d79c907a authored by Vitaly Lipatov's avatar Vitaly Lipatov

Add memory: rooter password store + shared-passwords rule + rooter home restore

Co-Authored-By: 's avatarClaude <noreply@anthropic.com>
parent 2436bd23
...@@ -67,6 +67,8 @@ ...@@ -67,6 +67,8 @@
- [feedback_install_from_package_not_pip.md](feedback_install_from_package_not_pip.md) — на проде ставить из системных пакетов, НЕ pip-в-venv; не упаковано → упаковать, pip-venv только как обозначенный stopgap - [feedback_install_from_package_not_pip.md](feedback_install_from_package_not_pip.md) — на проде ставить из системных пакетов, НЕ pip-в-venv; не упаковано → упаковать, pip-venv только как обозначенный stopgap
- [feedback_build_requests_via_kanban.md](feedback_build_requests_via_kanban.md) — запросы на сборку/упаковку пакетов → Kanban (категория git-alt), НЕ GitLab issue в alt-packaging-agents - [feedback_build_requests_via_kanban.md](feedback_build_requests_via_kanban.md) — запросы на сборку/упаковку пакетов → Kanban (категория git-alt), НЕ GitLab issue в alt-packaging-agents
- [feedback_password_request_only.md](feedback_password_request_only.md) — пароли ТОЛЬКО через lavtomate password_request (одобрение в web UI); не читать автономно, не грепать секреты, не хранить plaintext для Claude - [feedback_password_request_only.md](feedback_password_request_only.md) — пароли ТОЛЬКО через lavtomate password_request (одобрение в web UI); не читать автономно, не грепать секреты, не хранить plaintext для Claude
- [feedback_shared_passwords_rooter_store.md](feedback_shared_passwords_rooter_store.md) — пароль, нужный нескольким админам → класть в rooter password store, не в credentials.md и не plaintext в memory
- [reference_rooter_password_store.md](reference_rooter_password_store.md) — admin password store на server: чтение `ssh rooter@server pass show <name>` (gated rooter SSH), add/rm через root@server `/usr/local/sbin/admin-pass-add.sh`; `/var/lib/admin-pass/`
- [reference_remote_ssh_access.md](reference_remote_ssh_access.md) — Доступ к удалённым хостам через reverse-SSH на anyssh.ru: parentglobal=:10337/etersoft, rpi=:10338/root и др. - [reference_remote_ssh_access.md](reference_remote_ssh_access.md) — Доступ к удалённым хостам через reverse-SSH на anyssh.ru: parentglobal=:10337/etersoft, rpi=:10338/root и др.
- [lesson_anyssh_ru_in_91232225.md](lesson_anyssh_ru_in_91232225.md) — anyssh.ru = 91.232.225.8, не маршрутизировать всю /24 через туннель - [lesson_anyssh_ru_in_91232225.md](lesson_anyssh_ru_in_91232225.md) — anyssh.ru = 91.232.225.8, не маршрутизировать всю /24 через туннель
- [lesson_lavtomate_bug_create_confirmation.md](lesson_lavtomate_bug_create_confirmation.md) — bug_create теперь переиспользует approved confirmation_id при field-validation reject; можно ретраить с дополненными полями - [lesson_lavtomate_bug_create_confirmation.md](lesson_lavtomate_bug_create_confirmation.md) — bug_create теперь переиспользует approved confirmation_id при field-validation reject; можно ретраить с дополненными полями
...@@ -125,6 +127,7 @@ ...@@ -125,6 +127,7 @@
- [lesson_roundcube_password_plugin_config.md](lesson_roundcube_password_plugin_config.md) — Roundcube password: `%c``%P` после 1.2, иначе DB Error 1064; не путать `password` и `password.log` - [lesson_roundcube_password_plugin_config.md](lesson_roundcube_password_plugin_config.md) — Roundcube password: `%c``%P` после 1.2, иначе DB Error 1064; не путать `password` и `password.log`
- [lesson_mail_postfix_sasl_config_path.md](lesson_mail_postfix_sasl_config_path.md) — mail.etersoft.ru: Postfix читает `/etc/postfix/sasl/smtpd.conf`, НЕ `/etc/sasl2/smtpd.conf`. Cyrus `imap=1`, Postfix `smtpauth=1` - [lesson_mail_postfix_sasl_config_path.md](lesson_mail_postfix_sasl_config_path.md) — mail.etersoft.ru: Postfix читает `/etc/postfix/sasl/smtpd.conf`, НЕ `/etc/sasl2/smtpd.conf`. Cyrus `imap=1`, Postfix `smtpauth=1`
- [lesson_mail_cert_renewal_webroot_hook.md](lesson_mail_cert_renewal_webroot_hook.md) — mail.etersoft.ru Let's Encrypt: renewal через cron.weekly (webroot, nginx должен быть UP), deploy-hook в `/etc/letsencrypt/renewal-hooks/deploy/` (НЕ `--renew-hook`) раскладывает cert в Postfix/Cyrus; инцидент 2026-07-04 — 2 причины протухания - [lesson_mail_cert_renewal_webroot_hook.md](lesson_mail_cert_renewal_webroot_hook.md) — mail.etersoft.ru Let's Encrypt: renewal через cron.weekly (webroot, nginx должен быть UP), deploy-hook в `/etc/letsencrypt/renewal-hooks/deploy/` (НЕ `--renew-hook`) раскладывает cert в Postfix/Cyrus; инцидент 2026-07-04 — 2 причины протухания
- [lesson_rooter_home_pbs_restore.md](lesson_rooter_home_pbs_restore.md) — rooter@server доступ сломался удалением `/home/rooter` с aspetos (NFS); восстановление из PBS через `backup/restore-home.sh` (snapshot 2025-12-28); «shared-аккаунт не пускает» → проверять home на NFS-сервере
- [lesson_sieve_domain_split.md](lesson_sieve_domain_split.md) — sieve расщепление при symlink доменов: managesieve пишет по login-домену, доставка читает по spool-symlink → правила Roundcube не применяются - [lesson_sieve_domain_split.md](lesson_sieve_domain_split.md) — sieve расщепление при symlink доменов: managesieve пишет по login-домену, доставка читает по spool-symlink → правила Roundcube не применяются
- [lesson_lavtomate_master_active_empty.md](lesson_lavtomate_master_active_empty.md) — Lavtomate пишет пустой master active.script без `include "roundcube"` → правила Roundcube глохнут; ручной workaround + задание в lavtomate/docs/task-sieve-master-include.md - [lesson_lavtomate_master_active_empty.md](lesson_lavtomate_master_active_empty.md) — Lavtomate пишет пустой master active.script без `include "roundcube"` → правила Roundcube глохнут; ручной workaround + задание в lavtomate/docs/task-sieve-master-include.md
- [lesson_chat_eterfund_telemt_oom.md](lesson_chat_eterfund_telemt_oom.md) — chat.eterfund.ru: round-robin .43 (CT 691 telemt TLS-прокси на enceladus) + 217.12.37.55 (beget); инцидент 2026-05-25 — gyle CT 716 захватывал .43, перенесли gyle на .86 - [lesson_chat_eterfund_telemt_oom.md](lesson_chat_eterfund_telemt_oom.md) — chat.eterfund.ru: round-robin .43 (CT 691 telemt TLS-прокси на enceladus) + 217.12.37.55 (beget); инцидент 2026-05-25 — gyle CT 716 захватывал .43, перенесли gyle на .86
......
---
name: feedback_shared_passwords_rooter_store
description: "пароль, нужный нескольким админам класть в rooter password store, не в credentials.md и не plaintext в memory"
metadata:
node_type: memory
type: feedback
originSessionId: b383b2ce-248b-4e35-be70-ce592001dc88
---
**Если пароль нужен больше чем одному админу — класть его в rooter password store**, не в локальный `.claude/secrets/credentials.md` и не plaintext в memory/репо.
**Why:** rooter-store даёт шаренный доступ с любой машины (`ssh rooter@server pass show <name>`), gated SSH-ключами rooter (lav, kondratyuk, amegami, mais), хранится на server. `credentials.md` — plaintext только на одном ноутбуке (риск кражи/потери, нет шеринга), плюс это «временное хранение до Vaultwarden». Plaintless в memory — уходит в репо/историю (утечка).
**How to apply:**
- новый shared-пароль → `printf 'SECRET' | ssh rooter@server /usr/local/sbin/admin-pass-add.sh <name>` (или с root@server); коллеги читают через `ssh rooter@server pass show <name>`.
- редактирование/удаление — только root@server.
- Claude для АВТОМАЦИИ пароли НЕ отсюда — через lavtomate `password_request` ([[feedback_password_request_only]]).
- детали store: [[reference_rooter_password_store]].
---
name: lesson_rooter_home_pbs_restore
description: rooter@server доступ сломался удалением /home/rooter с aspetos; восстановление из PBS через restore-home.sh
metadata:
node_type: memory
type: reference
originSessionId: b383b2ce-248b-4e35-be70-ce592001dc88
---
`rooter@server` — караульный аккаунт (shell `/home/rooter/bin/rooter.sh`, группы remotelogin+nx, SSH forced-command меню). Доступ **молча сломался**: `/home/rooter` удалили с aspetos (NFS-сервер `/home`) в окне **2025-12-28 → 2026-05-31**. Вместе с home ушли `bin/rooter.sh` (караульный shell) и `.ssh/authorized_keys` → sshd перестал пускать (`Permission denied` по всем методам).
**Диагностика:** на server аккаунт есть (`getent passwd rooter`), в нужных группах, но `/home/rooter/.ssh/` и `bin/rooter.sh` отсутствуют → корень в отсутствии home на NFS-сервере. Проверять home надо на **aspetos** (`/home` там локальный ZFS), не на server (там NFS).
**Восстановление:** `backup/restore-home.sh` (в репо, `backup/`) — тянет `/home/<user>` из PBS (`pve-backup:zlocal`, ns `Files`, backup-id `etersoft-home`, archive `home.pxar`). Запускать на **aspetos** (где `/home` локальный + стоит `proxmox-backup-client`; в чекауте репо на aspetos скрипта может не быть — scp'ить):
```
./restore-home.sh -l snapshots # список снапшотов
./restore-home.sh -l users 2025-12-28T01:02:03Z | grep rooter # есть ли user в снапшоте
./restore-home.sh rooter 2025-12-28T01:02:03Z # restore (skip-existing по умолчанию)
```
rooter был в самом старом снапшоте (2025-12-28), в более свежих (2026-05-31+) уже нет → брать старейший доступный. После restore home виден на server через NFS, SSH-ключ (lav@etersoft.ru ED25519) снова работает, меню «Etersoft rooter (c) 2015» запускается.
**Урок:** «shared-аккаунт перестал пускать по SSH» без видимых причин → проверить наличие `/home/<user>` на NFS home-сервере; восстановить из PBS через `restore-home.sh`. См. также [[reference_rooter_password_store]].
---
name: reference_rooter_password_store
description: "admin password store на server доступ через rooter.sh (ssh rooter@server pass show), куда класть.shared-пароли админов"
metadata:
node_type: memory
type: reference
originSessionId: b383b2ce-248b-4e35-be70-ce592001dc88
---
**Admin password store** для паролей, нужных нескольким админам. На server (192.168.0.1), plaintext (сознательно — гейт = доступ), root-only.
**Доступ (чтение, gated SSH-ключами rooter — lav, kondratyuk, amegami, mais):**
```
ssh rooter@server pass list
ssh rooter@server pass show <name>
```
Важно: rooter — караульное меню, **не интерпретирует shell-операторы** (`|`, `>`); `pass show X | wc -c` передаст `|` `wc` `-c` как литеральные аргументы и просто напечатает значение.
**Добавление/удаление (только root@server, НЕ через меню — read-only для rooter):**
```
printf 'SECRET' | /usr/local/sbin/admin-pass-add.sh <name> # добавить/заменить
rm /var/lib/admin-pass/<name> # удалить
```
**Устройство:**
- Store: `/var/lib/admin-pass/` (root:root 700), запись = файл `<name>`.
- `rooter.sh` (`/home/rooter/bin/`, на aspetos/NFS) → case `pass``sudo /usr/local/sbin/get-pass.sh` (list/show, read-only, root-owned).
- sudoers: `/etc/sudoers.d/rooter` + `NOPASSWD: /usr/local/sbin/get-pass.sh` (на server активен include `/etc/sudoers.d/`, НЕ `/etc/sudo.d/`).
- `admin-pass-add.sh` (`/usr/local/sbin/`, root-only, НЕ в sudoers) — seeding.
**Свойство безопасности:** меню rooter = только чтение; изменить/удалить может только root@server. Украсть rooter-SSH-ключ → можно читать, но не стирать/портить.
Зачем: пароли под рукой для всех админов, без plaintext в репо/memory и без локального файла на одном ноутбуке. См. [[feedback_shared_passwords_rooter_store]], [[feedback_password_request_only]] (для Claude-автоматизации — отдельный путь через lavtomate password_request ↔ Vaultwarden).
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment