Bash + Telegram: мониторинг сервера и мгновенные уведомления

Данная статья написана для людей, имеющих базовые знания по работе с Linux. В этой статье будет рассказано о том, как написать bash-скрипт для отправки мгновенных уведомлений об активности на сервере в Telegram. Я постараюсь объяснить данную тему доступным языком и предоставить практические примеры, чтобы вы могли легко применить полученные знания на практике. Telegram глубоко проник в нашу жизнь. Это уже не просто мессенджер, а огромная экосистема, с различными каналами, приложениями, магазинами и играми. Мы храним в нем заметки, совершаем покупки, общаемся с друзьями и коллегами. Так почему бы не использовать его как рабочий инструмент, для отслеживания активности на нашем сервере? С чего все началось. У меня есть VPS, где я тестирую и разворачиваю свои pet-проекты. Для защиты своего сервера установил стандартную программу fail2ban и как же я был неприятно удивлен, посмотрев логи, что каждый день, делается до 500 попыток подключиться ко мне по ssh. Читатель может сказать, добавь ключи, отключи доступ по ssh и проблема решена. Однако, это не всегда удобно, да и данной статьи бы не было, если бы я все это сделал. И для мониторинга такой активности было решено написать небольшой скрипт, который будет посылать уведомления со статистикой о неудачных и удачных попытках входа. Что нам потребуется: Установить fail2ban Установить curl Создать telegram бота, получить его токен и chat_id (это идентификатор чата, куда нам будут приходить сообщения) Для начала установим fail2ban и curl sudo apt update sudo apt install fail2ban curl Рис. 1 Команды для установки fail2ban и curl Хочу отметить, что после установки Fail2ban не настроен по умолчанию для активной защиты. Однако, он уже включает в себя некоторые предустановленные конфигурации и фильтры, которые можно использовать. Если вы хотите подробнее узнать о его работе, то обратитесь к официальном сайте. Создадим пустой файл в каталоге touch ~/usr/local/bin/telegram_notification.sh Рис. 2 Команда для создания пустого файла Приступим к написанию самого скрипта #!/bin/bash # Замените на ваш токен и chat_id TOKEN="123456789:ABCDEFGHIJKLMN_OPQRSTUVWXYZ123456" CHAT_ID="987654321" # Функция для отправки сообщения в Telegram send_telegram_message() {    local message="$1"    curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \        -d "chat_id=$CHAT_ID" \        -d "text=$message" \        -d "parse_mode=HTML" } # Переменная для отслеживания времени последнего уведомления о неудачных попытках и блокировках last_failed_time=0 # Время (1 день) через которое следует посылать уведомления о неудачных попытках входа track_time_range=86400 # Функция для проверки и отправки уведомлений о неудачных попытках и блокировках check_failed_attempts() {    current_time=$(date +%s)    # Проверка, прошло ли больше суток с последнего уведомления    if (( current_time - last_failed_time >= track_time_range )); then        # Получаем информацию о неудачных попытках и блокировках за последние сутки        failed_attempts=$(grep "Failed password" /var/log/auth.log | wc -l)        bans=$(grep "Ban" /var/log/fail2ban.log | wc -l)        # Формируем сообщение        message=" Статистика за последние сутки:\n"        message+=" Неудачных попыток входа: $failed_attempts\n"        message+=" Заблокированных IP: $bans"        # Отправляем сообщение        send_telegram_message "$message"        last_failed_time=$current_time    fi } # Отслеживание логов аутентификации и Fail2Ban tail -F /var/log/auth.log /var/log/fail2ban.log | while read line; do    # Проверка на успешные попытки входа    if echo "$line" | grep "Accepted password" &> /dev/null; then        send_telegram_message "✅ Успешный вход: $line"    fi    # Проверка на неудачные попытки входа    if echo "$line" | grep "Failed password" &> /dev/null; then        check_failed_attempts    fi    # Проверка на заблокированные IP-адреса    if echo "$line" | grep "Ban" &> /dev/null; then        check_failed_attempts    fi done Рис. 3 Скрипт, отвечающий за отправку статистики с уведомлениями Данный скрипт, достаточно понятен. Стоит только заострить свое внимание на нескольких моментах, а именно на tail -F /var/log/auth.log /var/log/fail2ban.log | while read line; Рис. 4 Команда tail отвечающая за отображения последних строк текстового файла Команда tail -F отслеживает все изменения в log файлах и через pipe (|) передает их в цикл while, где изменения записываются в переменную line. В дальнейшем, цикл пробегается по условиям и формирует статистику неудачных попыток входа, а в случае удачной попытки, сообщение об этом немедленно отправляется в телеграмм. Теперь осталось запустить данный скрипт. Для простоты, воспользуемся командой nohup. Эта команда позволяет запускать процессы, игнорируя сигнал HUP (hangup). Это полезно, когда вы хотите, чтобы процесс продолжал работать даже после выхода из системы или закрытия терминала. Однако, лучшей а

Apr 15, 2025 - 11:37
 0
Bash + Telegram: мониторинг сервера и мгновенные уведомления

Данная статья написана для людей, имеющих базовые знания по работе с Linux. В этой статье будет рассказано о том, как написать bash-скрипт для отправки мгновенных уведомлений об активности на сервере в Telegram. Я постараюсь объяснить данную тему доступным языком и предоставить практические примеры, чтобы вы могли легко применить полученные знания на практике.

Telegram глубоко проник в нашу жизнь. Это уже не просто мессенджер, а огромная экосистема, с различными каналами, приложениями, магазинами и играми. Мы храним в нем заметки, совершаем покупки, общаемся с друзьями и коллегами. Так почему бы не использовать его как рабочий инструмент, для отслеживания активности на нашем сервере?

