我需要规则来删除一些恶意的 Apache 连接

Jav*_*ero 10 iptables apache2

我丢弃了端口上的所有流量,除了我的 Web 服务器的 80 端口。

我在 iptables 上有一些这样的规则:

iptables -A INPUT -p tcp -m tcp --dport 80 -m string --string "cgi" --algo bm --to 1000 -j DROP
Run Code Online (Sandbox Code Playgroud)

谁有更多可以分享一下?我总是知道坏黑客仍在更新,但其中一些总是以相同的代码开头。我需要根据某些标准断开连接。这是一些 Apache 日志(我删除了 ips,但每个攻击都来自相同):

攻击 1:这个我不知道要做什么,但是从同一个 ip 做 50 次

GET / HTTP/1.1  301 224 -   Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22
GET / HTTP/1.1  302 3387    -   Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22
Run Code Online (Sandbox Code Playgroud)

攻击 2:这尝试仅获取有关服务器的信息。

GET / HTTP/1.1  301 224 http://myip:80/ Go-http-client/1.1
GET / HTTP/1.1  302 3228    http mywebsite  Go-http-client/1.1
GET /es/ HTTP/1.1   200 40947   https mywebsite Go-http-client/1.1
Run Code Online (Sandbox Code Playgroud)

攻击 3:他们尝试访问登录页面漏洞

GET /userlogin/login.aspx HTTP/1.1  302 186 -   -
Run Code Online (Sandbox Code Playgroud)

攻击 4:在第一个请求时尝试访问 cgi,(请参阅我的第一个 iptables 规则以删除它)

GET /hndUnblock.cgi HTTP/1.0    302 186 -   Wget(linux)
GET /tmUnblock.cgi HTTP/1.0 302 186 -   Wget(linux)
Run Code Online (Sandbox Code Playgroud)

我对服务器很陌生,这 4 次攻击仅发生在过去 12 小时内……每周有数千次。

pa4*_*080 19

更新: 当前答案已完全更新。

根据这个讨论,我创建了一个名为WWW Security Assistant的 GitHub 存储库。有一个名为 的分支,ask_ubuntu专门用于此答案。由于字符限制,之前在此处提供的所有参考资料都已删除 - 它们可在 GitHub 上找到。

这里概述了几种方法,涉及到一个完整的机制,如何在 Ubuntu 16.04 中增加 Apache2 安全性

表中的内容:

  • WWW 安全助手脚本 (WSAS) ? iptables
  • iptables – 基本配置 – 保存和恢复
  • Apache2 的 ModEvasive
  • ModEvasive ? WSAS ? iptables
  • Apache2 的 ModSecurity 2.9
  • ModSecurity OWASP 核心规则集 3.x
  • ModSecurity 规则白名单
  • 修改安全规则?WSAS ? iptables
  • ModSecurity 和 Apache 日志文件
  • ModSecurity 日志文件?Fail2Ban ? iptables
  • ModSecurity GuardianLog ? HTTPD 守护者?WSAS ? iptables
  • ModSecurity GuardianLog ? HTTPD 自定义分析 ? WSAS ? iptables

此外,让我们说使用 HTTPS 总是好的:


WWW 安全助手脚本?iptables

这里介绍了脚本www-security-assistant.bash。它可以帮助您处理恶意 IP 地址。该脚本有两种模式。

自动模式

当外部程序(如 Apache 的mod_security)提供恶意$IP地址时。在这种情况下,调用脚本的语法应该是:

www-security-assistant.bash <ip-address> Guardian
www-security-assistant.bash <ip-address> ModSecurity
www-security-assistant.bash <ip-address> ModEvasive
www-security-assistant.bash <ip-address> a2Analyst
Run Code Online (Sandbox Code Playgroud)

在这种模式下,脚本提供两个操作阶段,对于每个操作,它都会管理员发送一封电子邮件

  • 第一阶段:对于前几次“违规”,源$IP将被禁止一段时间,等于 的值$BAN_TIME。此模式使用命令at.

  • 第二阶段:当某个地址的违规次数$IP等于 的值时$LIMIT,该$IP地址将通过 Iptables永久禁止,并添加到$BAN_LIST.

手动模式

