Go to file
2024-06-14 16:33:02 +03:00
alarmaction-v1.go Восстановление репозитория 2024-06-14 16:33:02 +03:00
alarmaction.cron Восстановление репозитория 2024-06-14 16:33:02 +03:00
alarmaction.go Восстановление репозитория 2024-06-14 16:33:02 +03:00
database.sql.j2 Восстановление репозитория 2024-06-14 16:33:02 +03:00
docker-compose.yml Восстановление репозитория 2024-06-14 16:33:02 +03:00
Dockerfile Восстановление репозитория 2024-06-14 16:33:02 +03:00
entrypoint.sh Восстановление репозитория 2024-06-14 16:33:02 +03:00
go.mod Восстановление репозитория 2024-06-14 16:33:02 +03:00
go.sum Восстановление репозитория 2024-06-14 16:33:02 +03:00
README.md Восстановление репозитория 2024-06-14 16:33:02 +03:00
zimbra-alarm.go Восстановление репозитория 2024-06-14 16:33:02 +03:00

Описание

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

Для работы требуется ElasticSearch, PostgreSQL, докер (опционально).

zimbra-alarm

Программа zimbra-alarm получает из elasticsearch, список пользовательских сессий за заданный промежуток времени (4 минуты). Для определения из каких индексов производить выборку данных, первоначально загружается список всех индексов из эластика (без временной метки), далее выбираются имена индексов соответствующие заданным шаблонам (префиксам), по умолчанию это maillog-mailbox. И для каждого типа индексов (например maillog_mailbox1_filebeat*, maillog_mailbox2_filebeat* и т.п.) запускается параллельный процесс поиска и выгрузки данных. Данные обрабатываются и складываются в таблицу 'mail_sessions' СУБД Postgresql, для каждого почтового аккаунта соединения с одного ip адреса суммируются в одну запись с зафиксированной меткой времени. Почтовые аккаунты сохраняются в таблице mail_accounts.

После этого запускается процесс анализа данных о сессиях и генерации сообщений о "тревогах" (таблица 'alarm'):

  1. Если количество сессий с одного адреса в один аккаунт превышает заданное число (50), будет создано сообщение об аномалии с типом "2" ("Количество сессий больше заданного")
  2. Если код geoip ip-адреса не равен "RU" - будет создана запись c ip-адресом и типом "1" ("Неразрешенный код страны")
  3. Если зафиксированы соединения в один почтовый аккаунт с разных адресов, то будет сгенерировано сообщение с типом "3" ("Вход в аккаунт более чем с одного IP")
  4. Если с одного ip-адреса, для которого есть запись с типом 1 (неразрешенный код страны), были попытки входа в несколько учетных записей, то будет добавлена запись с типом "4" ("Вход более чем в один аккаунт")

Если для одного почтового аккаунта или одного ip-адреса будет сгенерировано сообщение о тревоги с одним и тмеже типом, то существующая запись о тревоге обновиться с последней меткой времени.

Программу можно запускать как в консоли так и в docker-контейнере.

alarmaction

Программа "alarmaction" предназначена для выполнения действий по "тревогам". На данный момент доступно блокирование ip адресов через "iptables". Устанавливается на целевых узлах (в нашем случае MTA сервера mail и mail2). Запуск производится через службу "crond".

При запуске программы, происходит чтение таблицы "alarm" из БД. Выбираются все записи с типом 4 (alarm_type=4) и пустым полем "_action_timestamp, где "" - укороченное имя узла (в нашем случае "mail_action_timestamp" и "mail2_action_timestamp").

Выбранные ip-адреса будут блокированы через iptables на каждом из узлов и после успешного выполнения блокровки в соответствующая запись в таблице будет изменена (добавлена временная метка в нужное поле, см. выше).

Все адреса в iptables заносятся в цепочку "auto_blocked" которая будет создана при первом запуске alarmaction.

Для исключения блокирования определенных адресов или подсетей в таблицу filter необходимо добавить соответствующую запись (адрес и маску):

INSERT INTO filter(remote_ip, description) values('192.168.0.0/16', 'Локальная сеть')

Запуск

zimbra-alarm можно запускать как по времени так и в докер-контейнере. alarmaction - запускается по времени.

Для работы обоих программ нужно установить переменные окружения:

zimbra-alarm:

  • ELASTICSEARCH_URL=https://${ELASTIC_USER}:${ELASTIC_PASSWORD}@${ELASTIC_HOST}:9200 - строка соедения с ElasticSearch
  • PGHOST=dbserver - сервер СУБД (PostgreSQL)
  • PGDATABASE=mail_alarm - имя базы данных
  • PGUSER=mail_alarm - пользователь БД
  • PGPASSWORD={PGPASSWORD} - пароль пользователя
  • REQUEST_TIME_RANGE=4 - время за которое запрашиваются данные в минутах (по умолчанию 4м)
  • REQUEST_ROWS=10000 - количество строк возвращаемое запросом (по умолчанию 10000)

команда запуска:

см. entrypoint.sh

zimbra-alarm --indexname "maillog_mailbox" -timerange "${REQUEST_TIME_RANGE}m" -operation es-request-data -pg-insert -request-rows ${REQUEST_ROWS}

alarmaction:

  • PGHOST=dbserver
  • PGUSER=pguser
  • PGDATABASE=maildb
  • PGPASSWORD=pgpassword
  • ALARM_LOG_FILE=/var/log/alarmaction.log

команда запуска:

см. alarmaction.cron

alarmaction