web-dev-qa-db-ja.com

snortアラートでシェルスクリプトを実行するにはどうすればよいですか?

CiscoスイッチのSPANポートを聞いています。特定のsnortアラート用にWebサーバーにiptablesDROPルールを追加できるようにしたいのですが、その方法を正確に見つけるのに苦労しています。 cronを介してスクリプトを起動し、定期的にsnortログをトロールするのではなく、リアルタイムでブロックを実行したいと思います。

シェルスクリプトを実行するためにsyslog-ngを使用するSeclistsで example を見つけましたが、syslog-を再起動すると構文が非推奨になるというエラーが発生するため、古いバージョンのsyslog-ngである必要があります- ng。

私はsyslog-ngフィルターについてあまりよく知らないので、有望に見えるのでそれについてさらに調査するつもりですが、それを行うより良い方法がある場合に備えて、ここで質問をするつもりでした。 snortボックスのSPANポートを介してsnortアラートが発生したときにシェルスクリプトを実行する良い方法は何ですか?

5
Server Fault

何かを機能させるのに十分なドキュメントをまとめました。このソリューションでは、snortにsyslogにログを記録するように指示してから、syslog-ngを設定して、指定されたシェルスクリプトを実行するためにsnortsyslogトラフィックをトリガーします。ディスクへのsnortスプーリング、またはスクリプトの実行は、トラフィックの負荷が高い場合には理想的ではないため、お勧めします。負荷を抑えるために特定のトラフィックに対してのみアラートを出すようにsnortを構成する場合は、問題ないはずです。 syslog-ngのセットアップとデバッグは非常に難しいので、それを機能させるために必要なビットを含めました。それらをsyslog-ng.confの最後に追加するだけです。それが他の誰かを助けることを願っています。注意として、syslogは何らかの理由で各メッセージの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
3
Server Fault