diff --git a/README.md b/README.md index 706a8a1..6d0b0b1 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # ssh-monitor -**Версия:** `2.1.8-SAC` +**Версия:** `2.1.9-SAC` Bash-мониторинг **SSH**, **sudo**, **systemd-logind**: Telegram/email, бан IP (ipset), ежедневный отчёт, heartbeat. diff --git a/docs/security-roadmap.ru.md b/docs/security-roadmap.ru.md index 5049379..b8ea6a2 100644 --- a/docs/security-roadmap.ru.md +++ b/docs/security-roadmap.ru.md @@ -24,11 +24,15 @@ |--------|------|------| | **2.1.7-SAC** | Фаза 1 + выбранное из Фазы 4 | Права, `REPO_URL` обязателен, webhook, docs | ✅ реализовано | | **2.1.8-SAC** | Дополнение к 1.1 | SAC-first update: hardening прав на каждом прогоне updater | ✅ реализовано | -| **2.2.0-SAC** | Фаза 2 | Manifest, pinned ref, без слепого `reset --hard` | +| **2.1.9-SAC** | Дополнение к 1.x | Watchdog: `🖥️ Сервер:` в Telegram (как у агента) | ✅ реализовано | +| **2.2.0-SAC** | **Фаза 2** | Manifest, pinned ref, без слепого `reset --hard` | **следующий релиз** | | **2.3.0-SAC** | Фаза 3 | Парсер конфига без `source` (minor breaking) | Bump: `ssh-monitor` (`SSH_MONITOR_VERSION`) + `version.txt` в каждом релизе. +**Текущий статус (2026-07-08):** фаза 1 закрыта (2.1.7–2.1.9). **Дальше — фаза 2 → релиз 2.2.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). + --- ## Фаза 1 — 2.1.7-SAC @@ -232,14 +236,12 @@ Bump: `ssh-monitor` (`SSH_MONITOR_VERSION`) + `version.txt` в каждом ре ## Чек-лист «перед стартом работы завтра» -Утвердить галочками: - -- [ ] **Релиз 2.1.7** — scope: 1.1, 1.2 (warn), 1.4, 1.5, 4.4, 4.3 + **1.3 вариант A/B/C** -- [ ] **Релиз 2.2.0** — scope: 2.1–2.3, 2.5, 4.5, 4.7(M7); **2.4 отложить** +- [x] **Релиз 2.1.7–2.1.9** — фаза 1 + SAC-first + watchdog server label +- [ ] **Релиз 2.2.0** — scope: 2.1–2.3, 2.5, 4.5, 4.7(M7); **2.4 GPG отложить** - [ ] **Релиз 2.3.0** — scope: 3.1–3.3, удаление webhook (если A) - [ ] **Дефолт `GIT_REF`** в 2.2.0: тег из `version.txt` vs `main` -- [ ] **Миграция хостов 2.1.7:** рассылка примера `Environment=REPO_URL=...` для systemd / SAC -- [ ] **GPG:** отложить до явного запроса +- [x] **Миграция хостов:** SAC-first update, `known_hosts`, `REPO_URL` через SAC +- [ ] **Ingest mass-update backlog** — см. security-alert-center `docs/ingest-mass-update-backlog.ru.md` --- diff --git a/ssh-monitor b/ssh-monitor index 6f65f8b..54049a1 100644 --- a/ssh-monitor +++ b/ssh-monitor @@ -7,7 +7,7 @@ IFS=$'\n\t' # ============================================ CONFIG_FILE="/etc/ssh-monitor.conf" -SSH_MONITOR_VERSION="2.1.8-SAC" +SSH_MONITOR_VERSION="2.1.9-SAC" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" if [ -f "$SCRIPT_DIR/ssh-monitor-perms.sh" ]; then diff --git a/ssh-monitor-perms.sh b/ssh-monitor-perms.sh index 69573fb..2bf4d59 100644 --- a/ssh-monitor-perms.sh +++ b/ssh-monitor-perms.sh @@ -132,3 +132,42 @@ ssh_monitor_check_config_file_perms() { esac return 0 } + +# Подпись сервера в Telegram/webhook (как в ssh-monitor: SERVER_DISPLAY_NAME или hostname + IPv4). +ssh_monitor_server_display_name_with_ip() { + local hn ip + hn="${SERVER_DISPLAY_NAME:-}" + if [ -z "$hn" ]; then + hn="$(hostname 2>/dev/null | tr -d '\r\n')" + [ -z "$hn" ] && hn="(unknown)" + fi + ip="${SERVER_IPV4:-}" + if [ -z "$ip" ] && command -v ip >/dev/null 2>&1; then + ip="$(ip -4 route get 1.1.1.1 2>/dev/null | awk '/\bsrc\b/ {for (i = 1; i < NF; i++) if ($i == "src") { print $(i + 1); exit }}')" + [ -z "$ip" ] && ip="$(ip -4 route get 8.8.8.8 2>/dev/null | awk '/\bsrc\b/ {for (i = 1; i < NF; i++) if ($i == "src") { print $(i + 1); exit }}')" + fi + if [ -z "$ip" ] && command -v hostname >/dev/null 2>&1 && hostname -I >/dev/null 2>&1; then + ip="$(hostname -I 2>/dev/null | tr ' ' '\n' | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' | grep -Ev '^(127\.|0\.0\.0\.0)$' | head -n1)" + fi + if [ -n "$ip" ]; then + printf '%s (%s)' "$hn" "$ip" + else + printf '%s' "$hn" + fi +} + +ssh_monitor_message_ensure_server_line() { + local msg="$1" + if [[ "$msg" == *'🖥️ Сервер:'* ]]; then + printf '%s' "$msg" + return 0 + fi + local first rest + first="${msg%%$'\n'*}" + if [ "$first" = "$msg" ]; then + printf '%s\n🖥️ Сервер: %s' "$first" "$(ssh_monitor_server_display_name_with_ip)" + else + rest="${msg#*$'\n'}" + printf '%s\n🖥️ Сервер: %s\n%s' "$first" "$(ssh_monitor_server_display_name_with_ip)" "$rest" + fi +} diff --git a/ssh-monitor-watchdog b/ssh-monitor-watchdog index 416cef2..2c19e53 100644 --- a/ssh-monitor-watchdog +++ b/ssh-monitor-watchdog @@ -67,6 +67,7 @@ PY notify_send() { local message="$1" + message="$(ssh_monitor_message_ensure_server_line "$message")" if send_telegram_raw "$message"; then return 0 fi diff --git a/version.txt b/version.txt index d09524a..4f49bf9 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2.1.8-SAC +2.1.9-SAC