此模式接受以下选项:

  • www-security-assistant.bash <ip-address> --DROP "log notes"

    在文件中创建一个条目/var/www-security-assistant/iptables-DROP.list并生成如下规则:

    iptables -A GUARDIAN -s $IP -j DROP
    
    Run Code Online (Sandbox Code Playgroud)
  • www-security-assistant.bash <ip-address> --DROP-CLEAR "log notes"

    在文件中创建一个条目/var/www-security-assistant/iptables-DROP-CLEAR.list,删除某些 Iptables 规则,$IP从历史记录和以下内容中删除$BAN_LIST

    iptables -D GUARDIAN -s $IP -j DROP
    
    Run Code Online (Sandbox Code Playgroud)
  • www-security-assistant.bash <ip-address> --ACCEPT "log notes"

    仅在文件中创建一个条目/var/www-security-assistant/iptables-ACCEPT.list

  • www-security-assistant.bash <ip-address> --ACCEPT-CHAIN "log notes"

    在文件中创建一个条目/var/www-security-assistant/iptables-ACCEPT.list并生成如下规则:

    iptables -A GUARDIAN -s $IP -j ACCEPT
    
    Run Code Online (Sandbox Code Playgroud)

依赖关系

脚本使用iptables-save.shiptableschain GUARDIAN,在下一节中解释。它将在以下位置创建和维护几个文件$WORK_DIR

  • www-security-assistant.history - 包含先前 IP 违规的数据。
  • www-security-assistant.mail - 脚本发送的最后一封电子邮件的内容。
  • iptables-ACCEPT.list; iptables-DROP.listiptables-DROP-CLEAR.list

该脚本需要最低配置才能发送电子邮件:

www-security-assistant.bash <ip-address> Guardian
www-security-assistant.bash <ip-address> ModSecurity
www-security-assistant.bash <ip-address> ModEvasive
www-security-assistant.bash <ip-address> a2Analyst
Run Code Online (Sandbox Code Playgroud)

如果有任何已配置的 HTTPS 服务,其 TLS 证书可以在 Postfix 服务中使用。

此外,脚本使用at: sudo apt install at

安装

  • 创建工作目录,我们称之为/var/www-security-assistant. 下载www-security-assistant.bash并使其可执行:

    iptables -A GUARDIAN -s $IP -j DROP
    
    Run Code Online (Sandbox Code Playgroud)
  • 使www-security-assistant.bash可作为自定义命令:

    iptables -D GUARDIAN -s $IP -j DROP
    
    Run Code Online (Sandbox Code Playgroud)
  • 通过 授予无需密码www-data运行的权限。使用以下命令安全地创建和编辑具有附加“ ”规则的新文件:www-security-assistant.bashsudosudoers

    iptables -A GUARDIAN -s $IP -j ACCEPT
    
    Run Code Online (Sandbox Code Playgroud)

    在文件中添加以下行 - 保存文件并退出:

    sudo apt install s-nail mutt mailutils postfix
    sudo dpkg-reconfigure postfix  # For General type: Internet Site
    echo 'Test passed.' | mail -s Test-Email email@example.com
    
    Run Code Online (Sandbox Code Playgroud)
  • 调整www-security-assistant.bash。至少改变变量的值$EMAIL_TO

检查

  • 代表自己$AGENT并检查自动模式是否正常工作:

    sudo mkdir /var/www-security-assistant
    sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/www-security-assistant.bash -O /var/www-security-assistant/www-security-assistant.bash
    sudo chmod +x /var/www-security-assistant/www-security-assistant.bash
    
    Run Code Online (Sandbox Code Playgroud)

    然后检查您的电子邮件,键入iptables -L GUARDIAN -n,查看文件www-security-assistant.historywww-security-assistant.mail. 运行上述命令 5 次并查看文件iptables-DROP.listiptables-CURRENT.conf.

  • 检查手动模式是否正常工作 - 将您的本地主机添加到白名单:

    sudo ln -s /var/www-security-assistant/www-security-assistant.bash /usr/local/bin/
    
    Run Code Online (Sandbox Code Playgroud)

    然后检查文件iptables-ACCEPT.list


本教程的其余部分是如何www-security-assistant与您的系统集成。


iptables – 基本配置 – 保存和恢复

基本配置

请在添加以下规则之前阅读本手册

sudo visudo -f /etc/sudoers.d/www-security-assistant
Run Code Online (Sandbox Code Playgroud)

在您执行下一步操作之前,打开一个新的 SSH 连接并尝试登录您的系统以检查一切是否正常!

保存和恢复

这可以通过自定义脚本来实现,这将iptables在系统的停止-启动(或重新启动)过程中保存和恢复锥体。(如果我们使用 UFW 来设置 Iptables 规则,则不需要此步骤。)

