Проект

Общее

Профиль

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

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

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

Для сбора логов мы решили использовать 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 - Добавил(а) Кальметов Игорь 2 месяца назад

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

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

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

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

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

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

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

    (1-2/2)