Files
ssh-monitor/docs/notifications.ru.md
T
PTah 2048162057 feat: release 2.1.8-SAC — security phase 1 and SAC-first update hardening
Updater applies chmod/chown on config, spool and state paths on every run.
SAC is the primary update path; optional cron uses the same behavior.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-08 09:44:24 +10:00

5.8 KiB
Raw Permalink Blame History

Уведомления ssh-monitor

Документ описывает, какие сообщения отправляет монитор, какие поля в них есть и как настроить подпись сервера и часовой пояс.

См. также: README.md, пример конфига ssh-monitor.conf.example.

Подпись сервера (🖥️ Сервер)

Начиная с версии 1.1.3-server-label, каждое уведомление, проходящее через notify_send(), получает строку «🖥️ Сервер: …» сразу после первой строки (заголовка алерта).

Формат значения:

Условие Пример
SERVER_DISPLAY_NAME пусто, IPv4 найден web01 (10.1.20.5)
SERVER_DISPLAY_NAME пусто, IPv4 нет web01
Задан SERVER_DISPLAY_NAME="prod-db-01" prod-db-01 (10.1.20.5)

IPv4 определяется через ip -4 route get (исходящий адрес) или hostname -I. Нужны утилиты hostname и ip — см. install-prerequisites.ru.md.

Если в тексте сообщения уже есть подстрока 🖥️ Сервер:, вторая строка не добавляется (защита от дубля при ручной вставке).

Пример: успешный SSH

✅ УСПЕШНОЕ SSH ПОДКЛЮЧЕНИЕ
🖥️ Сервер: myhost (10.1.20.5)
👤 Пользователь: alice
🌐 IP адрес: 10.1.20.1
🕐 Время: 25.05.2026 09:08:22

Пример: sudo

⚠️ ИСПОЛЬЗОВАНИЕ SUDO
🖥️ Сервер: myhost (10.1.20.5)
👤 Пользователь: alice
🔑 От имени USER: root
💻 Команда: /bin/bash
📁 Директория: /home/alice
🕐 Время: 24.05.2026 16:54:49

Настройка в /etc/ssh-monitor.conf

# Пусто = hostname (+ IPv4 при возможности)
SERVER_DISPLAY_NAME=""

# Или фиксированное имя для этого хоста в общем чате:
# SERVER_DISPLAY_NAME="dc1-app-03"

Проверка эффективной подписи:

sudo ssh-monitor --check-config

В выводе будет строка SERVER_DISPLAY_NAME=... (эффективно: ...).

Типы уведомлений

Событие Заголовок (первая строка) Доп. поля
Успешный SSH УСПЕШНОЕ SSH ПОДКЛЮЧЕНИЕ пользователь, IP клиента, время
SSH под root 🔑 SSH ВХОД ПОД ROOT IP, время
Неудачная попытка SSH НЕУДАЧНАЯ ПОПЫТКА SSH пользователь, IP, счётчик попыток, время
Sudo ⚠️ ИСПОЛЬЗОВАНИЕ SUDO пользователь, USER=, команда, PWD, время
Бан IP 🚫 IP ЗАБЛОКИРОВАН АВТОМАТИЧЕСКИ IP, попытки, длительность, время
Порог без бана ⚠️ ЛИМИТ НЕУДАЧНЫХ SSH (автобан отключён…) IP, попытки, время
Брутфорс 🧨 ВОЗМОЖНЫЙ МАССОВЫЙ БРУТФОРС SSH IP, счётчик за окно, время
Host key / MITM 🔐 ВНИМАНИЕ: изменение SSH host key… фрагмент журнала, время
logind: новая сессия 🖥️ НОВАЯ СЕССИЯ (systemd-logind) пользователь, ID сессии, время
logind: сбой СБОЙ (systemd-logind) строка журнала, время
Ежедневный отчёт 📊 ЕЖЕДНЕВНЫЙ ОТЧЕТ SSH МОНИТОРИНГА статистика 24 ч, баны, топ IP, сессии
Heartbeat ❤️ Heartbeat - скрипт мониторинга работает время
Старт / стоп СКРИПТ МОНИТОРИНГА ЗАПУЩЕН / ⚠️ ОСТАНОВЛЕН версия, каналы, время

Во всех перечисленных случаях 🖥️ Сервер добавляется автоматически (кроме сообщений, где вы сами вставили эту строку).

Время в сообщениях (🕐)

Строки «🕐 Время» формируются функцией notification_date():

  1. Если задан NOTIFY_TZ (IANA, например Europe/Moscow) — используется он.
  2. Иначе, если задан DAILY_REPORT_TZ — он.
  3. Иначе — зона процесса (date у systemd-сервиса; часто UTC, если в unit указано Environment=TZ=UTC).

Ежедневный отчёт по календарю и часу DAILY_REPORT_HOUR использует DAILY_REPORT_TZ (или зону процесса) — см. README.

Каналы доставки

  • NOTIFY_CHAIN: telegram, email — при каждом событии попытка во все каналы списка.
  • BACKUP_WEBHOOK_URL (deprecated, legacy): только если все каналы цепочки не доставили сообщение. В типовом деплое не используется; удаление в 2.3.x.

Режим --dry-run: уведомления не отправляются; в stderr печатается текст уже с подписью сервера.