我需要规则来丢弃一些恶意的 Apache 连接

我需要规则来丢弃一些恶意的 Apache 连接

我删除了 Web 服务器上除 80 端口之外的所有流量。

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

iptables -A INPUT -p tcp -m tcp --dport 80 -m string --string "cgi" --algo bm --to 1000 -j DROP

有更多可以分享的吗?我知道坏黑客一直在更新,但其中一些总是以相同的代码开始。我需要根据一些标准断开连接。以下是一些 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

攻击 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

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

GET /userlogin/login.aspx HTTP/1.1  302 186 -   -

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

GET /hndUnblock.cgi HTTP/1.0    302 186 -   Wget(linux)
GET /tmUnblock.cgi HTTP/1.0 302 186 -   Wget(linux)

我对服务器很陌生,这 4 次攻击仅持续了 12 个小时......每周有数千次。

答案1

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

根据这次讨论我创建了一个名为万维网安全助理。有一个名为的分支ask_ubuntu专门用于此答案。所有参考资料,以前可用这里,由于字符限制而被删除 - 它们可以在 GitHub 上找到。

以下是涉及完整机制的几种方法,如何提高 Apache2 的安全性在 Ubuntu 16.04 中。

表中的内容:

  • WWW 安全助手脚本 (WSAS) ► Iptables
  • Iptables - 基本配置 - 保存和恢复
  • Apache2 的 ModEvasive
  • ModEvasive ► WSAS ► Iptables
  • Apache2 的 ModSecurity 2.9
  • ModSecurity OWASP 核心规则集 3.x
  • ModSecurity 规则白名单
  • ModSecurity 规则 ► WSAS ► Iptables
  • ModSecurity 和 Apache 日志文件
  • ModSecurity 日志文件 ► Fail2Ban ► Iptables
  • ModSecurity GuardianLog ► HTTPD Guardian ► 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

在此模式下,脚本提供两个行动阶段并且对于每一个动作发送电子邮件致管理员。

  • 第一阶段:最初几个‘违法行为’来源$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
  • 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
  • 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

依赖项

该脚本使用iptables-save.shiptablesGUARDIAN,下一节将对此进行解释。它将在 中创建和维护几个文件$WORK_DIR

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

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

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 protected]

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

此外,该脚本还使用atsudo apt install at

安装

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

      sudo mkdir /var/www-security-assistant
      sudo wget https://raw.githubusercontent.com/metalevel-tech/wwwsas/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
    
  • 制作www-security-assistant.bash可用作自定义命令:

      sudo ln -s /var/www-security-assistant/www-security-assistant.bash /usr/local/bin/
    
  • 通过 授予无需密码www-data运行的权限。使用以下命令www-security-assistant.bashsudo安全地创建和编辑带有附加“ ”规则的新文件sudoers

      sudo visudo -f /etc/sudoers.d/www-security-assistant
    

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

    www-data ALL=(ALL) NOPASSWD: /var/www-security-assistant/www-security-assistant.bash
  • 调整www-security-assistant.bash. 至少改变变量的值$EMAIL_TO

清理

  • 请以您自己的身份检查$AGENT自动模式是否正常工作:

      www-security-assistant.bash 192.168.1.177 Guardian
    

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

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

      www-security-assistant.bash 127.0.0.1 --ACCEPT "Server's localhost IP"
    

然后检查文件iptables-ACCEPT.list


> *本教程的其余部分介绍如何将 `www-security-assistant` 与您的系统集成。*
# Iptables – 基本配置 – 保存和恢复

基本配置

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

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

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

保存和恢复

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

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
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

创建新链

创建新链,命名为GUARDIAN3,并将其作为INPUT链中的数字插入:

sudo iptables -N GUARDIAN
sudo iptables -I INPUT 3 -j GUARDIAN

清理

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

sudo iptables -L GUARDIAN -n

# Apache2 的 ModEvasive

ModEvasive 是 Apache 的一个规避策略模块,用于在发生 HTTP DoS 或 DDoS 攻击或暴力攻击时提供规避措施。阅读更多...