С чего все началось. У меня есть VPS, где я тестирую и разворачиваю свои pet-проекты. Для защиты своего сервера установил стандартную программу fail2ban и как же я был неприятно удивлен, посмотрев логи, что каждый день, делается до 500 попыток подключиться ко мне по ssh. Читатель может сказать, добавь ключи, отключи доступ по ssh и проблема решена. Однако, это не всегда удобно, да и данной статьи бы не было, если бы я все это сделал.
И для мониторинга такой активности было решено написать небольшой скрипт, который будет посылать уведомления со статистикой о неудачных и удачных попытках входа.

Что нам потребуется:

  1. Установить fail2ban
  2. Установить curl
  3. Создать telegram бота, получить его токен и chat_id (это идентификатор чата, куда нам будут приходить сообщения)
  • Для начала установим fail2ban и curl
sudo apt update
sudo apt install fail2ban curl

Рис. 1 Команды для установки fail2ban и curl

Хочу отметить, что после установки Fail2ban не настроен по умолчанию для активной защиты. Однако, он уже включает в себя некоторые предустановленные конфигурации и фильтры, которые можно использовать. Если вы хотите подробнее узнать о его работе, то обратитесь к официальном сайте.

  • Создадим пустой файл в каталоге
touch ~/usr/local/bin/telegram_notification.sh

Рис. 2 Команда для создания пустого файла

  • Приступим к написанию самого скрипта
#!/bin/bash 

# Замените на ваш токен и chat_id 
TOKEN="123456789:ABCDEFGHIJKLMN_OPQRSTUVWXYZ123456"
CHAT_ID="987654321"

# Функция для отправки сообщения в Telegram 
send_telegram_message() { 
   local message="$1" 
   curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \ 
       -d "chat_id=$CHAT_ID" \ 
       -d "text=$message" \ 
       -d "parse_mode=HTML" 
} 

# Переменная для отслеживания времени последнего уведомления о неудачных попытках и блокировках 
last_failed_time=0 
# Время (1 день) через которое следует посылать уведомления о неудачных попытках входа
track_time_range=86400

# Функция для проверки и отправки уведомлений о неудачных попытках и блокировках 
check_failed_attempts() { 
   current_time=$(date +%s) 
   # Проверка, прошло ли больше суток с последнего уведомления 
   if (( current_time - last_failed_time >= track_time_range )); then 
       # Получаем информацию о неудачных попытках и блокировках за последние сутки 
       failed_attempts=$(grep "Failed password" /var/log/auth.log | wc -l) 
       bans=$(grep "Ban" /var/log/fail2ban.log | wc -l) 

       # Формируем сообщение 
       message=" Статистика за последние сутки:\n" 
       message+=" Неудачных попыток входа: $failed_attempts\n" 
       message+=" Заблокированных IP: $bans" 

       # Отправляем сообщение 
       send_telegram_message "$message" 
       last_failed_time=$current_time 
   fi 
} 

# Отслеживание логов аутентификации и Fail2Ban 
tail -F /var/log/auth.log /var/log/fail2ban.log | while read line; do 
   # Проверка на успешные попытки входа 
   if echo "$line" | grep "Accepted password" &> /dev/null; then 
       send_telegram_message "✅ Успешный вход: $line" 
   fi 

   # Проверка на неудачные попытки входа 
   if echo "$line" | grep "Failed password" &> /dev/null; then 
       check_failed_attempts 
   fi 

   # Проверка на заблокированные IP-адреса 
   if echo "$line" | grep "Ban" &> /dev/null; then 
       check_failed_attempts 
   fi 
done

Рис. 3 Скрипт, отвечающий за отправку статистики с уведомлениями

Данный скрипт, достаточно понятен. Стоит только заострить свое внимание на нескольких моментах, а именно на

tail -F /var/log/auth.log /var/log/fail2ban.log | while read line;

Рис. 4 Команда tail отвечающая за отображения последних строк текстового файла

Команда tail -F отслеживает все изменения в log файлах и через pipe (|) передает их в цикл while, где изменения записываются в переменную line. В дальнейшем, цикл пробегается по условиям и формирует статистику неудачных попыток входа, а в случае удачной попытки, сообщение об этом немедленно отправляется в телеграмм.

Теперь осталось запустить данный скрипт. Для простоты, воспользуемся командой nohup. Эта команда позволяет запускать процессы, игнорируя сигнал HUP (hangup). Это полезно, когда вы хотите, чтобы процесс продолжал работать даже после выхода из системы или закрытия терминала. Однако, лучшей альтернативой будет использование systemd или supervisor, но эта статья не об этом.

Чтобы запустить команду с использованием nohup, просто добавьте nohup перед командой. Например:

nohup telegram_notification.sh &

Рис. 5 Команда nohup

Теперь проверим, работает ли наш скрипт

ps aux |  telegram_notification*

Рис. 6 Отображения информации о запущенном процессе

В окне терминала, должен отобразиться запущенный процесс и его PID. Поздравляю, теперь вы будете получать уведомления о удачных и неудачных попытках входа по ssh на ваше сервер.

Заключение:

В заключение хочу отметить, что существуют и другие варианты подключения уведомлений. Например это можно сделать через jail и action в самом fail2ban c уже готовыми шаблонами (mail, telegram, slack и др.). Однако я предпочитаю использовать скрипты — это обеспечивает независимость от инструмента и позволяет реализовать любую логику: от мониторинга SSH-подключений до контроля системных служб, сетевого трафика и изменений в критически важных файлах.

Если вам понравилась эта статья, то вы знаете что нужно делать — подписывайтесь, ставьте лайки и делайте репосты. Это лучшая поддержка для автора. С вами был Дубовицкий Юрий, автор канала «Ваш код еще не готов, сэр».
А наш код уже готов. До связи!