Files
notification_ssh/README.md
2026-02-22 20:50:27 +03:00

210 lines
9.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🤖 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](<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