安装

  • 安装并启用模块:

      sudo apt install libapache2-mod-evasive
      sudo a2enmod evasive
    
  • 创建日志目录并使其可访问www-data

      sudo mkdir -p /var/log/apache2_mod_evasive
      sudo chown www-data /var/log/apache2_mod_evasive
    
  • 调整基本配置–取消注释并编辑配置文件中的某些指令:

      /etc/apache2/mods-enabled/evasive.conf
    
  • 重新启动 Apache sudo systemctl restart apache2.service:。

清理

  • 从服务器打开一个网页,并多次密集刷新浏览器窗口(按F5) - 您必须获得403 禁止错误消息。在日志目录中,将生成一个新的锁定文件。应删除此文件,以便进一步检测来自此 IP 地址的违规行为。

# ModEvasive ► WSAS ► Iptables

在这里我们将配置通过在上面部分中创建的mod_evasive来进行对话。iptableswww-security-assistant.bash

  • 编辑/etc/apache2/mods-available/evasive.conf这样:

      <IfModule mod_evasive20.c>
          DOSHashTableSize    3097
          DOSPageCount        9
          DOSSiteCount        70
          DOSPageInterval     2
          DOSSiteInterval     2
          DOSBlockingPeriod   10
    
          #DOSEmailNotify     [email protected]
          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>
    
  • 创建日志文件并重新启动 Apache:

      sudo touch /var/www-security-assistant/www-security-assistant.execlog && sudo chown www-data /var/www-security-assistant/www-security-assistant.execlog
    

为了测试此配置,我们可以通过上面提到的方法模拟 DDOS 攻击,或者我们可以使用、等F5命令。abhping3

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


# Apache2 的 ModSecurity 2.9

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

