Linux

如何在 snort 警報上執行 shell 腳本?

  • December 12, 2014

我有 snort 監聽思科交換機的 SPAN 埠。我希望能夠在我的網路伺服器上為特定的 snort 警報添加一個 iptables DROP 規則,但很難找出確切的方法。我希望阻塞是實時發生的,而不是通過 cron 啟動腳本來定期搜尋 snort 日誌。

我在 Seclists 上找到了一個範例,它使用 syslog-ng 來執行 shell 腳本,但它必須適用於舊版本的 syslog-ng,因為當我重新啟動 syslog-ng 時,我收到一個關於不推薦使用的語法的錯誤。

我對 syslog-ng 過濾器了解不多,因此將對其進行更多研究,因為它看起來很有希望,但我想我會在這裡提出問題,以防有更好的方法。當我的 snort 盒的 SPAN 埠發出 snort 警報時,執行 shell 腳本的好方法是什麼?

我已經拼湊了足夠多的文件以使某些工作正常進行。該解決方案包括告訴 snort 記錄到 syslog,然後設置 syslog-ng 以觸發 snort syslog 流量以執行給定的 shellscript。將 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

引用自:https://serverfault.com/questions/651888