update readme
This commit is contained in:
203
README.md
203
README.md
@@ -1,72 +1,211 @@
|
|||||||

|
# 🤖 Telegram SSH Notifier
|
||||||
|
|
||||||

|
[](https://git.grenu4.ru/y0zhyck/notification_ssh)
|
||||||
|
[](LICENSE)
|
||||||
|
[](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
|
sudo nano /etc/telegram-ssh-notify.conf
|
||||||
|
|
||||||
|
Пример минимальной конфигурации:
|
||||||
|
|
||||||
|
# Telegram Bot Token (получить у @BotFather)
|
||||||
TELEGRAM_TOKEN=
|
TELEGRAM_TOKEN=
|
||||||
|
|
||||||
|
# ID чата или группы (можно узнать у @userinfobot)
|
||||||
TELEGRAM_CHAT_ID=
|
TELEGRAM_CHAT_ID=
|
||||||
|
|
||||||
|
# Опционально: ID темы в группе (если используется супергруппа с темами)
|
||||||
TELEGRAM_TOPIC_ID=
|
TELEGRAM_TOPIC_ID=
|
||||||
|
|
||||||
|
# Количество неудачных попыток за CRITICAL_TIME_WINDOW для критического оповещения
|
||||||
MAX_ATTEMPTS_BEFORE_CRITICAL=20
|
MAX_ATTEMPTS_BEFORE_CRITICAL=20
|
||||||
CRITICAL_TIME_WINDOW=300
|
CRITICAL_TIME_WINDOW=300 # секунд (5 минут)
|
||||||
|
|
||||||
|
# Автоматически блокировать IP при критической атаке (требуется настройка BLOCK_COMMAND)
|
||||||
AUTO_BLOCK_CRITICAL=false
|
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"
|
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
|
sudo nano /etc/systemd/system/telegram-ssh-notify.service
|
||||||
|
|
||||||
Вставьте следующее содержимое (подставьте правильный путь к вашему скрипту, если он называется иначе, например, telegram-ssh-notify.sh):
|
|
||||||
|
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=SSH Login Monitor for Telegram Notifications
|
Description=Telegram SSH Notifier Monitor
|
||||||
After=network.target
|
After=network.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
ExecStart=/usr/local/bin/ваш_скрипт.sh monitor
|
ExecStart=/usr/local/bin/telegram-ssh-notify.sh monitor
|
||||||
Restart=always
|
Restart=always
|
||||||
User=root
|
User=root
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
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 daemon-reload
|
||||||
sudo systemctl enable ssh-check.service # автозапуск при загрузке
|
sudo systemctl enable --now telegram-ssh-notify
|
||||||
sudo systemctl start ssh-check.service
|
|
||||||
|
|
||||||
Проверьте статус:
|
Проверьте статус:
|
||||||
|
|
||||||
bash
|
sudo systemctl status telegram-ssh-notify
|
||||||
sudo systemctl status ssh-check.service
|
|
||||||
|
|
||||||
Теперь ваш монитор будет работать как демон.
|
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 и отправляет уведомления об успешных входах и выходах.
|
||||||
|
|
||||||
|
Примеры уведомлений
|
||||||
|
Успешный вход:
|
||||||
|
|
||||||
|

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

|
||||||
|
|
||||||
|
Критическая атака:
|
||||||
|
|
||||||
|
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
|
||||||
BIN
img/image copy 2.png
Normal file
BIN
img/image copy 2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 20 KiB |
BIN
sshlogin.png
BIN
sshlogin.png
Binary file not shown.
|
Before Width: | Height: | Size: 18 KiB |
Reference in New Issue
Block a user