feat: safe config parser without source (2.3.0-SAC)

Whitelist-based /etc/ssh-monitor.conf load; validate URLs/enums/CIDR; remove BACKUP_WEBHOOK_URL.
This commit is contained in:
2026-07-08 12:57:36 +10:00
parent 6511d34ca7
commit 18a65078fc
11 changed files with 308 additions and 114 deletions
+1 -1
View File
@@ -56,7 +56,7 @@ sudo apt install -y ip6tables
(На многих образах **ip6tables** уже входит в метапакет с iptables.)
**Шаг 3.** Если включите доставку почты (`MAIL_*` в конфиге) или **BACKUP_WEBHOOK_URL** (через Python):
**Шаг 3.** Если включите доставку почты (`MAIL_*` в конфиге):
```bash
sudo apt install -y python3
-1
View File
@@ -93,6 +93,5 @@ sudo ssh-monitor --check-config
## Каналы доставки
- **`NOTIFY_CHAIN`**: `telegram`, `email` — при каждом событии попытка **во все** каналы списка.
- **`BACKUP_WEBHOOK_URL`** *(deprecated, legacy)*: только если **все** каналы цепочки не доставили сообщение. В типовом деплое не используется; удаление в 2.3.x.
Режим **`--dry-run`**: уведомления не отправляются; в stderr печатается текст **уже с подписью сервера**.
+21 -20
View File
@@ -25,6 +25,7 @@
| **2.1.7-SAC** | Фаза 1 + выбранное из Фазы 4 | Права, `REPO_URL` обязателен, webhook, docs | ✅ реализовано |
| **2.1.8-SAC** | Дополнение к 1.1 | SAC-first update: hardening прав на каждом прогоне updater | ✅ реализовано |
| **2.1.9-SAC** | Дополнение к 1.x | Watchdog: `🖥️ Сервер:` в Telegram (как у агента) | ✅ реализовано |
| **2.3.0-SAC** | **Фаза 3** | Парсер конфига без `source`, валидация, удаление BACKUP_WEBHOOK | ✅ реализовано |
| **2.2.3-SAC** | Дополнение к 2.2.x | Подавление sudo TG при SAC bootstrap/update | ✅ реализовано |
| **2.2.1-SAC** | Дополнение к 2.2.0 | Подавление lifecycle/watchdog TG при SAC-update | ✅ реализовано |
| **2.2.0-SAC** | **Фаза 2** | Manifest, pinned ref, без слепого `reset --hard` | ✅ реализовано |
@@ -32,8 +33,8 @@
Bump: `ssh-monitor` (`SSH_MONITOR_VERSION`) + `version.txt` в каждом релизе.
**Текущий статус (2026-07-08):** фаза 2 закрыта (2.2.0-SAC). **Дальше — фаза 3 → релиз 2.3.0-SAC.**
Backlog по ingest при массовом update (SAC + ops): [ingest-mass-update-backlog.ru.md](https://git.kalinamall.ru/PapaTramp/security-alert-center/src/branch/main/docs/ingest-mass-update-backlog.ru.md) (отдельный ToDo, не блокирует 2.2.0).
**Текущий статус (2026-07-08):** фаза 3 закрыта (2.3.0-SAC). **Дальше — ingest backlog (SAC) и опционально GPG / GIT_REF=tag на проде.**
Backlog по ingest при массовом update (SAC + ops): [ingest-mass-update-backlog.ru.md](https://git.kalinamall.ru/PapaTramp/security-alert-center/src/branch/main/docs/ingest-mass-update-backlog.ru.md) (отдельный ToDo).
---
@@ -64,8 +65,8 @@ Backlog по ingest при массовом update (SAC + ops): [ingest-mass-upd
- [x] В `ssh-monitor.conf.example`: закомментировать / убрать из «активного» блока, комментарий `DEPRECATED: не используется в типовом деплое; будет удалён в 2.3.x`
- [x] В README / `docs/notifications.ru.md`: пометить **legacy / необязательно**
- [x] В `--check-config`: если задан — `WARN: BACKUP_WEBHOOK_URL deprecated`
- [ ] **Удаление кода** отложить до **2.3.0** или позже, если подтвердим, что нигде не нужен
- [x] В `--check-config`: если задан — WARN (удалён в 2.3.0)
- [x] **Удаление кода****2.3.0-SAC**
---
@@ -178,37 +179,37 @@ Backlog по ingest при массовом update (SAC + ops): [ingest-mass-upd
### 3.1 Парсер без `source` (C1) — **утверждено**
- [ ] Whitelist ключей: `TELEGRAM_*`, `SAC_*`, `MAIL_*`, `NOTIFY_*`, числовые лимиты, пути и т.д.
- [ ] Формат строк: `KEY="value"` / `KEY='value'` / `KEY=value`
- [ ] Игнор `#` комментариев; неизвестные ключи — WARN (или сохранять в sidecar — не нужно)
- [x] Whitelist ключей: `TELEGRAM_*`, `SAC_*`, `MAIL_*`, `NOTIFY_*`, числовые лимиты, пути и т.д.
- [x] Формат строк: `KEY="value"` / `KEY='value'` / `KEY=value`
- [x] Игнор `#` комментариев; неизвестные ключи — WARN
**Файлы:** `ssh-monitor`, `ssh-monitor-watchdog` (если source конфиг)
**Файлы:** `ssh-monitor-perms.sh` (`ssh_monitor_config_load_file`), `ssh-monitor`, `ssh-monitor-watchdog`
---
### 3.2 Миграция — **решение агента**
- [ ] **2.3.0:** парсер по умолчанию; `source` **удалить**
- [ ] Синтаксис файла **не меняется** для пользователя — те же `KEY="value"`
- [ ] В release notes: «поведение то же, выполнение bash из конфига невозможно»
- [ ] `ssh-monitor --check-config` проверяет неизвестные/битые строки
- [ ] Отдельная команда миграции **не нужна** (формат тот же)
- [x] **2.3.0:** парсер по умолчанию; `source` **удалён**
- [x] Синтаксис файла **не меняется** для пользователя — те же `KEY="value"`
- [x] В release notes: «поведение то же, выполнение bash из конфига невозможно»
- [x] `ssh-monitor --check-config` проверяет неизвестные/битые строки (WARN) и значения (ERROR)
- [x] Отдельная команда миграции **не нужна** (формат тот же)
---
### 3.3 Валидация значений — **решение агента**
- [ ] URL: `SAC_URL`, `MAIL_SMTP_HOST` — схема https/http, не пустой host
- [ ] Enum: `UseSAC``off|exclusive|dual|fallback`
- [ ] Числа: существующие `validate_numeric_or_default` расширить
- [ ] IP/CIDR в `WHITELIST_*` — базовая проверка формата
- [ ] Ошибки валидации → exit 1 на старте и в `--check-config`
- [x] URL: `SAC_URL` — http(s)://host
- [x] Enum: `UseSAC``off|exclusive|dual|fallback`; `GIT_VERIFY_MODE``off|tag|commit`
- [x] Числа: существующие `validate_numeric_or_default`
- [x] IP/CIDR в `WHITELIST_*` — базовая проверка формата
- [x] Ошибки валидации → exit 1 на старте и в `--check-config`
---
### 3.x Удаление `BACKUP_WEBHOOK` (если утвердили soft-deprecate в 1.3)
- [ ] Удалить код и документацию в **2.3.0** или **2.4.0**, если подтверждено неиспользование
- [x] Удалить код и документацию в **2.3.0**
---
@@ -240,7 +241,7 @@ Backlog по ingest при массовом update (SAC + ops): [ingest-mass-upd
- [x] **Релиз 2.1.72.1.9** — фаза 1 + SAC-first + watchdog server label
- [x] **Релиз 2.2.0** — scope: 2.12.3, 2.5, 4.5, 4.7(M7); **2.4 GPG отложить**
- [ ] **Релиз 2.3.0** — scope: 3.13.3, удаление webhook (если A)
- [x] **Релиз 2.3.0** — scope: 3.13.3, удаление webhook
- [ ] **Дефолт `GIT_REF`** в 2.2.0: тег из `version.txt` vs `main`
- [x] **Миграция хостов:** SAC-first update, `known_hosts`, `REPO_URL` через SAC
- [ ] **Ingest mass-update backlog** — см. security-alert-center `docs/ingest-mass-update-backlog.ru.md`