Выполнение скриптов по событию журнала

Настроив syslog-ng, а также трансляцию syslog на стороне MITIGATOR, можно выполнять произвольные скрипты: скрипты блокировки, переключения защиты, переключение маршрутов BGP и так далее. Формат записи syslog.

Настройка syslog-ng

Конфигурация записывается в /etc/syslog-ng/conf.d/mitigator.conf.

Параметры приема сообщений (протокол, порт) должны соответствовать настройкам в web-интерфейсе MITIGATOR. Опция expect-hostname необходима, так как имя хоста указывается в сообщениях.

source s_udp {
    syslog(transport("udp") flags(expect-hostname));
};

Все сообщения MITIGATOR имеют одинаковое имя программы, по которому можно их отфильтровать:

filter f_mitigator {
    program("BIFIT_Mitigator");
};

Описание события представлено в формате JSON. Чтобы упростить скрипт, можно разбирать сообщения и выбирать только нужные средствами syslog-ng. В примере выбираются события превышения порогов на входящий трафик в любую политику, в интерфейсе предикат Policy.InputPps. Описание формата сообщений (типы событий и их свойства) можно получить от технической поддержки.

parser p_json {
    json-parser(prefix(".json."));
};

filter f_autodetect {
    "${.json.type_id}" eq "autodetect_alert_up" and "${.json.custom.autodetect_alert_flow}" eq "input.total.pps";
};

Наконец, настраивается вызов скрипта для выбранных событий (скрипт нужно создать и сделать исполняемым):

destination d_prog {
    program("/srv/mitigator/script.sh");
};

log {
    source(s_udp);
    filter(f_mitigator);
    parser(p_json);
    filter(f_autodetect);
    destination(d_prog);
};

Для применения конфигурации:

systemctl reload syslog-ng

Обработка сообщений скриптом

Скрипт получает на стандартный ввод тексты сообщений, то есть JSON, по одному сообщению на строку.

Информация

Рекомендуется, чтобы скрипт читал строки в бесконечном цикле и не делал долгих операций. Однако syslog-ng может и перезапускать скрипт на каждое сообщение, это удобно при отладке скрипта.

Если воспользоваться тем, что syslog-ng уже разбирает JSON, можно сразу передавать скрипту нужные поля, например:

destination d_prog {
    program(
        "/srv/mitigator/script.sh"
        template(
            "${HOST} ${.json.type_id} ${.json.custom.autodetect_alert_flow}\n"
        ));
};

В этом случае скрипт может читать их так:

#!/usr/bin/env sh
read host event metric
echo "Host:   $host"
echo "Event:  $event"
echo "Metric: $metric"

Большей гибкости ценой более сложного скрипта можно достичь, если убрать разбор JSON и фильтрацию средствами syslog-ng, а разбирать JSON и выбирать сообщения в скрипте.