DEV Community

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

Posted on

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
Enter fullscreen mode Exit fullscreen mode

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

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

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

Рис. 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
Enter fullscreen mode Exit fullscreen mode

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

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

tail -F /var/log/auth.log /var/log/fail2ban.log | while read line;
Enter fullscreen mode Exit fullscreen mode

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

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

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

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

nohup telegram_notification.sh &
Enter fullscreen mode Exit fullscreen mode

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

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

ps aux |  telegram_notification*
Enter fullscreen mode Exit fullscreen mode

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

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

Заключение:

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

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

Top comments (1)

Collapse
 
_2974322d72d5f53d8c2c profile image
Юрий

Как настроить fail2ban для отслеживания ssh активности:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Enter fullscreen mode Exit fullscreen mode

Отредактируйте этот файл, добавив в него

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log  # Для Debian/Ubuntu
maxretry = 5
bantime = 6000
Enter fullscreen mode Exit fullscreen mode

Перезапустите fail2ban

sudo systemctl restart fail2ban
Enter fullscreen mode Exit fullscreen mode

Запустите заново скрипт

sudo nohup имя_скрипта.sh &
Enter fullscreen mode Exit fullscreen mode

Поздравляю, вы настроили fail2ban