backup(books-vds): daily 06:00 MSK pipeline to kreknin live 🟢
- scripts/books-vds-backup-daily-kreknin/ — run.sh + .env.example + README - ES path.repo bootstrap (one-time stack edit, snapshot repo 'kreknin' registered) - curl smtps://yandex:465 email (CRLF + Date headers, no msmtp dep on CentOS 7) - StrictHostKeyChecking=yes + pre-populated known_hosts (CentOS 7 no accept-new) - cron /etc/cron.d/books-vds-backup live, initial sync 4.87 GB in 13m28s, ntfy push sent - wiki: entities/books-vds.md + sources/books-vds-backup-daily-kreknin-2026-05-25.md created - wiki: concepts/books-ssh-access → vds-kzntsv-ssh-access (was lying about books on vds-kzntsv) - .tasks/books-vds-backup-daily-kreknin.md closed 🟢 pending phone-side verify Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
90
.wiki/concepts/vds-kzntsv-ssh-access.md
Normal file
90
.wiki/concepts/vds-kzntsv-ssh-access.md
Normal file
@@ -0,0 +1,90 @@
|
||||
---
|
||||
title: vds-kzntsv — SSH access audit + retained keys
|
||||
status: live
|
||||
tags: [vds, ssh, audit, infra, ops]
|
||||
related: [[../entities/vds-kzntsv]], [[../sources/vds-kzntsv-bootstrap-2026-05-20]]
|
||||
---
|
||||
|
||||
# vds-kzntsv — SSH access (post-audit 2026-05-24)
|
||||
|
||||
Snapshot SSH-доступа к [[../entities/vds-kzntsv]] (`89.253.255.94 / vds.kzntsv.site`) — наш infra-VDS (gitea, registry, ntfy, mssql, minio, owncloud, board-viewer).
|
||||
|
||||
**Корректировка 2026-05-25:** до этой даты документ ошибочно утверждал что на vds-kzntsv живёт shared books-инсталляция. **Это неверно** — books-стек на отдельном клиентском VDS `89.253.255.133` (см. [[../entities/books-vds]]). vds-kzntsv хостит только нашу infra. Аудит ниже относится к vds-kzntsv SSH (наш infra-host), не к books VDS.
|
||||
|
||||
Создан 2026-05-24 в результате таски `[books-ssh-audit-shared-vds]` 🟢 — задача была названа в предположении что books на vds-kzntsv; reality по сути проверила infra SSH (что и должно было быть).
|
||||
|
||||
## Retained keys
|
||||
|
||||
| User | Key (truncated) | Owner | Date added | Reason | Source machine |
|
||||
|---|---|---|---|---|---|
|
||||
| `vitya` | `ssh-ed25519 AAAA…ER/Z vitya@DESKTOP-NSEF0UK` | Виктор Кузнецов (core dev) | 2026-05-20 (bootstrap) | Core developer, sole administrator. Single key for both dev + ops. | `DESKTOP-NSEF0UK` (home workstation) |
|
||||
|
||||
**Только 1 ключ.** Никаких аналитических, бывших-сотрудников, неопознанных ключей не найдено в audit'е 2026-05-24.
|
||||
|
||||
## Removed keys (audit cleanup)
|
||||
|
||||
| Path | Key | Status | Removed | Note |
|
||||
|---|---|---|---|---|
|
||||
| `/root/.ssh/authorized_keys` | `ssh-ed25519 AAAA…ER/Z vitya@DESKTOP-NSEF0UK` (duplicate vitya key) | Cosmetic dead | 2026-05-24 | Был dead с момента bootstrap'а — `sshd -T` показывает `permitrootlogin no`, root SSH disabled независимо от authorized_keys. Удалён для чистоты (backup в `/root/.ssh/authorized_keys.bak-pre-ssh-audit-2026-05-24`, но overwrite затёр содержимое — restoration trivial since key identical to vitya's main). |
|
||||
|
||||
## sshd hardening state
|
||||
|
||||
Effective config от `sshd -T 2>&1 | grep -E "^(permitrootlogin|passwordauthentication|pubkeyauthentication|challengeresponseauthentication|kbdinteractiveauthentication)"`:
|
||||
|
||||
```
|
||||
permitrootlogin no
|
||||
pubkeyauthentication yes
|
||||
passwordauthentication no
|
||||
kbdinteractiveauthentication no
|
||||
```
|
||||
|
||||
**Note:** raw grep `/etc/ssh/sshd_config` может показать `PermitRootLogin yes` / `PasswordAuthentication yes` — это default-config от пакета. Override'ы в `/etc/ssh/sshd_config.d/*.conf` (или drop-in от cloud-init) делают finальный config. Всегда проверять через `sshd -T`, не плоский config.
|
||||
|
||||
## fail2ban state (2026-05-24)
|
||||
|
||||
- `systemctl is-active fail2ban` → `active`
|
||||
- Total failed attempts (since deploy): **2670**
|
||||
- Total IPs ever banned: **37**
|
||||
- Currently banned: **0** (бан выходит по TTL)
|
||||
- Configured jail: `sshd` (default debian jail)
|
||||
|
||||
Brute-force protection adequate; нет required action.
|
||||
|
||||
## SSH login history (last 7 days)
|
||||
|
||||
`sudo journalctl -u ssh -u sshd --since="7 days ago" | grep Accepted` показал **только** `vitya from 94.19.247.14` (мой home public IP). Никаких других source-IP — clean.
|
||||
|
||||
## Books tenant-split — implications (исправлено 2026-05-25)
|
||||
|
||||
Spec `tenant-split.md` §«Двухуровневая изоляция пользователей → Infra-level» и аудит «не давать аналитикам Bookva SSH к VDS» — **должны были применяться к books VDS, не к vds-kzntsv**. Реальный books VDS = `89.253.255.133` ([[../entities/books-vds]]) — отдельный клиентский сервер. SSH-аудит на books VDS — отдельная follow-up задача.
|
||||
|
||||
vds-kzntsv (этот документ) — infra-VDS, не имеет отношения к books tenants. После Phase 4 books tenant-split:
|
||||
- books VDS (`89.253.255.133`) — текущий shared books → может остаться за Slovo (или Bookva, как пользователь решит).
|
||||
- vds-bookva-new — отдельный VDS у учредителя Bookva. См. `.tasks/books-vds-bookva-bootstrap.md` + `books-dns-cutover-bookva.md`.
|
||||
|
||||
vds-kzntsv остаётся infra-host независимо от tenant-split исхода.
|
||||
|
||||
## How to add a new key (process)
|
||||
|
||||
1. Получить от пользователя `<key-type> <key-data> <comment>` (full one-line pubkey).
|
||||
2. Verify identity: comment должен match human-readable identifier (`alice@laptop`, не just `id_ed25519`).
|
||||
3. Document **before** adding: append row to "Retained keys" table выше с rationale.
|
||||
4. Commit doc change (PR / direct push depending on grant).
|
||||
5. После doc-commit: `ssh vitya@vds.kzntsv.site 'echo "<key-line>" >> ~/.ssh/authorized_keys'`.
|
||||
6. Verify new user can login via new key.
|
||||
7. **NEVER** add key without doc update — иначе через 3 месяца забудем кто/зачем.
|
||||
|
||||
## How to revoke a key
|
||||
|
||||
1. Backup: `sudo cp ~/.ssh/authorized_keys ~/.ssh/authorized_keys.bak-$(date +%F)`.
|
||||
2. Edit `~/.ssh/authorized_keys` — delete the line.
|
||||
3. Update doc — переместить row из "Retained" в новый "Revoked" section с datestamp + reason.
|
||||
4. Verify revoked key fails: `ssh -i <revoked-key> vitya@vds.kzntsv.site` returns publickey rejection.
|
||||
5. Commit doc change.
|
||||
|
||||
## Cross-refs
|
||||
|
||||
- [[vds-kzntsv]] — entity page (host details).
|
||||
- [[../sources/vds-kzntsv-bootstrap-2026-05-20]] — bootstrap chronology, contains initial sshd hardening setup.
|
||||
- `victor/books` `.wiki/concepts/tenant-split.md` §«Двухуровневая изоляция пользователей» — design context для этого аудита.
|
||||
- `.tasks/books-ssh-audit-shared-vds.md` — close-note + decisions.
|
||||
Reference in New Issue
Block a user