AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 550356
Accepted
Gabriel Talavera
Gabriel Talavera
Asked: 2013-11-03 19:21:35 +0800 CST2013-11-03 19:21:35 +0800 CST 2013-11-03 19:21:35 +0800 CST

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

  • 772

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

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

cat /var/log/httpd/-access_log | grep“警报(document.cookie);” | awk '{打印 $1}' | 独特的

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

提前感谢您的任何意见!

apache-2.2
  • 2 2 个回答
  • 3962 Views

2 个回答

  • Voted
  1. Best Answer
    Michael Hampton
    2013-11-03T19:25:18+08:002013-11-03T19:25:18+08:00

    您会很高兴知道您不必编写程序。fail2ban已经这样做了。

    • 5
  2. unc0nnected
    2015-03-31T02:26:11+08:002015-03-31T02:26:11+08:00

    我所做的事情,主要是因为我对更优雅的解决方案一无所知,就是每 4 小时手动检查一次我的 Nginx 日志,并且每 2 分钟检查一次邮件服务器日志,以检查单个 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 是只是出于正当理由经常访问您的服务器。通过在|之后添加 grep 管道,我的白名单只是内置到此脚本中。grep ']' | 看起来像这样的“grep -v 127.0 |” .
    您需要花时间教您的服务器哪些高流量 IP 是合法的,哪些不是。对我来说,这意味着我必须在第一周左右每隔几个小时手动检查一次日志,在 iplocation.net 上查找高流量 ip,然后添加像 amazon、box.com 甚至我的家/办公室这样的合法 IP此白名单的 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 的 ip 计数,比如过去 75 分钟,我会运行:

    $ sudo script.sh mail.log 75
    

    我再次知道这很粗糙,并且可能有一个很好的干净有效的协议来完成所有这些,但我不知道它,这件事已经持续了一两年,并且阻止了坏人。我会非常认真地推荐的一件事是你有一个代理或另一台服务器,你可以用来访问你的主服务器。原因是,如果你有一天突然做 Web 开发,而你在 5 小时内 ping 自己 2000 次以进行一些测试,除了代理之外,您可能会被阻止而无法返回。

    您可以看到,在checkBadIPs.sh我放置了 grep -v 127.0 并且在我的实际文件中,我对自己的 IP 和其他受信任的 IP 范围有大量忽略规则,但有时您的 IP 更改,您忘记更新然后被锁定出你自己的服务器。

    无论如何,希望有帮助。

    • 1

相关问题

  • Apache Django Mod_Wsgi - 自动重新加载应用程序

  • Apache:对多个虚拟主机使用相同的目录指令

  • Apache 上的子域不工作 - 找不到服务器

  • PHP 作为 CGI 还是 Apache 模块?

  • 避免将某些丢失的文件记录到 Apache2 错误日志中

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve