2026-02-22 20:51:55 +03:00
2026-02-22 20:47:47 +03:00
fix
2026-02-22 20:51:55 +03:00
2026-02-22 20:16:52 +03:00

🤖 Telegram SSH Notifier

Version License Telegram

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. Скачайте скрипт

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](<img/image copy.png>)

Неудачная попытка (предупреждение):

![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
Description
No description provided
Readme 142 KiB
Languages
Shell 100%