Мониторинг через webhooks: алерты в свои системы
Коротко. webhook-мониторинг сайтов — это когда система мониторинга при событии (сайт упал, восстановился, истекает SSL) шлёт HTTP POST с JSON-payload на ваш эндпоинт. В отличие от готовых интеграций, webhook позволяет завести алерт в любую свою систему: тикет-трекер, чат-бот, автоматический rollback. Главное правило безопасности — проверять HMAC-подпись (X-*-Signature) и таймстемп, иначе любой сможет подделать алерт.
Зачем нужны webhooks
Готовые интеграции (Telegram, Slack, PagerDuty) покрывают типовые сценарии. Но если нужно дёрнуть свой API документацию, создать инцидент в самописной системе или запустить runbook — нужен webhook. Это универсальный «клей» между мониторингом и вашей инфраструктурой.
- Автоматизация — алерт запускает скрипт, а не только уведомляет;
- Своя логика — маршрутизация, дедупликация, эскалация на вашей стороне;
- Интеграция — любая система с HTTP-эндпоинтом;
- Аудит — все события в вашей базе.
Структура JSON-payload
Типичный payload события «монитор упал» содержит идентификатор, тип события, цель, таймстемп и детали:
{
"event": "monitor.down",
"monitor_id": 4821,
"monitor_name": "API production",
"url": "https://api.example.com/health",
"status": "down",
"http_code": 503,
"error": "Service Unavailable",
"region": "eu-de",
"checked_at": "2026-06-18T09:14:22Z",
"timestamp": 1781766862
}
Проверка HMAC-подписи
Никогда не доверяйте payload без проверки подписи. Отправитель считает HMAC-SHA256 от тела запроса с секретом и кладёт в заголовок X-Signature. Получатель пересчитывает и сравнивает в постоянное время.
// Node.js: проверка webhook-подписи и защита от replay
const crypto = require('crypto');
function verifyWebhook(req, secret) {
const signature = req.headers['x-signature'] || '';
const timestamp = req.headers['x-timestamp'] || '';
const body = req.rawBody; // сырое тело до JSON.parse
// 1. Защита от replay: окно 300 секунд
const now = Math.floor(Date.now() / 1000);
if (Math.abs(now - Number(timestamp)) > 300) {
return false;
}
// 2. Пересчитываем подпись от timestamp + body
const expected = crypto
.createHmac('sha256', secret)
.update(timestamp + '.' + body)
.digest('hex');
const provided = signature.replace(/^sha256=/, '');
// 3. Сравнение в постоянное время
const a = Buffer.from(expected, 'hex');
const b = Buffer.from(provided, 'hex');
return a.length === b.length && crypto.timingSafeEqual(a, b);
}
Чек-лист безопасного приёмника
| Проверка | Зачем |
|---|---|
| Валидация HMAC-подписи | Подтверждает, что payload от вашего провайдера |
| Окно таймстемпа (±300с) | Защита от replay перехваченного запроса |
| timingSafeEqual для сравнения | Защита от timing-атак на подпись |
| Идемпотентность по event id | Дубли доставки не создают дублей инцидентов |
| Только SSL/TLS проверку на эндпоинте | Payload и подпись не читаются в открытом виде |
Без проверки подписи webhook-эндпоинт — открытая дверь: злоумышленник может слать фейковые «сайт упал/восстановился» и сбивать вашу автоматику. HMAC + таймстемп закрывают и подделку, и replay.
Обработка событий up/down
После проверки подписи разведите события по типам: monitor.down — открыть инцидент, monitor.up — закрыть, ssl.expiring — создать задачу на обновление сертификата. Делайте обработку идемпотентной: провайдеры ретраят доставку, и один и тот же event может прийти дважды.
Webhooks в enterno.io
enterno.io отправляет webhook на события monitor.down, monitor.up, monitor.degraded, ssl.expiring, ssl.expired, domain.expiring. Каждый запрос подписан HMAC (X-*-Signature) с таймстемпом — проверяйте оба. Управлять подписками можно через REST API v4 (endpoint /api/v4/webhooks), включая тестовую отправку. Помимо webhook доступны Telegram, Slack, email, PagerDuty, Jira — webhook нужен, когда готовых интеграций мало и нужна своя логика.
FAQ
Чем webhook лучше готовой интеграции?
Готовая интеграция уведомляет в конкретный сервис. Webhook даёт полный контроль: своя маршрутизация, запуск автоматики, интеграция с любой системой по HTTP.
Обязательно ли проверять подпись?
Да. Без проверки HMAC любой, кто узнает ваш URL, сможет слать фейковые алерты. Подпись + таймстемп — обязательный минимум безопасности.
Зачем нужно окно таймстемпа?
Чтобы перехваченный валидный запрос нельзя было переотправить позже (replay-атака). Запросы старше ~300 секунд отклоняются даже с верной подписью.
Как протестировать приёмник webhook?
В enterno.io API v4 есть тестовая отправка события на webhook (action=test) — она шлёт реальный подписанный payload на ваш эндпоинт.
Заведите алерты в свою систему: настройте webhook на enterno.io/monitors и управляйте подписками через API v4. Полезное: лучшие практики алертинга, мониторинг аптайма API, мониторинг как код.