# 🤖 Telegram SSH Notifier [![Version](https://img.shields.io/badge/version-3.0.0-blue.svg)](https://git.grenu4.ru/y0zhyck/notification_ssh) [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE) [![Telegram](https://img.shields.io/badge/Telegram-Notification-brightgreen)](https://t.me/Y0zhyck) **Telegram SSH Notifier** — это bash-скрипт для мониторинга SSH-входов на сервере и отправки уведомлений в Telegram. Он отслеживает успешные и неудачные попытки входа, определяет геолокацию IP-адресов (опционально) и может автоматически блокировать подозрительные IP. ## 📦 Возможности - ✅ Уведомления об **успешных** входах (кто, откуда, когда) - ⚠️ Уведомления о **неудачных** попытках (с подсчётом попыток с одного IP) - 🔥 **Критические оповещения** при множестве неудачных попыток за короткое время (брутфорс) - 🌍 Определение **геолокации** по IP (через ip-api.com или локальную базу GeoIP2) - 🛡️ **Белый и чёрный списки** IP (игнорирование доверенных / немедленная блокировка) - ⏱️ **Rate limiting** – защита от спама уведомлениями - 🔒 **Автоматическая блокировка** IP через iptables/fail2ban (опционально) - 📁 Хранение статистики неудачных попыток - 🧹 Автоматическая очистка старых логов - ⚙️ Гибкая конфигурация через файл или переменные окружения - 🚀 Работа в режиме **демона** (мониторинг логов) или интеграция через **PAM** ## 📋 Требования - **ОС**: Linux (совместим с systemd, любым дистрибутивом) - **Утилиты**: `bash`, `curl`, `md5sum` (обычно есть везде) - **Для геолокации** (опционально): `jq` (для API ip-api.com) или `mmdblookup` с базой MaxMind GeoIP2 - **Для автоблокировки** (опционально): `iptables`, `fail2ban` или другой инструмент ## 🚀 Установка ### 1. Скачайте скрипт ```bash sudo curl -L -o /usr/local/bin/telegram-ssh-notify.sh https://raw.githubusercontent.com/your/repo/main/telegram-ssh-notify.sh sudo chmod +x /usr/local/bin/ssh-telegram.sh 2. Создайте конфигурационный файл sudo nano /etc/telegram-ssh-notify.conf Пример минимальной конфигурации: # Telegram Bot Token (получить у @BotFather) TELEGRAM_TOKEN= # ID чата или группы (можно узнать у @userinfobot) TELEGRAM_CHAT_ID= # Опционально: ID темы в группе (если используется супергруппа с темами) TELEGRAM_TOPIC_ID= # Количество неудачных попыток за CRITICAL_TIME_WINDOW для критического оповещения MAX_ATTEMPTS_BEFORE_CRITICAL=20 CRITICAL_TIME_WINDOW=300 # секунд (5 минут) # Автоматически блокировать IP при критической атаке (требуется настройка BLOCK_COMMAND) AUTO_BLOCK_CRITICAL=false # Команда для блокировки IP (используйте {ip} как плейсхолдер) BLOCK_COMMAND="iptables -A INPUT -s {ip} -j DROP" # Белый и чёрный списки (IP или подсети через пробел) WHITELIST_IPS="127.0.0.1 10.0.0.0/8" BLACKLIST_IPS="" # Минимальный интервал между одинаковыми уведомлениями (секунды) RATE_LIMIT_SEC=60 3. Настройте PAM (для уведомлений об успешных входах и выходах) Добавьте в файл /etc/pam.d/sshd строку: session optional pam_exec.so /usr/local/bin/telegram-ssh-notify.sh Важно: строка добавляется без sudo в начале — вы редактируете файл через редактор. 4. Запустите мониторинг неудачных попыток (демон) Создайте systemd-сервис: sudo nano /etc/systemd/system/telegram-ssh-notify.service [Unit] Description=Telegram SSH Notifier Monitor After=network.target [Service] ExecStart=/usr/local/bin/telegram-ssh-notify.sh monitor Restart=always User=root [Install] WantedBy=multi-user.target Активируйте и запустите: sudo systemctl daemon-reload sudo systemctl enable --now telegram-ssh-notify Проверьте статус: sudo systemctl status telegram-ssh-notify 5. Проверьте работу Отправьте тестовое сообщение: bash sudo /usr/local/bin/telegram-ssh-notify.sh test Посмотрите статус: bash sudo /usr/local/bin/telegram-ssh-notify.sh status ``` ⚙️ Конфигурация Все параметры можно задать в файле /etc/telegram-ssh-notify.conf (одна строка = КЛЮЧ=значение) или через переменные окружения. Параметр Описание По умолчанию TELEGRAM_TOKEN Токен бота (обязательно) – TELEGRAM_CHAT_ID ID чата/группы (обязательно) – TELEGRAM_TOPIC_ID ID темы в супергруппе (опционально) – MAX_ATTEMPTS_BEFORE_CRITICAL Порог критических попыток 20 CRITICAL_TIME_WINDOW Интервал для критических попыток (сек) 300 AUTO_BLOCK_CRITICAL Блокировать IP при критической атаке (true/false) false BLOCK_COMMAND Команда блокировки (плейсхолдер {ip}) iptables -A INPUT -s {ip} -j DROP WHITELIST_IPS Список доверенных IP/подсетей (через пробел) – BLACKLIST_IPS Список IP для немедленной блокировки – RATE_LIMIT_SEC Интервал между повторными уведомлениями (сек, 0 = отключить) 60 ENABLE_GEOIP Включить геолокацию (true/false) true ENABLE_NOTIFICATIONS Включить отправку уведомлений (true/false) true DEBUG Режим отладки (пишется больше логов) false LOG_FILE Путь к лог-файлу скрипта /var/log/telegram-ssh-notify.log CLEANUP_DAYS Хранить статистику неудачных попыток (дней) 7 🧰 Использование Скрипт поддерживает несколько режимов работы: Режимы командной строки # Запуск мониторинга логов (обычно через systemd) telegram-ssh-notify.sh monitor # Очистка старых файлов статистики и кэша telegram-ssh-notify.sh cleanup # Просмотр статуса и статистики telegram-ssh-notify.sh status # Отправка тестового сообщения telegram-ssh-notify.sh test # Справка telegram-ssh-notify.sh --help PAM-режим (без аргументов) При вызове без аргументов скрипт работает в режиме PAM: читает переменные окружения PAM_TYPE, PAM_USER, PAM_RHOST и отправляет уведомления об успешных входах и выходах. Примеры уведомлений Успешный вход: ![alt text]() Неудачная попытка (предупреждение): ![alt text](img/image.png) Критическая атака: img/image copy 2.png 🔧 Устранение неполадок Логи скрипта Все события записываются в LOG_FILE (по умолчанию /var/log/telegram-ssh-notify.log). Просмотр: sudo tail -f /var/log/telegram-ssh-notify.log Не приходят уведомления Проверьте правильность токена и chat_id (тестовая команда test). Убедитесь, что бот добавлен в группу и имеет права на отправку сообщений. Проверьте лог скрипта на ошибки (например, таймауты curl). Включите DEBUG=true в конфиге для детального лога. Не работает геолокация Установите jq (sudo apt install jq) для работы с API ip-api.com. Или установите GeoIP2: sudo apt install mmdb-bin и скачайте базу GeoLite2-City.mmdb в /usr/share/GeoIP/. Если ничего не помогает, отключите GeoIP (ENABLE_GEOIP=false) – уведомления будут без геоданных. Не блокируются IP автоматически Убедитесь, что AUTO_BLOCK_CRITICAL=true. Проверьте, что команда BLOCK_COMMAND корректна и выполняется от root (скрипт запускается с правами root). Вместо прямой блокировки можно интегрировать с fail2ban: например, вызывать fail2ban-client set sshd banip {ip}. 🤝 Вклад в развитие Если у вас есть идеи по улучшению скрипта или вы нашли баг, создайте Issue или Pull Request на GitHub. Автор: [Evgeniy Spirin / Y0zhyck] Версия: 3.0.0 Дата: 2026