www-data ALL=(ALL) NOPASSWD: /var/www-security-assistant/www-security-assistant.bash
Run Code Online (Sandbox Code Playgroud)
www-security-assistant.bash 192.168.1.177 Guardian
Run Code Online (Sandbox Code Playgroud)

创建新链

创建新链,调用GUARDIAN并将其作为编号 3 插入INPUT链中:

www-security-assistant.bash 127.0.0.1 --ACCEPT "Server's localhost IP"
Run Code Online (Sandbox Code Playgroud)

检查

重新启动系统并检查配置。请使用sudo systemctl reboot(不要使用强制选项reboot -f)。当系统重新上线时,我们可以通过以下方式检查新创建的链是否存在:

sudo iptables -F

sudo iptables -I INPUT 1 -i lo -j ACCEPT
sudo iptables -I INPUT 2 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# This rule may lock you out of the system!
sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT ACCEPT
Run Code Online (Sandbox Code Playgroud)


Apache2 的 ModEvasive

ModEvasive 是 Apache 的一个规避机动模块,用于在发生 HTTP DoS 或 DDoS 攻击或蛮力攻击时提供规避动作。阅读更多...

安装

  • 安装并启用模块:

    printf '#!/bin/sh\n/sbin/iptables-save > /var/www-security-assistant/iptables-CURRENT.conf\nexit 0\n' | sudo tee /var/www-security-assistant/iptables-save.sh
    printf '#!/bin/sh\n/sbin/iptables-restore < /var/www-security-assistant/iptables-CURRENT.conf\nexit 0\n' | sudo tee /var/www-security-assistant/iptables-restore.sh
    sudo chmod +x /var/www-security-assistant/iptables-restore.sh /var/www-security-assistant/iptables-save.sh
    
    Run Code Online (Sandbox Code Playgroud)
  • 创建日志目录并使其可访问www-data

    sudo ln -s /var/www-security-assistant/iptables-save.sh /etc/network/if-post-down.d/iptables-save
    sudo ln -s /var/www-security-assistant/iptables-restore.sh /etc/network/if-pre-up.d/iptables-restore
    
    Run Code Online (Sandbox Code Playgroud)
  • 调整基本配置——取消注释并编辑配置文件中的某些指令:

    sudo iptables -N GUARDIAN
    sudo iptables -I INPUT 3 -j GUARDIAN
    
    Run Code Online (Sandbox Code Playgroud)
  • 重启Apache: sudo systemctl restart apache2.service

检查

  • 从您的服务器打开一个网页并密集刷新浏览器窗口几次(按F5)-您必须收到403 Forbidden错误消息。进入日志目录,会生成一个新的锁文件。应删除此文件,以便从此 IP 地址进一步检测违规行为。


ModEvasive ? WSAS ? iptables

在这里,我们将配置mod_evasiveiptables通过www-security-assistant.bash在上一节中创建的 , 进行通信。

为了检验这一配置中,我们可以通过模拟DDOS攻击F5的方法,如上所述,或者我们可以使用一个命令如abhping3

注意:要小心,因为iptablesWSAS 中使用的规则将删除来自源的所有连接$IP,包括您的 SSH 连接。在测试期间有一个备份方式连接到服务器是很好的。您可以将此规则更改为仅适用于 HTTP/HTTPS 端口。


Apache2 的 ModSecurity 2.9

ModSecurity是一个 Web 应用程序防火墙引擎,它本身提供的保护很少。为了变得有用,ModSecurity 必须配置规则。为了使用户能够充分利用开箱即用的 ModSecurity,Trustwave 的 Spider Labs 提供了一个免费的认证规则集...阅读更多...

