从Apache日志中检索恶意IP地址并使用iptables阻止它们

我试图阻止一些攻击者试图从我的网站利用XSS漏洞,我发现大多数恶意尝试都是从经典的“alert(document.cookie);”testing开始的。 该网站不容易受到XSS的影响,但是我想在发现真正的漏洞之前先阻止违规的IP地址,同时保持日志清洁。

我的第一个想法是有一个脚本不断检查在Apachelogging所有的IP地址,以探针开始,并发送这些地址到一个iptables的下降规则。 有了这样的事情:

cat / var / log / httpd / -access_log | grep“alert(document.cookie);” | awk'{print $ 1}'| uniq的

为什么将这个命令的输出发送到iptables是一种有效的方法?

预先感谢您的任何意见!

你会很高兴知道你不必写一个程序, fail2ban已经做到了这一点。

我所做的一些事情,主要是因为我对一个更优雅的解决scheme的无知,是每4个小时手工检查我的Nginx日志,而邮件服务器每2分钟logging一次个别IP的过度访问。 我一起运行几个脚本:

  1. 检查access.log并列出排名前10位的IP,按他们对服务器的命中次数排列
  2. 将结果转储到日志文件中
  3. 让另一个脚本查看该日志文件,并禁止在过去的X小时内超过X次的IP地址
  4. 保存我的iptables.save

以下是它的样子:

autoBanIPs_mail.sh

 #!/bin/bash # This script checks the last 2 minutes of log entries to see if any # IP has made over 99 connections now=$(date +"%m_%d_%Y") /root/bin/checkBadIPs_mail.sh > /home/ipChecker/ipcheckMAIL_$now.txt cat /home/ipChecker/ipcheckMAIL_$now.txt | \ grep " \\(\\([9][9]\\)\\|\\([0-9][0-9][0-9]\\+\\)\\) " | \ awk '{print $2}' > /home/ipChecker/badMailIPs_$now.sh sed -i "s/^/\/usr\/local\/sbin\/blockIP /g" /home/ipChecker/badMailIPs_$now.sh /bin/bash /home/ipChecker/badMailIPs_$now.sh cat /home/ipChecker/ipcheckMAIL_$now.txt >> /home/ipChecker/ipcheckMAIL_$now.log rm /home/ipChecker/ipcheckMAIL_$now.txt rm /home/ipChecker/badMailIPs_$now.sh 

checkBadIPs_mail.sh

有一点非常重要,这里需要注意的一点是,你需要设置一个白名单,或者你将开始阻止来自服务器的许多真正的IP地址,这些服务器只收到大量的电子邮件,或者在其他日志,IP的情况下只是因为合法的原因才打你的服务器。 我的白名单只是通过在|之后添加greppipe道而构build到此脚本中 grep']' | 那看起来像这样“grep -v 127.0 |”
您需要花时间教您的服务器哪些高stream量IP是合法的,哪些不是。 对我来说,这意味着我不得不花费第一个星期左右手动检查我的日志,每隔几个小时,在iplocation.net上查找高stream量的IP,然后添加合法的像亚马逊,box.com甚至我的家庭/办公室IP范围到这个白名单。 如果你不这样做,你可能会被阻止从你自己的服务器,或者你将开始阻止合法的邮件/ Web服务器,并导致电子邮件或通信中断。

 cat /var/log/mail.log | awk \ -v d1="$(date --date="-2 min" "+%b %_d %H:%M")" \ -v d2="$(date "+%b %_d %H:%M")" \ '$0 > d1 && $0 < d2 || $0 ~ d2' | \ grep '\[' | grep '\]' | \ grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -v 127.0 | \ awk '{print $1}' | sort | uniq -c | sort -n | tail -10 

Blockip的

 #!/bin/bash sudo iptables -I INPUT -s $1 -j DROP sudo bash -c "iptables-save > /etc/network/iptables.save" 

我有一些日志检查每2分钟,主要是我的SSH身份validation日志和邮件日志,因为他们正在捣毁:(。

我为每个日志文件设置了特定的脚本,尽pipe从我想在检查日志时使用自己的手动脚本中可以很容易find。 看起来像这样:

 #!/bin/bash log=$1 time=$2 cat /var/log/${log} | awk \ -v d1="$(date --date="-${time} min" "+%b %_d %H:%M")" \ -v d2="$(date "+%b %_d %H:%M")" \ '$0 > d1 && $0 < d2 || $0 ~ d2' | \ grep '\[' | grep '\]' | \ grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | \ sort | uniq -c | sort -n | tail -10 

运行时需要2个input,要扫描的日志文件以及要扫描的过去的时间。

所以,如果我想检查mail.log的IP计数说过去75分钟,我会运行:

 $ sudo script.sh mail.log 75 

我又一次知道这是粗俗的,可能是一个很好的清洁高效的协议,但是我不知道这件事情,现在这个事情已经持续了一两年了,把坏人扼杀了。 我非常认真地推荐的一件事是,你有一个代理服务器或另一台服务器,你可以用它来访问你的主服务器。原因是,如果你有一天在做Web开发,在5个小时内对自己进行2000次testing,以便进行一些testing,除了代理服务器之外,您可以无阻地进行阻止。

你可以在checkBadIPs.sh看到我已经把grep -v 127.0和在我的实际文件中,我有很多我自己的IP和其他可信的IP范围的忽略规则,但有时你的IP更改,你忘记更新,然后你被locking在你自己的服务器之外。

无论如何,希望有所帮助。