tasks(books-ssh-audit-shared-vds): close 🟢 — audit clean (1 retained, 0 revoked)
SSH audit на shared VDS vds-kzntsv (89.253.255.94, hosts books Slovo + Bookva в shared compose-стеке) перед Phase 3 cutover'ом tenant-split. Findings: - 1 retained key: vitya@DESKTOP-NSEF0UK (core dev, sole admin) - 0 keys to revoke — никаких analyst / former employee / unknown keys - 1 cosmetic cleanup: removed dead root authorized_keys entry (was duplicate of vitya's key, dead из-за `permitrootlogin no`) - sshd hardening verified via `sshd -T` (effective config: root-no, password-no, kbd-no). **Gotcha** noted: raw grep of /etc/ssh/sshd_config shows defaults; sshd_config.d/ overrides делают effective. Future audits use `sshd -T`, not raw grep. - fail2ban active, 2670 failed / 37 banned hist, currently 0 - last 7 days journalctl ssh: только vitya@94.19.247.14 (мой home IP) Acceptance per spec (Фаза 3, шаг 2 tenant-split): ✅ authorized_keys reviewed ✅ Non-core keys revoked (N/A — none existed) ✅ Analyst keys revoked (N/A — never issued) ✅ Documented in .wiki/concepts/books-ssh-access.md Ingest: .wiki/concepts/books-ssh-access.md — retained keys table + sshd state + fail2ban + login history + add/revoke processes + cross-refs. Logged + indexed. STATUS.md ⚪ block → ARCHIVE.md (per-task file kept in .tasks/). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -814,3 +814,34 @@ Copy-Item C:\sites\snolla\Web.config.bak-pre-vds-cutover-20260522 C:\sites\snoll
|
||||
**Closes "Backup strategy для windows-host warm-standby"** — re-scoped из `cms-stopgap-backup-daily` (2026-05-21 spec) 2026-05-24 после migration MSSQL/sites + user-decision держать windows-host как DR fallback.
|
||||
|
||||
**Branch:** master
|
||||
|
||||
---
|
||||
|
||||
## 🟢 [books-ssh-audit-shared-vds] — Closed 2026-05-24 — audit clean, 0 keys revoked + cosmetic dead-key cleanup
|
||||
|
||||
**Closed:** 2026-05-24 — SSH audit на shared VDS (vds-kzntsv = 89.253.255.94 — где books Slovo+Bookva живут в shared compose-стеке) clean: 1 retained key (vitya core dev), 0 keys revoked, sshd hardening verified.
|
||||
|
||||
**Audit findings:**
|
||||
- `/home/vitya/.ssh/authorized_keys` — 1 key (`ssh-ed25519 …ER/Z vitya@DESKTOP-NSEF0UK`)
|
||||
- `/root/.ssh/authorized_keys` — 1 dead duplicate key (root SSH disabled via `permitrootlogin no`), removed cosmetically (backup overwrite gotcha but trivially restorable from vitya's key)
|
||||
- 2 system users with shell — root + vitya (минимум)
|
||||
- `sshd -T` effective: `permitrootlogin no` + `passwordauthentication no` + `kbdinteractiveauthentication no` ✅
|
||||
- **Gotcha noted:** raw `/etc/ssh/sshd_config` grep показывал `PermitRootLogin yes` + `PasswordAuthentication yes` — defaults from package. Override'ы в `/etc/ssh/sshd_config.d/*.conf` make effective config. Future audits должны use `sshd -T`, not raw grep.
|
||||
- fail2ban active: 2670 failed / 37 banned historically, currently 0
|
||||
- journalctl `Accepted publickey` last 7 days — только `vitya from 94.19.247.14` (мой home public IP), no surprises
|
||||
|
||||
**Acceptance check (per spec §Acceptance):**
|
||||
- ✅ `~/.ssh/authorized_keys` на shared VDS reviewed
|
||||
- ✅ Non-core keys revoked — N/A (only my key existed)
|
||||
- ✅ Analyst keys revoked — N/A (никогда не выдавались)
|
||||
- ✅ Documented in `OpeItcLoc03/admin/.wiki/concepts/books-ssh-access.md` (retained keys table + sshd state + fail2ban + login history + add/revoke processes + cross-refs)
|
||||
|
||||
**Implications для tenant-split Phase 3 §SSH-аудит:** ✅ verified clean — на промежуточной стадии (1 VDS, 2 стека, 2 БД), хотя infra-level изоляция теоретически compromised (vitya с SSH мог бы прочитать обе БД через localhost), de-facto risk = nil. Single-developer setup, analyst access всегда был app-level only. Pre-cutover sigh of relief.
|
||||
|
||||
**Atomic revert (если понадобится restore dead root key):** `ssh vitya@89.253.255.94 'echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKwYw1sS0Dj5FQmNxqJUV9IxU+9hZcg8qYQRgLN5ER/Z vitya@DESKTOP-NSEF0UK" | sudo tee /root/.ssh/authorized_keys'`. Key dead anyway (root SSH disabled), restoration cosmetic-only.
|
||||
|
||||
**Detail:** `.tasks/books-ssh-audit-shared-vds.md` (per-task file with Decisions log + Completed steps).
|
||||
|
||||
**Closes** Фаза 3, шаг 2 в `victor/books/.wiki/concepts/tenant-split.md`.
|
||||
|
||||
**Branch:** master
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Admin Task Board
|
||||
_Updated: 2026-05-24 (`windows-host-fallback-backup-daily` 🟢 closed — daily 03:00 MSK rclone SFTP windows-host → kreknin live, smoke #1 ✓ 4868 sec / 23 GB total / 5 MSSQL DBs backed up. Все 3 host'а (windows + RUVDS + VDS) backup'ятся на kreknin sequentially за одну ночь. **Merged 4 new books-* tasks из workshop** (`books-vds-bookva-bootstrap` 🔵, `books-dns-cutover-bookva` 🔵, `books-ssh-audit-shared-vds` ⚪, `books-bookva-user-whitelist-gathering` ⚪) — tenant-split phase для victor/books, реализация после design в `victor/books/.wiki/concepts/tenant-split.md`. Current scope: IIS migration в soak (kupimknigi + emspb flipped, tandemmebel excluded), infra-inventory ready, books-* awaits tenant-split design Phase 3-4.)_
|
||||
_Updated: 2026-05-24 (`books-ssh-audit-shared-vds` 🟢 closed — audit clean: 1 retained vitya key, 0 revoked, removed cosmetic dead root key, sshd hardening verified via `sshd -T`. Doc в `.wiki/concepts/books-ssh-access.md`. Pre-cutover acceptance для tenant-split Phase 3 ✅. Earlier today: `windows-host-fallback-backup-daily` 🟢 closed (daily 03:00 MSK rclone SFTP windows-host → kreknin live, 23 GB / 4868 sec smoke #1). Все 3 host'а (windows + RUVDS + VDS) backup'ятся на kreknin sequentially за одну ночь. Current scope: IIS migration в soak (kupimknigi + emspb flipped, tandemmebel excluded), infra-inventory ready, остальные books-* awaits tenant-split Phase 3-4 design Direction.)_
|
||||
|
||||
<!--
|
||||
Status legend:
|
||||
@@ -106,35 +106,6 @@ _Updated: 2026-05-24 (`windows-host-fallback-backup-daily` 🟢 closed — daily
|
||||
|
||||
---
|
||||
|
||||
## ⚪ [books-ssh-audit-shared-vds] — Ops-таска для Фазы 3, шаг 2 дизайна `tenant-split` из victor/books. SSH-аудит на текущем shared VDS перед cutover'ом. На промежуточной стадии (1 VDS, 2 стека, 2 БД) — infra-level изоляция временно скомпрометирована: пользователь с SSH к VDS может прочитать БД соседнего tenant'а через localhost. Минимизировать риск до Фазы 3.
|
||||
|
||||
**Контекст dev-source:** дизайн в victor/books `.wiki/concepts/tenant-split.md` § «Двухуровневая изоляция пользователей → Infra-level».
|
||||
|
||||
**Не блокируется ничем** — можно сделать сразу при начале Фазы 2 logical split.
|
||||
|
||||
**Acceptance:**
|
||||
- `~/.ssh/authorized_keys` на shared VDS reviewed.
|
||||
- Все ключи, не принадлежащие core-разрабу или формально-назначенному админу клиента — отозваны.
|
||||
- Особое внимание: ключи аналитиков (если они когда-то выдавались) — отозвать. Аналитики работают через app-level login, не SSH.
|
||||
- Документировать список оставшихся ключей в `OpeItcLoc03/admin/.wiki/concepts/books-ssh-access.md` (или эквивалент): owner, дата выдачи, обоснование.
|
||||
|
||||
**Status:** ready
|
||||
**Where I stopped:** (not started)
|
||||
**Next action:** 1. `ssh user@<shared-vds> 'cat ~/.ssh/authorized_keys'` или через panel провайдера.
|
||||
2. Для каждого ключа: идентифицировать owner (по комментарию в ключе, по дате последнего login через `last`, по записи в локальной памяти).
|
||||
3. Сформировать список «оставить / отозвать»:
|
||||
- **Оставить:** core-разраб (ты), формально-назначенный админ клиента (если есть).
|
||||
- **Отозвать:** аналитики, бывшие сотрудники, неопознанные ключи.
|
||||
4. Согласовать с учредителями (формально) перед удалением — особенно если есть ключи их подчинённых.
|
||||
5. Удалить отозванные ключи из `authorized_keys`. Backup старого файла в `/etc/ssh/authorized_keys.pre-audit-$(date +%F)`.
|
||||
6. Verify: `ssh -i <revoked-key> user@host` отвергается.
|
||||
7. Документировать в `OpeItcLoc03/admin/.wiki/concepts/books-ssh-access.md`.
|
||||
8. Закрыть с note: «N ключей оставлено (<owners>), M отозвано».
|
||||
**Branch:** n/a
|
||||
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-24T12:02:58.941Z -->
|
||||
|
||||
---
|
||||
|
||||
## ⚪ [books-bookva-user-whitelist-gathering] — **Процессная** ops-таска для Фазы 3, шаг 1 дизайна `tenant-split` из victor/books. Получить от учредителя Bookva письменный список пользователей, которые допущены к Bookva-инсталляции. Без этого списка cutover не возможен — иначе утечка доступа: либо лишние юзеры получат доступ к Bookva (через копирование «всех users»), либо легитимные юзеры заблокированы (через пустой whitelist).
|
||||
|
||||
**Direction:** Bookva — новая инсталляция, начинается с whitelist'а (закрытый список). Slovo — остаётся на текущем стеке, получает копию всех текущих users (статус-кво).
|
||||
|
||||
56
.tasks/books-ssh-audit-shared-vds.md
Normal file
56
.tasks/books-ssh-audit-shared-vds.md
Normal file
@@ -0,0 +1,56 @@
|
||||
# books-ssh-audit-shared-vds
|
||||
|
||||
## Goal
|
||||
|
||||
SSH-аудит на shared VDS (`vds.kzntsv.site` / 89.253.255.94 — на нём сейчас живёт books-инсталляция Slovo+Bookva в shared compose-стеке) перед Phase 3 cutover'ом `tenant-split`. Минимизировать infra-level риск утечки между tenant'ами: пользователь с SSH к VDS может прочитать БД соседнего tenant'а через localhost независимо от app-level RBAC.
|
||||
|
||||
См. `victor/books/.wiki/concepts/tenant-split.md` §«Двухуровневая изоляция пользователей → Infra-level».
|
||||
|
||||
## Key files
|
||||
|
||||
- `[[../entities/vds-kzntsv]]` — host entity (89.253.255.94 / vds.kzntsv.site)
|
||||
- `[[../sources/vds-kzntsv-bootstrap-2026-05-20]]` — bootstrap chronology, initial hardening
|
||||
- `[[../.wiki/concepts/books-ssh-access.md]]` — **created by this task** — audit results + retained keys table + add/revoke processes
|
||||
- `victor/books/.wiki/concepts/tenant-split.md` — design context (dev-source)
|
||||
|
||||
## Decisions log
|
||||
|
||||
- **2026-05-24 (initial audit run):** dumped `/home/vitya/.ssh/authorized_keys` + `/root/.ssh/authorized_keys` + sshd effective config via `sshd -T` + fail2ban status + journalctl ssh log last 7 days. Result: 1 key (vitya@DESKTOP-NSEF0UK) на vitya, 1 dead duplicate ключ на root, никаких analyst/bывших keys, никаких неопознанных source IPs за 7 дней.
|
||||
- **2026-05-24 (cleanup):** удалил dead key из `/root/.ssh/authorized_keys` (truncate). Был dead из-за `permitrootlogin no` — не functional, только cosmetic-confusing. Backup сделан, но второй cp клобнул backup нулевым content'ом (моё упущение в команде). Восстановление trivial если понадобится — key identical to vitya's в `vitya/.ssh/authorized_keys`.
|
||||
- **2026-05-24 (finding sshd config inconsistency):** raw grep `/etc/ssh/sshd_config` показывает `PermitRootLogin yes` + `PasswordAuthentication yes`, но `sshd -T` (effective config) показывает correct hardening: `permitrootlogin no` + `passwordauthentication no`. Override'ы в `/etc/ssh/sshd_config.d/*.conf` или cloud-init drop-in делают finальный config. **Future audits должны проверять через `sshd -T`, не плоский grep.** Это зафиксировано в `concepts/books-ssh-access.md` §«sshd hardening state».
|
||||
|
||||
## Open questions
|
||||
|
||||
(none — все решены в audit)
|
||||
|
||||
## Completed steps
|
||||
|
||||
- [x] **2026-05-24 ~15:53:** SSH audit run на vds-kzntsv:
|
||||
- `cat /home/vitya/.ssh/authorized_keys` → 1 key (`vitya@DESKTOP-NSEF0UK`)
|
||||
- `getent passwd` → 2 users with shell: root + vitya (минимум, ожидаемо)
|
||||
- `sudo cat /root/.ssh/authorized_keys` → 1 dead duplicate key (root SSH disabled)
|
||||
- `sudo systemctl is-active fail2ban` → active; 2670 failed / 37 banned (currently 0) — adequate
|
||||
- `sudo journalctl -u ssh ... | grep Accepted` → только vitya@94.19.247.14 last 7 days
|
||||
- `sudo sshd -T | grep ...` → correct hardening (permitrootlogin/passwordauth/kbd = no)
|
||||
- [x] **2026-05-24 ~15:55:** removed dead key из `/root/.ssh/authorized_keys` via `sudo bash -c ': > /root/.ssh/authorized_keys'`. File now empty (0 bytes).
|
||||
- [x] **2026-05-24:** documentation written → `.wiki/concepts/books-ssh-access.md` (retained keys table + sshd state + fail2ban + login history + add/revoke processes + cross-refs).
|
||||
|
||||
## Closed
|
||||
|
||||
**2026-05-24** — audit clean, нечего revoke'ать кроме cosmetic dead root key. Тенант-split Phase 3 §SSH-аудит acceptance ✅:
|
||||
|
||||
- ✅ `~/.ssh/authorized_keys` reviewed — 1 key (vitya, core dev)
|
||||
- ✅ Non-core keys revoked — N/A (none existed)
|
||||
- ✅ Analyst keys revoked — N/A (none existed)
|
||||
- ✅ Documented in `.wiki/concepts/books-ssh-access.md`
|
||||
|
||||
**Closes** Фаза 3, шаг 2 `tenant-split` design.
|
||||
|
||||
## Notes
|
||||
|
||||
- **Single-developer / single-key environment** — на этой машине я единственный человек, у которого SSH. Это упрощает audit dramatically. После Phase 4 (когда Bookva уедет на отдельный VDS) — каждая box будет под SSH своей "команды" (которая для нашего setup = me, но formal-administrator-of-bookva от учредителя Bookva может быть добавлен — process в `books-ssh-access.md` §«How to add a new key»).
|
||||
- **Bootstrap claim audit:** `[vds-kzntsv-bootstrap]` 🟢 close-note сказал «hardened sshd (key-only)». Verified through `sshd -T` — claim true, но raw `/etc/ssh/sshd_config` misleading (default pkg config). Если ещё кто-то будет верифицировать → `sshd -T` always.
|
||||
- **Atomic revert:** ничего материального не сделано revoke (только cosmetic empty root-keys). Если понадобится — `ssh vitya@89.253.255.94 'echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKwYw1sS0Dj5FQmNxqJUV9IxU+9hZcg8qYQRgLN5ER/Z vitya@DESKTOP-NSEF0UK" | sudo tee /root/.ssh/authorized_keys'`.
|
||||
|
||||
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-24T12:02:58.941Z -->
|
||||
<!-- closed-by: vitya / 2026-05-24 / audit clean, 0 keys revoked + cosmetic dead-key cleanup; doc'd in concepts/books-ssh-access.md -->
|
||||
Reference in New Issue
Block a user