У меня есть snort, слушая порт SPAN коммутатора cisco. Я хотел бы иметь возможность добавить правило iptables DROP на свой веб-сервер для определенных предупреждений snort, но мне трудно понять, как именно это сделать. Я бы хотел, чтобы блокировка происходила в реальном времени, а не запускала скрипт через cron для периодического просмотра журналов snort.
Я нашел пример в Seclists, который использует syslog-ng для запуска сценария оболочки, но это должно быть для более старой версии syslog-ng, так как я получаю сообщение об устаревшем синтаксисе при перезапуске syslog-ng.
Я мало что знаю о фильтрах syslog-ng, поэтому собираюсь провести дополнительные исследования по этому поводу, поскольку это выглядит многообещающим, но подумал, что поставлю вопрос здесь, если есть лучший способ сделать это. Какой хороший способ запустить сценарий оболочки, когда на порт SPAN моего модуля snort приходит предупреждение snort?
Я собрал достаточно документации, чтобы что-то работало. Решение включает в себя указание snort регистрироваться в системном журнале, а затем настройку syslog-ng для запуска по трафику системного журнала snort для запуска данного сценария оболочки. Буферизация snort на диск или выполнение сценариев не идеальны для высоких нагрузок трафика, поэтому имейте в виду. Если вы сконфигурируете snort для оповещения только об определенном трафике, чтобы снизить нагрузку, все будет в порядке. Настройка и отладка syslog-ng могут быть непростой задачей, поэтому я добавил необходимые биты, чтобы это работало. Просто добавьте их в конец syslog-ng.conf. Надеюсь, это поможет кому-то другому. Отметим, что системный журнал по какой-то причине регистрирует 3 копии каждого сообщения. Понятия не имею почему.
Я использовал здесь некоторую информацию: http://www.mad-hacking.net/documentation/linux/reliability/logging/email-notification.xml
/etc/snort/snort.conf - configure snort to log to syslog
------------------------------------------------------------
# syslog
output alert_syslog: LOG_LOCAL6 LOG_ALERT
/etc/syslog/syslog-ng.conf - setup filters/destinations for alerts
------------------------------------------------------------
# snort filter - this only pays attention to syslog messages sent by the 'snort' program
filter f_snort
{
facility(local6) and match("snort" value ("PROGRAM"));
};
# optionally, this would send the snort message to a remote host running a syslog listener.
# I was running tcpdump to debug the whole setup so I use UDP protocol here so the
# message is just blasted out over the ether without needing to actually have a syslog
# listener setup anywhere
destination d_net
{
udp("10.10.10.1" port(514) log_fifo_size(1000) template(t_snort));
};
# this one sends the syslog message consisting of priority,time_in_seconds,host and syslog meesage.
#
destination d_prog
{
program("/root/bin/snort_script" template("<$PRI>$UNIXTIME $HOST $MSGONLY\n") );
};
# ..or use a pipe if you don't want syslog running scripts
destination d_prog_pipe
{
pipe("/root/bin/syslog-pipe" template("<$PRI>$DATE $HOST $MSGONLY\n") );
};
# finally, log the message out the snort parsing mechanism
log
{
source(s_src);
filter(f_snort);
destination(d_prog);
#destination(d_net);
};
/root/bin/snort_script
------------------------------------------------------------
#!/bin/bash
while read line; do
echo "$line" >> /tmp/snort.log
done