fr1: туннель Маруси проверен; fail2ban — домашний IP в ignoreip

- 18788 только на loopback, 8788/18788 снаружи закрыты, коды вебхука
  совпали с ожидаемыми, секрета в логах nginx нет
- грабли: access log выключен только в vhost astra — запрос к пути
  вебхука на другом имени пишется в общий лог (было превью TelegramBot
  с пустым секретом)
- fail2ban: 46.199.208.45 в ignoreip (IP динамический — ⚠️)
- интеграция не завершена: навык VK и проверка на колонке за владельцем

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
gilfanovr
2026-10-11 18:59:35 +03:00
co-authored by Claude Opus 5.5
parent 587ae5ce7a
commit 5cc0d468ef
+9 -5
View File
@@ -15,7 +15,7 @@
- ⚠️ **Группа `docker` = root-эквивалент.** `docker:x:988:rus,tgclaude` — любой её член монтирует `/` в контейнер и делает что угодно от рута (этим же способом чистились root-овы файлы 2026-09-08). Поэтому «у `tgclaude` нет sudo» **не** означает ограничения прав на хосте.
- Вход с Mac: `ssh rus-161` (алиас в `~/.ssh/config`) → ключ `~/.ssh/id_161_97_93_252` (ed25519).
- root-доступ по SSH закрыт; для root изнутри — `sudo -i`.
- Пользователь `marusia-tunnel` (uid 1002, с 2026-10-11) — **только обратный SSH-туннель** от rpi для вебхука Маруси (`stacks/astra-marusia/`). Shell `/usr/sbin/nologin`, пароль заблокирован, групп кроме своей нет. `~/.ssh/authorized_keys` принадлежит root (сам пользователь его не поменяет), ключ с `restrict,port-forwarding,permitlisten="127.0.0.1:18788"`. Ограничения продублированы в sshd: `/etc/ssh/sshd_config.d/70-marusia-tunnel.conf` (`Match User`: `AllowTcpForwarding remote`, `PermitListen 127.0.0.1:18788`, `PermitOpen none`, `PermitTTY no`, `MaxSessions 0`, только publickey).
- Пользователь `marusia-tunnel` (uid 1002, с 2026-10-11) — **только обратный SSH-туннель** от rpi для вебхука Маруси (`stacks/astra-marusia/`). Shell `/usr/sbin/nologin`, пароль заблокирован, групп кроме своей нет. `~/.ssh/authorized_keys` принадлежит root (сам пользователь его не поменяет), ключ с `restrict,port-forwarding,permitlisten="127.0.0.1:18788"`. Ограничения продублированы в sshd: `/etc/ssh/sshd_config.d/70-marusia-tunnel.conf` (`Match User`: `AllowTcpForwarding remote`, `PermitListen 127.0.0.1:18788`, `PermitOpen none`, `PermitTTY no`, `MaxSessions 0`, только publickey). Туннель поднят с rpi 2026-10-11 (`astra-marusia-tunnel.service`), входит с `46.199.208.45`, отпечаток ключа `SHA256:XMUGNzoDstNGNJQ0yCZ6KLJ6zx8DIKHUbBH/s7oIBS4`. При входе logind поднимает `systemd --user` + `(sd-pam)` под этим пользователем — это норма PAM-сессии, оболочки нет. Домашний каталог 750 (дефолт Ubuntu 24.04): из-под `rus` ключ не прочитать, только через sudo.
- **Пуш-ключ `metrics-push@rpi`** (с 2026-10-11) в `~rus/.ssh/authorized_keys` с `restrict,command="/home/rus/bin/pushgw-ingest rpi"`: этим ключом домашняя малина может только залить метрики в pushgateway — шелла, форвардинга и pty нет. Бэкап прежнего файла — `~/.ssh/authorized_keys.bak-20261011`.
## SSH (`/etc/ssh/sshd_config.d/00-hardening.conf`)
@@ -64,13 +64,16 @@ AllowUsers rus tgclaude marusia-tunnel
```
[DEFAULT]
bantime=1h findtime=10m maxretry=5
ignoreip = 127.0.0.1/8 ::1 31.153.37.106
ignoreip = 127.0.0.1/8 ::1 31.153.37.106 46.199.208.45
backend=systemd banaction=ufw
[sshd] enabled=true
[recidive] enabled=true bantime=1w findtime=1d maxretry=5
backend=auto logpath=/var/log/fail2ban.log
```
- `46.199.208.45` — текущий домашний IP (Cyta, за ним rpi и Mac), добавлен 2026-10-11 (было только `31.153.37.106`), бэкап `jail.local.bak-20261011-175800`. Зачем: туннель Маруси с rpi переподключается сам, и серия ошибок входа забанила бы весь дом — вместе с `ssh rus-161` — на час, а `recidive` на неделю.
- ⚠️ **Домашний IP динамический** (PPPoE Cyta, см. `servers/rpi.md`). После смены адреса защита молча пропадёт, а в `ignoreip` останется чужой адрес — сверять с `router status` на rpi.
- ⏳ Происхождение `31.153.37.106` нигде не записано (стоит с 2026-06-21) — выяснить и убрать, если не нужен.
## Обновления
- Ubuntu Pro подключён (аккаунт ruzzyrullezz@gmail.com): **livepatch**, **esm-infra**, **esm-apps** — enabled.
@@ -109,6 +112,8 @@ backend=systemd banaction=ufw
- vhost `astra.ruzzy.dev` (с 2026-10-11) — вебхук Маруси для разговорного сервиса на rpi, конфиг в репо `stacks/astra-marusia/`. Только `POST /marusia/webhook/…` → `127.0.0.1:18788/webhook/…` (SSH-туннель от rpi, см. пользователя `marusia-tunnel`), остальное — 404. Зона `limit_req` `marusia_webhook` в `/etc/nginx/conf.d/marusia-webhook.conf` (1 r/s, burst 5, 429); тело до 64k, таймауты 1s/5s/5s.
- ⚠️ Ссылка называется `sites-enabled/zz-astra.ruzzy.dev.conf`, а не по имени домена: иначе она встала бы по алфавиту раньше `git` и перехватила ответ на неизвестный SNI. Новые vhost'ы на букву раньше `g` подключать с тем же расчётом.
- ⚠️ Секрет вебхука — часть URL. Для location выключен access log, а `error_log /var/log/nginx/marusia-webhook.error.log crit`: на уровне `error` nginx пишет туда строку запроса с секретом (502 при упавшем туннеле, срабатывание `limit_req`). Повышать уровень лога нельзя.
- ⚠️ access log выключен **только в этом vhost**. Запрос к `/marusia/webhook/<секрет>` на другом имени (`ruzzy.dev`, `fr1.ruzzy.dev`, голый IP) обработает vhost `git` и запишет секрет в общий `access.log`. Так 2026-10-11 там оказалась строка от превью ссылок Telegram (`TelegramBot`, 149.154.161.220) — правда, с пустым секретом: ссылку из ТЗ оборвало на `<`. Вывод: настоящий URL вебхука не вставлять в Telegram и чаты вообще — превью откроет его само.
- Проверено 2026-10-11: `18788` слушает только `127.0.0.1` (sshd `marusia-tunnel`), снаружи 8788/18788 закрыты; GET → 403, неверный секрет → 404, верный секрет с чужим skill/user → 403 (проверял rpi), `/` → 404; путь с секретом в `access.log*`/`error.log*` не встречается; прочие vhost'ы отвечают как до работ.
- Сертификаты LE: `mon`, `git`, `share`, `www`, `astra` (с 2026-10-11, `certbot certonly --nginx`, продление тем же таймером). `cam.ruzzy.dev` удалён 2026-09-08 вместе с ipcam.
## Мониторинг (`~/monitoring`, stack в репо `stacks/monitoring/`)
@@ -260,9 +265,8 @@ backend=systemd banaction=ufw
- `~tgclaude/.openclaw-auth-profile-secrets` — права **777** на каталоге для секретов (сейчас пуст), стоит `chmod 700`.
- Не решено, нужны ли на fr1: `~rus/backups` (5.4 ГБ архивов с выведенного de1) и спящий openclaw (947 МБ дерева + 2.0 ГБ состояния + образ-снимок 1.55 ГБ).
- Страховочные файлы, оставленные после работ: `~rus/imgbot-repo-pre-merge-20260908-133444.tar.gz` (369 КБ), `~rus/imgbot-legacy-archive-rows-20260908.json` (808 КБ), `~rus/gitea/docker-compose.yml.bak-20260908`.
- ⏳ **Вебхук Маруси не доведён** (2026-10-11): ключ туннеля от rpi ещё не положен в `~marusia-tunnel/.ssh/authorized_keys`, туннель не поднят. Пока POST на `astra.ruzzy.dev/marusia/webhook/…` отдаёт 502. Дальше: туннель, проверка цепочки, skill_id и проверка на настоящей колонке (`stacks/astra-marusia/README.md`).
- Снимок `nginx -T`, `sshd -T`, `ss -lntp` до работ над вебхуком лежит в `~rus/marusia-audit/` (600). Скрипты `/tmp/marusia-stage{1,2,3}.sh` — одноразовые, удалить после завершения.
- Если IP малины не в `ignoreip` fail2ban, ошибки авторизации туннеля при переподключении могут забанить её на 1 ч (jail `sshd`), а повторные баны (`recidive`) — на неделю.
- ⏳ **Вебхук Маруси: fr1 и туннель готовы, интеграция не завершена** (2026-10-11). Осталось за владельцем и rpi: приватный навык в VK, `MARUSIA_SKILL_ID` в env на rpi, URL `https://astra.ruzzy.dev/marusia/webhook/<секрет>` в настройках навыка, проверка в отладчике VK и на настоящей колонке (`stacks/astra-marusia/README.md`).
- Снимок `nginx -T`, `sshd -T`, `ss -lntp` до работ над вебхуком лежит в `~rus/marusia-audit/` (600) — на случай отката; удалить, когда интеграция устоится.
- ⚠️ Описания **других** серверов не сверялись: `servers/de1.md` и `servers/ru1.md` датируются временем до вывода de1, так что могут врать.
## Как это описание поддерживается