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

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

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

我的第一个想法是编写一个脚本,不断检查 Apache 日志中所有以该探测开头的 IP 地址,并将这些地址发送到 iptables 丢弃规则。如下所示:

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

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

提前感谢您的任何意见!

答案1

您会很高兴地知道您不必编写程序;失败2ban已经这样做了。

答案2

我做的一件事,主要是因为我不知道有更优雅的解决方案,就是每 4 小时手动检查一次我的 Nginx 日志,每 2 分钟检查一次邮件服务器日志,以检查单个 IP 的过度访问。我一起运行了几个脚本:

  1. 检查access.log并列出前 10 个 IP,按它们对服务器的点击次数排序
  2. 将结果转储到日志文件中
  3. 让另一个脚本查看该日志文件,并禁止过去 X 小时内访问服务器次数超过 X 次的任何 IP
  4. 保存我的iptables.save

它看起来是这样的:

自动禁止IP地址
#!/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
检查BadIPs_mail.sh

这里需要注意的一件非常重要的事情是,你需要设置一个白名单,否则你将开始阻止大量来自服务器的真实 IP,这些服务器会向你发送大量电子邮件,或者在其他日志的情况下,会阻止那些出于正当原因频繁访问你服务器的 IP。我的白名单是通过在脚本后面添加 grep 管道构建的| grep ']'| 看起来像这样“grep -v 127.0 |”
您需要花时间告诉您的服务器哪些高流量 IP 是合法的,哪些不是。对我来说,这意味着我必须花大约一周的时间每隔几个小时手动检查我的日志,在 iplocation.net 上查找高流量 IP,然后将合法 IP(如 amazon、box.com 或甚至我的家庭/办公室 IP 范围)添加到此白名单中。如果您不这样做,您可能会被阻止访问自己的服务器,或者您将开始阻止合法的邮件/网络服务器并导致电子邮件或流量中断。

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
阻止IP
#!/bin/bash
sudo iptables -I INPUT -s $1 -j DROP
sudo bash -c "iptables-save > /etc/network/iptables.save"

我每 2 分钟检查一次一些日志,主要是我的 ssh 身份验证日志和邮件日志,因为它们正在受到重击 :(。

我为每个日志文件设置了特定的脚本,尽管当我想要检查日志时,使用我自己使用的手动脚本很容易做到这一点。如下所示:

#!/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 个输入,即要扫描的日志文件以及要扫描的过去时间。

因此,如果我想检查 mail.log 中过去 75 分钟的 IP 计数,我会运行:

$ sudo script.sh mail.log 75

再次,我知道这太粗糙了,可能存在一种干净高效的协议可以完成所有这些工作,但我不知道,而且这个东西已经运行了一两年,并且阻止了坏人。我非常认真地推荐的一件事是,您有一个代理或另一个可用于访问主服务器的服务器。原因是,如果您有一天突然进行 Web 开发,并且在 5 小时内对自己进行了 2000 次 ping 以进行一些测试,您可能会被阻止,除了代理之外没有其他方法可以重新访问。

您可以看到,checkBadIPs.sh我输入了 grep -v 127.0,并且在我的实际文件中,我有大量针对我自己的 IP 和其他受信任的 IP 范围的忽略规则,但有时您的 IP 会发生变化,您忘记更新,然后您就被锁定在自己的服务器之外。

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

相关内容