Проект

Общее

Профиль

Мониторинг и алертинг Tegu с помощью связки fluentbit+signoz

Добавил(а) Макаров Леонид 11 месяца назад

Возникло желание видеть красивые графики, показывающие состояния ящиков, сколько писем отправлено и т.д.

Для сбора логов мы решили использовать fluentbit, для хранения и визуализации опенсорсный Signoz.

На сервер с tegu мы поставили fluentbit и настроили в нем для сбора логов из журнала плагин Systemd.

Конфиг для fluentbit выглядит примерно так:

[INPUT]
    Name systemd
    Tag host.*
    Systemd_Filter _SYSTEMD_UNIT=tegu.service
    Strip_Underscores on
[INPUT]
    Name tail
    Path /opt/mailchecker/log.txt  
[FILTER]
    Name modify
    Match *
    Condition Key_Value_Equals SYSTEMD_UNIT tegu.service
    Remove TRANSPORT
    Remove SYSTEMD_SLICE
    Remove BOOT_ID
    Remove EXE
    Remove SYSTEMD_CGROUP
    Remove MACHINE_ID
    Remove SYSTEMD_INVOCATION_ID
[OUTPUT]
    Name forward
    Match *
    Host <host>
    Port 24224

Но кроме логов самого Tegu, мы еще хотели получать информацию о состоянии ящиков (сколько в ящике писем, сколько занимает INBOX).

Для этого написали простой скрипт, который запускается с параметрами, проверяет ящик и в текстовый лог пишет информацию о ящике.

Строка запуска скрипта

mailchecker.sh user@testdomain.com password mail.testdomain.com:993

Скрипт

#!/bin/bash

if [ -z "$3" ]; then
  echo "we need some args" 
  exit 1
fi

user=$1
password=$2
server=$3

start_idle () {
  echo ". login \"$user\" \"$password\"" 
  message_count=$(echo ". STATUS INBOX (MESSAGES)")
  mailbox_size=$(echo ". STATUS INBOX (SIZE)")

  echo "$message_count" 
  echo "$mailbox_size" 

  echo ". LOGOUT" 
}

mapfile -t output < <( openssl s_client -crlf -quiet -connect "$server" 2>/dev/null < <(start_idle) )

message_count_raw=$(echo "${output[3]}")
mailbox_size_raw=$(echo "${output[5]}")

if [[ $message_count_raw == *"STATUS INBOX"* ]]; then
  message_count=$(grep -oP '([0-9]+)' <<< $message_count_raw)
fi

if [[ $mailbox_size_raw == *"STATUS INBOX"* ]]; then
  mailbox_size=$(grep -oP '([0-9]+)' <<< $mailbox_size_raw)
fi

echo "{\"Script\":\"mailchecker\",\"mailbox\":\"$user\",\"messages\": $message_count,\"size\": $mailbox_size}" >> /opt/mailchecker/log.txt

Вывод этого скрипта /opt/mailchecker/log.txt также парсится с помощью fluentbit и отправляется в Signoz

И немножко картинок:

[dash01]

На дашборде "Попытки входа" мы собираем из логов количество неудачных попыток входа за определенное время, и при превышении порогового значения отправляем из Signoz'а вебхук в систему мониторинга и в мессенджер с уведомлением, что это брутфорс такого-то ящика.

На нижнем дашборде у нас рисуется график с количеством отправленных пиисем для определенного ящика, и если за определенное время количество отправленных писем превышает 1000, то опять же, отправляем вебхук в нужные нам места.

[dash02]

На этом дашборде мы суммируем размер всех INBOX и рисуем красивый график. Алерты добавить по вкусу.

[dash03]

Здесь уже мы уже видим размеры нескольких ящиков.

[dash04]

Тут показан график по количеству сообщений в ящиках.


Ответы (2)

RE: Мониторинг и алертинг Tegu с помощью связки fluentbit+signoz - Добавил(а) Кальметов Игорь 11 месяца назад

Прекрасная статья.
Нам бы хотелось знать какие из графиков (какая именно информация) окажется для вас полезной.
Мы бы использовали ее при создании модуля статистики "из коробки".

RE: Мониторинг и алертинг Tegu с помощью связки fluentbit+signoz - Добавил(а) Макаров Леонид 11 месяца назад

Добрый день, Игорь!

Общая информация по серверу:
- сколько занимают места все ящики (возможно в динамике за день, неделю, месяц)
- сколько всего писем
- топ 10 ящиков по объему/письмам
- топ ящиков по получению/отправке

По отдельным ящикам:
- сколько писем в ящике
- объем ящика
- активность, сколько получено/отправлено за день, неделю,

По забанненым адресам:
- с каким логином с какого ip пытались неуспешно войти

Рассмотрите возможность отдавать логи на внешние сервера как syslog для интеграции с решениями siem или log management.

    (1-2/2)