diff --git a/README.md b/README.md index e06399f..2d56c02 100644 --- a/README.md +++ b/README.md @@ -1,72 +1,211 @@ -![alt text]() +# 🤖 Telegram SSH Notifier -![alt text](img/image.png) +[![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. -Сохраните скрипт -sudo nano /usr/local/bin/telegram-ssh-notify.sh +## 📦 Возможности -Вставьте код и сделайте исполняемым: sudo chmod +x /usr/local/bin/telegram-ssh-notify.sh +- ✅ Уведомления об **успешных** входах (кто, откуда, когда) +- ⚠️ Уведомления о **неудачных** попытках (с подсчётом попыток с одного 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 +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="1.2.3.4" +BLACKLIST_IPS="" -Откройте файл /etc/pam.d/sshd в редакторе (например, nano или vim): +# Минимальный интервал между одинаковыми уведомлениями (секунды) +RATE_LIMIT_SEC=60 -sudo nano /etc/pam.d/sshd +3. Настройте PAM (для уведомлений об успешных входах и выходах) -Добавьте в конец файла строку: +Добавьте в файл /etc/pam.d/sshd строку: -session optional pam_exec.so /usr/local/bin/telegram-ssh-notify.sh #(обратите внимание: если вы переименовали скрипт, укажите правильное имя) +session optional pam_exec.so /usr/local/bin/telegram-ssh-notify.sh -Сохраните файл и закройте редактор. +Важно: строка добавляется без sudo в начале — вы редактируете файл через редактор. -Перезапускать SSH не обязательно — PAM читает конфигурацию при каждой новой сессии. +4. Запустите мониторинг неудачных попыток (демон) -Создайте файл юнита (например, /etc/systemd/system/ssh-check.service): +Создайте systemd-сервис: -sudo nano /etc/systemd/system/ssh-check.service - -Вставьте следующее содержимое (подставьте правильный путь к вашему скрипту, если он называется иначе, например, telegram-ssh-notify.sh): +sudo nano /etc/systemd/system/telegram-ssh-notify.service [Unit] -Description=SSH Login Monitor for Telegram Notifications +Description=Telegram SSH Notifier Monitor After=network.target [Service] -ExecStart=/usr/local/bin/ваш_скрипт.sh monitor +ExecStart=/usr/local/bin/telegram-ssh-notify.sh monitor Restart=always User=root [Install] WantedBy=multi-user.target -Обратите внимание: в ExecStart нужно указать команду с аргументом monitor (как в вашем скрипте). -Если ваш скрипт называется telegram-ssh-notify.sh, то строка будет: +Активируйте и запустите: -ExecStart=/usr/local/bin/telegram-ssh-notify.sh monitor - -Перечитайте конфигурацию systemd и запустите сервис: - -bash sudo systemctl daemon-reload -sudo systemctl enable ssh-check.service # автозапуск при загрузке -sudo systemctl start ssh-check.service +sudo systemctl enable --now telegram-ssh-notify Проверьте статус: -bash -sudo systemctl status ssh-check.service +sudo systemctl status telegram-ssh-notify -Теперь ваш монитор будет работать как демон. \ No newline at end of file +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 \ No newline at end of file diff --git a/img/image copy 2.png b/img/image copy 2.png new file mode 100644 index 0000000..0f2cca6 Binary files /dev/null and b/img/image copy 2.png differ diff --git a/sshlogin.png b/sshlogin.png deleted file mode 100644 index 379ef12..0000000 Binary files a/sshlogin.png and /dev/null differ