安装

  • 安装并启用模块:

      sudo apt install libapache2-mod-security2
      sudo a2enmod security2
    
  • 创建配置文件:

    sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf

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

    # -- 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
  • 该文件/etc/apache2/mods-enabled/security2.conf涉及/etc/modsecurity/modsecurity.confApache 的配置。此阶段security2.conf应如下所示:

      <IfModule security2_module>
          SecDataDir /var/cache/modsecurity
          IncludeOptional /etc/modsecurity/*.conf
      </IfModule>
    
  • 创建日志目录:

      sudo mkdir -p /var/log/apache2_mod_security
    
  • 设置日志轮换。首先创建配置文件:

      sudo cp /etc/logrotate.d/apache2 /etc/logrotate.d/apache2-modsec
    

然后按如下方式编辑新文件:

    /var/log/apache2_mod_security/*.log { … }
  • 重新启动 Apache。

清理

  • 在 中创建一个附加配置文件/etc/modsecurity,例如将其命名为z-customrules.conf,并添加以下规则作为其内容:

      # Directory traversal attacks
      SecRule REQUEST_URI "../" "t:urlDecodeUni, deny, log, id:109"
    

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

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

      sudo wget https://raw.githubusercontent.com/metalevel-tech/wwwsas/ask_ubuntu/appendix/var/www/html/issues.php -O /var/www/html/issues.php
    

然后按如下方式修改上述规则:

    # 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'"

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

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

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

      # 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"
    

这里我们有两个破坏性动作: (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

      sudo git clone https://github.com/SpiderLabs/owasp-modsecurity-crs /usr/share/modsecurity-crs.3
    
  • 升级并自动更新 GeoIP 数据库。(GeoIP DB 不再包含在 CRS 中。建议您定期下载。)该脚本util/upgrade.py提供了此功能。您可以在 cron 中按如下方式使用它 - sudo crontab -e

      0 2 * * * /usr/share/modsecurity-crs.3/util/upgrade.py --geoip --crs --cron >> /var/log/apache2_mod_security/owasp-crs-upgrade.log 2>&1
    
  • 创建配置文件:

      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,}
    

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

      SecGeoLookupDB util/geo-location/GeoIP.dat
    
  • 应用 Apache 的配置。/etc/apache2/mods-available/security2.conf按如下方式编辑:

      <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>
    

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


# ModSecurity 规则白名单

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

SecRuleRemoveById
SecRuleRemoveByMsg
SecRuleRemoveByTag
SecRuleUpdateTargetById
SecRuleUpdateTargetByMsg
SecRuleUpdateTargetByTag
SecRuleUpdateActionById

禁用mod_security2PhpMyAdmin。/etc/phpmyadmin/apache.conf按如下方式更改:

<Directory /usr/share/phpmyadmin>
    <IfModule security2_module>
        SecRuleEngine Off
    </IfModule>
</Directory>

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

<Directory /var/www/html>
    <IfModule security2_module>
        SecRuleRemoveById 973301
    </IfModule>
</Directory>

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

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

      SecRuleRemoveById 973301 950907
    
  • 将 IP 地址列入白名单以便它可以通过 ModSecurity:

      SecRule REMOTE_ADDR "@ipMatch 192.168.110.1" "phase:1,nolog,allow,ctl:ruleEngine=Off,ctl:auditEngine=Off"
    
  • 禁用目录匹配中的规则:

      <Directory /var/www/mediawiki/core>
          SecRuleRemoveById 973301 950907
      </Directory>
    
  • 根据规则 ID 更新规则的操作在位置匹配内:

      <LocationMatch "/index.php.*">
          SecRuleUpdateActionById 973301 "pass"
          SecRuleUpdateActionById 950907 "pass"
      </LocationMatch>
    

在上面的例子中,我们假设973301950907是阻碍我们网络应用正常工作的规则ID。我们可以通过分析modsec_audit.log


# ModSecurity 规则 ► WSAS ► Iptables

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

初始设置

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

sudo wget https://raw.githubusercontent.com/metalevel-tech/wwwsas/ask_ubuntu/modsecurity-assistant.sh -O /var/www-security-assistant/modsecurity-assistant.sh
sudo chmod +x /var/www-security-assistant/modsecurity-assistant.sh

如果您查看脚本内部,您将看到 ModSecurity 导出的几个变量。这些变量是:、、、和。其他$REQUEST_URI变量在脚本中进行了说明。$ARGS$SERVER_NAME$REMOTE_ADDR$REMOTE_HOST$UNIQUE_ID

创建自定义规则并通过它调用我们的脚本

首先,让我们创建一个规则,当请求 URI 包含我们黑名单中的单词时,该规则将执行modsecurity-assistant.sh(并调用)。打开并将以下几行添加到底部:www-security-assistant.bash/etc/modsecurity/z-customrules.conf

# REQUEST_URI words blacklist
#
SecRule REQUEST_URI "@pmFromFile /var/www-security-assistant/modsecurity-uri-black.list" \
    "id:150, log, t:lowercase, chain, \
    drop, deny, status:403, redirect:'/issues.php'"
    SecRule REMOTE_ADDR "!@ipMatchFromFile /var/www-security-assistant/modsecurity-ip-white.list" \
        "setenv:REMOTE_HOST=%{REMOTE_HOST}, \
         setenv:ARGS=%{ARGS}, \
         exec:/var/www-security-assistant/modsecurity-assistant.sh"
  • REQUEST_URI- 此变量包含当前请求的完整 URI。规则可以更广泛:SecRule REQUEST_URI|ARGS|REQUEST_BODY ...

  • @pmFromFile将读取包含短语列表的文件modsecurity-uri-black.list,其中每个特定短语或单词都放在新行中。您可以从日志文件中收集有趣的单词和短语。如果有特别的匹配REQUEST_URI我们的模式列表,规则将被应用。该文件可以为空,但您必须创建 ( touch) 它。

  • log操作将使用 在该规则的日志文件中创建日志条目id:150

  • dropdeny(与status)和redirect动作属于破坏性的操作组,它们必须位于规则的开头chain(如果有链)。第二个操作将覆盖第一个操作,第三个操作将覆盖第二个操作,因此您必须选择要执行的操作,然后可以删除其他操作。

  • chain动作会调用链中的下一个规则,注意第二条规则没有id

  • REMOTE_ADDR包含请求的 IP 地址。

  • @ipMatchFromFile将包含 IP 地址白名单的文件modsecurity-ip-white.list,以新行分隔。CIDR 条目也是可以接受的。因为破坏性的操作始终位于链的领先规则中,它将被应用,但是当某些 IP 在此白名单中时,该exec操作将不会应用。该文件可以为空,但您必须创建(touch)它。

  • exec操作将调用我们的外部脚本。此操作不是破坏性的并将在当前规则返回 true 时执行。当此操作应用时,远程 IP 将通过我们的脚本进行处理。

  • setenv此举将出口某些内部变量 =%{...}作为环境变量,导出的名称可以与内部变量不同。有些变量必须手动导出,有些则会自动导出 - 这可能是一个小错误(在某些情况下,手动导出相同的名称,例如setenv:REQUEST_URI=%{REQUEST_URI},会导致导出变量的值为空)。

清理

假设您的服务器上没有 Joomla,请编辑文件modsecurity-uri-black.list并添加一行内容/joomla。然后在浏览器中输入https://exemple.com/joomla。您应该通过 Iptables 进行重定向和阻止。清除记录sudo www-security-assistant.bash <your-ip> --DROP-CLEAR 'some note',添加您的 IPmodsecurity-ip-white.list并再次进行练习。现在您应该被重定向,但不会被阻止。

将我们的脚本与 OWASP 核心规则集 3.x 连接起来

为此,我们将更新异常模式规则(949110 和 959100)。为此,请编辑该文件 /usr/share/modsecurity-crs.3/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf并将以下几行添加到底部:

# -- Anomaly Mode - Update actions by ID -----
#

SecRuleUpdateActionById 949110 "t:none, drop, deny, status:403, redirect:'/issues.php', \
     setenv:REMOTE_HOST=%{REMOTE_HOST}, setenv:ARGS=%{ARGS}, \
     exec:/var/www-security-assistant/modsecurity-assistant.sh"

SecRuleUpdateActionById 959100 "t:none, drop, deny, status:403, redirect:'/issues.php', \
     setenv:REMOTE_HOST=%{REMOTE_HOST}, setenv:ARGS=%{ARGS}, \
     exec:/var/www-security-assistant/modsecurity-assistant.sh"

# -- Anomaly Mode - Whitelist some URI and IP addresses -----
#

SecRule REQUEST_URI "^/wp-admin/admin-ajax.php*|^/index\.php\?title=.*&action=(submit|raw&ctype=text/javascript|raw&ctype=text/css)$" \
    "id:'999010', t:none, phase:1, pass, \
     ctl:ruleRemoveById=949110, \
     ctl:ruleRemoveById=959100"

SecRule REMOTE_ADDR "@ipMatchFromFile /var/www-security-assistant/modsecurity-ip-white.list" \
    "id:'999020', t:none, phase:1, pass, \
     ctl:ruleRemoveById=949110, \
     ctl:ruleRemoveById=959100"

清理

不要忘记重启(或重新加载)Apache 以应用配置更改。不要忘记在测试期间定期清除记录,否则您可能会被永久阻止 :-)

模拟目录遍历攻击:

https://example.com/?abc=../../../                         # This should be redirected and blocked
https://example.com/wp-admin/admin-ajax.php?abc=../../../  # This should pass because of the whitelist rule

模拟SQL注入攻击:

https://example.com/?username=1'%20or%20'1'%20=%20'1&password=1'%20or%20'1'%20=%20'1
https://example.com/index.php?username=1'%20or%20'1'%20=%20'1'))/*&password=foo

# ModSecurity 和 Apache 日志文件

可以配置 Apache Web 服务器,以便向服务器管理员提供有关其如何运行的重要信息...向管理员提供反馈的主要途径是使用日志文件。阅读更多...

ModSecurity具有强大的日志记录机制。通过指令SecGuardianLog它提供了专门设计用于与外部脚本协同工作的日志源。

目前唯一已知的可以与之配合使用的工具监护人记录httpd-guardian,这是Apache httpd 工具项目。该httpd-guardian工具旨在防御拒绝服务攻击。它使用blacklist tool与基于 iptables 的防火墙交互,动态将违规 IP 地址列入黑名单。阅读更多...


# ModSecurity 日志文件 ► Fail2Ban ► Iptables

可以设置 Fail2Ban 来解析 Apache 日志文件的数据。modsec_audit.log可能是最好的选择,但另请参阅我们讨论的部分SecGuardianLog

小心此处SecAuditLogRelevantStatus/etc/modsecurity/modsecurity.conf注释。否则,所有收到 404 错误页面的人都将被 fail2ban 屏蔽。

SecAuditEngine RelevantOnly
#SecAuditLogRelevantStatus "^(?:5|4(?!04))"

目前,该项目尚未以任何方式实现 Fail2Ban。


# ModSecGuardianLog ► HTTPD-Guardian ► WSAS ► Iptables

httpd-guardian- 通过监控请求检测 DoS 攻击 Apache Security,版权所有 (C) 2005 Ivan Ristic - 旨在通过管道日志记录机制监控所有 Web 服务器请求。它跟踪从每个 IP 地址发送的请求数... httpd-guardian 可以发出警告或执行脚本来阻止 IP 地址...

此脚本可以与Apache2 日志机制或使用 ModSecurity(更好的)。

在当前情况下的安装和设置

下载httpd-guardian并使其可执行:

sudo wget https://raw.githubusercontent.com/metalevel-tech/wwwsas/ask_ubuntu/httpd-guardian.pl -O /var/www-security-assistant/httpd-guardian.pl
sudo chmod +x /var/www-security-assistant/httpd-guardian.pl

阅读行98-119以了解该脚本如何与我们的 WSAS 脚本连接。

在 Apache 的配置中应用以下更改 ( /etc/modsecurity/modsecurity.conf),然后重新启动它:

#SecGuardianLog /var/log/apache2_mod_security/modsec_guardian.log
SecGuardianLog "|/var/www-security-assistant/httpd-guardian.pl"

清理

要测试脚本,请禁用 ModEvasive(sudo a2dismod evasive不要忘记稍后启用它)并重新启动 Apache。然后tail执行日志:

tail -F /var/www-security-assistant/www-security-assistant.execlog

并从另一个实例执行 DoS 攻击,例如ab这样使用:

for i in {1..20}; do (ab -n 200 -c 10 https://example.com/ &); done

# ModSecGuardianLog ► 自定义分析 ► WSAS ► Iptables

这里提供了一个简单的脚本,称为httpd-custom-analyze.bash,这没什么特别的,但可以作为一个很好的例子。其功能在脚本主体中描述。

安装和设置

下载httpd-custom-analyze.bash并使其可执行:

sudo wget https://raw.githubusercontent.com/metalevel-tech/wwwsas/ask_ubuntu/httpd-custom-analyze.bash -O /var/www-security-assistant/httpd-custom-analyze.bash
sudo chmod +x /var/www-security-assistant/httpd-custom-analyze.bash

在 Apache 的配置中应用以下更改(/etc/modsecurity/modsecurity.conf)并重新启动它:

#SecGuardianLog /var/log/apache2_mod_security/modsec_guardian.log
#SecGuardianLog "|/var/www-security-assistant/httpd-guardian.pl"
SecGuardianLog "|/var/www-security-assistant/httpd-custom-analyze.bash"
  • 当达到阈值时,脚本将调用 WSAS - 读取行8635

  • 要使两个httpd-脚本同时工作,请编辑modsecurity.conf并将两个脚本传输SecGuardianLog到管道。

  • 要进行测试,请按照上面部分的提示进行操作。

答案2

我意识到 pa4080 给出了详细的、可能非常有帮助的回复,让您可以自己处理这一切。虽然自己解决问题可能会感觉很好,但这也可能花费很多时间

  1. 熟悉Cloudflare因为他们提供免费的 DDoS 保护。
  2. 如果你目前只使用 Apache,可以考虑了解 NGINX 如何平衡你的负载。NGINX 非常适合平衡 Apache 负载,如下所示这里这里
  3. 审查Apache 在其文档中提供的安全性提示

相关内容