安装

  • 安装并启用模块:

    sudo mkdir -p /var/log/apache2_mod_evasive
    sudo chown www-data /var/log/apache2_mod_evasive
    
    Run Code Online (Sandbox Code Playgroud)
  • 创建配置文件:

    须藤cp /etc/modsecurity/modsecurity.conf-推荐/etc/modsecurity/modsecurity.conf

    /etc/modsecurity/modsecurity.conf仔细阅读和编辑!至少添加或更改以下指令:

    /etc/apache2/mods-enabled/evasive.conf
    
    Run Code Online (Sandbox Code Playgroud)
  • 该文件/etc/apache2/mods-enabled/security2.conf涉及/etc/modsecurity/modsecurity.conf到 Apache 的配置。在此阶段security2.conf应如下所示:

    <IfModule mod_evasive20.c>
        DOSHashTableSize    3097
        DOSPageCount        9
        DOSSiteCount        70
        DOSPageInterval     2
        DOSSiteInterval     2
        DOSBlockingPeriod   10
    
        #DOSEmailNotify     your@email.foo
        DOSLogDir           "/var/log/apache2_mod_evasive"
        DOSSystemCommand    "sudo /var/www-security-assistant/www-security-assistant.bash %s 'ModEvasive' 'AutoMode' >> /var/www-security-assistant/www-security-assistant.execlog 2>&1"
    </IfModule>
    
    Run Code Online (Sandbox Code Playgroud)
  • 创建日志目录:

    sudo touch /var/www-security-assistant/www-security-assistant.execlog && sudo chown www-data /var/www-security-assistant/www-security-assistant.execlog
    
    Run Code Online (Sandbox Code Playgroud)
  • 设置日志轮换。首先创建配置文件:

    sudo apt install libapache2-mod-security2
    sudo a2enmod security2
    
    Run Code Online (Sandbox Code Playgroud)

    然后以这种方式编辑新文件:

    # -- Rule engine initialization ----------------------------------------------
    SecRuleEngine On
    
    # -- Debug log configuration -------------------------------------------------
    SecDebugLogLevel 2
    SecDebugLog "/var/log/apache2_mod_security/modsec_debug.log"
    
    # -- Audit log configuration -------------------------------------------------
    SecAuditLog "/var/log/apache2_mod_security/modsec_audit.log"
    
    # -- Guardian log configuration -------------------------------------------------
    SecGuardianLog /var/log/apache2_mod_security/modsec_guardian.log
    
    Run Code Online (Sandbox Code Playgroud)
  • 重新启动阿帕奇。

