Выполнение скриптов по событию журнала
Настроив 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 и выбирать сообщения в скрипте.