检查

  • 在 中创建一个额外的配置文件/etc/modsecurity,例如调用它z-customrules.conf,并添加以下规则作为其内容:

    <IfModule security2_module>
        SecDataDir /var/cache/modsecurity
        IncludeOptional /etc/modsecurity/*.conf
    </IfModule>
    
    Run Code Online (Sandbox Code Playgroud)

    重启服务器:sudo systemctl restart apache2.service。打开浏览器并输入https://example.com/?abc=../. 结果将是:403 Forbidden。检查日志文件以/var/log/apache2_mod_security获取更多详细信息。

  • 为了让事情更有趣,将脚本放置issues.php在您的适当位置DocumentRoot(这里我假设这个位置是/var/www/html):

    sudo mkdir -p /var/log/apache2_mod_security
    
    Run Code Online (Sandbox Code Playgroud)

    然后按照以下方式修改上面的规则:

    sudo cp /etc/logrotate.d/apache2 /etc/logrotate.d/apache2-modsec
    
    Run Code Online (Sandbox Code Playgroud)

    重新启动 Apache,然后打开浏览器并输入https://example.com/?abc=../;-) 这个想法是从 SE 的脚本中借来的BotLovin.cs

  • /etc/modsecurity/z-customrules.conf再次编辑并注释(禁用)规则 - 这只是测试示例,它由 OWASP CRS 涵盖,在下一节中描述。

  • 这是另一个示例,我们将重定向所有wp-admin页面请求,但来自某些 IP 地址的请求除外(注意chain):

    /var/log/apache2_mod_security/*.log { … }
    
    Run Code Online (Sandbox Code Playgroud)

    这里我们有两个破坏性动作:(1)deny, status:403和(2)redirect:'/issues.php'。实际上我们不需要deny动作,因为它会被redirect动作覆盖。


ModSecurity OWASP 核心规则集 3.x

在Ubuntu 16.04,您可以安装CSR 2.X: apt install modsecurity-crs。在这里我们将安装CSR 3.x安装手册中提供了详细说明(git需要)。

安装

  • 在文件夹中克隆 CSR /usr/share/modsecurity-crs.3

    # Directory traversal attacks
    SecRule REQUEST_URI "../" "t:urlDecodeUni, deny, log, id:109"
    
    Run Code Online (Sandbox Code Playgroud)
  • 升级和自动更新 GeoIP 数据库。(GeoIP DB 不再包含在 CRS 中。建议您定期下载它。)该脚本util/upgrade.py带来了此功能。您可以在 cron - 中按如下方式使用它sudo crontab -e

    sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/appendix/var/www/html/issues.php -O /var/www/html/issues.php
    
    Run Code Online (Sandbox Code Playgroud)
  • 创建配置文件:

    # Directory traversal attacks with redirection (or use URL instead of URI: redirect:'https://example.com/issues.php')
    SecRule REQUEST_URI "../" "t:urlDecodeUni, deny, log, id:109, redirect:'/issues.php'"
    
    Run Code Online (Sandbox Code Playgroud)

    仔细阅读和编辑这些文件!取消注释至少SecGeoLookupDB指令:

    # Block wp-admin access
    SecRule REQUEST_URI "^/wp-admin" "id:108, log, deny, status:403, t:lowercase, chain, redirect:'/issues.php'"
        SecRule REMOTE_ADDR "!@ipMatch 192.168.1.11,99.77.66.12"
    
    Run Code Online (Sandbox Code Playgroud)
  • 应用 Apache 的配置。/etc/apache2/mods-available/security2.conf以这种方式编辑:

    sudo git clone https://github.com/SpiderLabs/owasp-modsecurity-crs /usr/share/modsecurity-crs.3
    
    Run Code Online (Sandbox Code Playgroud)

    保存文件,然后重新启动 Apache。


ModSecurity 规则白名单

可以通过以下 ModSec 指令将 ModSecurity 规则列入白名单,这些指令可以在系统范围内或在虚拟主机的配置中使用,也可以在全局范围内用于特定目录或位置匹配:

0 2 * * * /usr/share/modsecurity-crs.3/util/upgrade.py --geoip --crs --cron >> /var/log/apache2_mod_security/owasp-crs-upgrade.log 2>&1
Run Code Online (Sandbox Code Playgroud)

禁用mod_security2PhpMyAdmin。改成/etc/phpmyadmin/apache.conf这样:

sudo cp /usr/share/modsecurity-crs.3/crs-setup.conf{.example,}
sudo cp /usr/share/modsecurity-crs.3/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf{.example,}
sudo cp /usr/share/modsecurity-crs.3/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf{.example,}
Run Code Online (Sandbox Code Playgroud)

禁用特定目录的特定规则:

SecGeoLookupDB util/geo-location/GeoIP.dat
Run Code Online (Sandbox Code Playgroud)

全局禁用规则。为此,我们必须在 Apache 的配置文件中的某处添加我们的指令:/etc/modsecurity/z-customrules.conf是个好地方。

  • 禁用整个 Apache 配置中的规则:

    <IfModule security2_module>
        SecDataDir /var/cache/modsecurity
        IncludeOptional /etc/modsecurity/*.conf
        IncludeOptional /usr/share/modsecurity-crs.3/crs-setup.conf
        IncludeOptional /usr/share/modsecurity-crs.3/rules/*.conf
    </IfModule>
    
    Run Code Online (Sandbox Code Playgroud)
  • 将 IP 地址列入白名单,以便它可以通过 ModSecurity:

    SecRuleRemoveById
    SecRuleRemoveByMsg
    SecRuleRemoveByTag
    SecRuleUpdateTargetById
    SecRuleUpdateTargetByMsg
    SecRuleUpdateTargetByTag
    SecRuleUpdateActionById
    
    Run Code Online (Sandbox Code Playgroud)
  • 禁用目录匹配中的规则:

    <Directory /usr/share/phpmyadmin>
        <IfModule security2_module>
            SecRuleEngine Off
        </IfModule>
    </Directory>
    
    Run Code Online (Sandbox Code Playgroud)
  • 通过位置匹配中的ID 更新规则的操作

    <Directory /var/www/html>
        <IfModule security2_module>
            SecRuleRemoveById 973301
        </IfModule>
    </Directory>
    
    Run Code Online (Sandbox Code Playgroud)

在上面的示例中,我们假设973301950907是阻碍我们 Web 应用程序正常工作的规则 ID。我们可以通过对 的分析找到这些规则modsec_audit.log


修改安全规则?WSAS ? iptables

这里给出了更多的例子,如何创建自定义 SecRules,以及我们如何通过它们调用 WWW 安全助手脚本 (WSAS)。

最初设定

我们需要一个额外的启动脚本 - modsecurity-assistant.sh. 原因是,ModSecurity 的exec动作语法过于简单和有限。

SecRuleRemoveById 973301 950907
Run Code Online (Sandbox Code Playgroud)

如果您查看脚本内部,您将看到 ModSecurity 导出的几个变量。它们是:$REQUEST_URI$ARGS$SERVER_NAME$REMOTE_ADDR$REMOTE_HOST$UNIQUE_ID。其他变量在脚本中进行了解释。