使用 ModSecurity 和 ClamAV 拦截恶意文件上传

在本教程中,您将学习如何使用 ModSecurity 和 ClamAV 拦截恶意文件上传。

ModSecurity,目前称为 libModSecurity 或 ModSecurity 版本 3 是

由 Trustwave 的 SpiderLabs 开发的开源、跨平台 Web 应用程序防火墙 (WAF) 模块。 它被称为 WAF 的“瑞士军刀”,它使 Web 应用程序防御者能够了解 HTTP(S) 流量,并提供电源规则语言和 API 来实施高级保护。

它具有强大的基于事件的编程语言,可提供针对 Web 应用程序的一系列攻击的保护,并允许 HTTP 流量监控、日志记录和实时分析。

ModSecurity 能做什么?

  • 拦截、存储和可选地验证上传的文件
  • 实时应用安全监控和访问控制
  • 完整的 HTTP 流量记录
  • 持续被动安全评估
  • Web应用加固
  • 由于它能够解析 XML 并应用 XPath 表达式以及代理请求的能力,因此它可以用作 XML Web 服务路由器。
  • HTTP 协议保护
  • 实时黑名单查询
  • HTTP 拒绝服务保护
  • 通用 Web 攻击防护
  • 错误检测和隐藏

另一方面,ClamAV 是一种开源防病毒引擎,用于检测木马、病毒、恶意软件和其他恶意威胁。

使用 ModSecurity 和 ClamAV 拦截恶意文件上传

ModSecurity 有能力了解 multipart/form-data 用于文件上传的编码。 这使 ModSecurity 能够从请求中提取上传的文件并存储在指定的文件系统位置。

除了能够提取上传的文件之外,ModSecurity 还可以通过与 ClamAV 等其他工具的集成来验证上传的文件。

ClamAV 提供可用于扫描文件以检测木马、病毒、恶意软件和其他恶意威胁的脚本。

为了能够使用ModSecurity和ClamAV拦截恶意文件上传,您需要安装这些工具。 按照以下链接安装 ModSecurity 和 ClamAV;

安装和配置 ModSecurity

安装和配置 ModSecurity Apache 在 Ubuntu 上

配置 LibModsecurity Apache 在 CentOS 上

安装和配置 ClamAV

在 Ubuntu 上安装和使用 ClamAV

您可以找到如何在其他 Linux 发行版上安装和设置 ClamAV。

笔记:我们在 Ubuntu 20.04 系统上运行我们的测试。

创建 ModSecurity-ClamAV 文件验证脚本

要使用 ModSecurity 启用文件上传验证,您需要创建一个使用 ClamAV 命令行防病毒扫描程序的 perl 脚本, clamscan, 提取正在上传的文件的完整路径并扫描任何恶意威胁。

在本教程中,我们将把我们的扫描仪脚本放在 /etc/apache2/modsecurity.d/ 目录。 但是,这不是标准位置,您可以将其放置在系统上的任何位置。

粘贴以下内容以创建 ClamAV 扫描程序脚本, /etc/apache2/modsecurity.d/modsec_clamav.pl. 您也可以为脚本选择任何名称。

cat > /etc/apache2/modsecurity.d/modsec_clamav.pl << 'EOL' #!/usr/bin/perl     $CLAMSCAN = "/usr/bin/clamscan";     if (@ARGV != 1) {     print "Usage: modsec_clamav.pl <filename>n";     exit; }     my ($FILE) = @ARGV;     $cmd = "$CLAMSCAN --stdout --disable-summary $FILE"; $input = `$cmd`; $input =~ m/^(.+)/; $error_message = $1;     $output = "0 Unable to parse clamscan output";     if ($error_message =~ m/: Empty file.$/) {     $output = "1 empty file"; } elsif ($error_message =~ m/: (.+) ERROR$/) {     $output = "0 clamscan: $1"; } elsif ($error_message =~ m/: (.+) FOUND$/) {     $output = "0 clamscan: $1"; } elsif ($error_message =~ m/: OK$/) {     $output = "1 clamscan: OK"; }     print "$outputn"; EOL

使脚本可执行;

chmod +x /etc/apache2/modsecurity.d/modsec_clamav.pl

创建 ModSecurity 规则来拦截文件上传

接下来,您需要创建一个自定义的 ModSecurity 规则来拦截文件上传。

在我们的设置中,我们在我们的文件中指定了 ModSecurity 规则文件的位置 Apache 站点配置文件为, /etc/apache2/modsecurity.d/modsec_rules.conf.

见下文;

less /etc/apache2/sites-available/wordpress.conf
<VirtualHost *:80>     ServerAdmin [email protected]     ServerName wp.kifarunix-demo.com     DocumentRoot /var/www/html/wp.kifarunix-demo.com         modsecurity on         modsecurity_rules_file /etc/apache2/modsecurity.d/modsec_rules.conf       <Directory /var/www/html/wp.kifarunix-demo.com>        AllowOverride All     </Directory>      ErrorLog /var/log/apache2/wp.error.log     CustomLog /var/log/apache2/wp.access.log combined </VirtualHost>

以下是 ModSecurity 规则文件的内容;

less /etc/apache2/modsecurity.d/modsec_rules.conf
Include "/etc/apache2/modsecurity.d/modsecurity.conf" Include "/etc/apache2/modsecurity.d/owasp-crs/crs-setup.conf" Include "/etc/apache2/modsecurity.d/owasp-crs/rules/*.conf"

因此,为 ModSecurity 创建自定义文件扫描程序/验证规则。 ModSecurity 规则是使用 SecRule 指示。

规则的语法是;

SecRule VARIABLES "OPERATOR" "TRANSFORMATIONS,ACTIONS"

在此设置中,我们将自定义规则文件命名为 /etc/apache2/modsecurity.d/modsec_clamav.conf.

下面是规则配置;

cat /etc/apache2/modsecurity.d/modsec_clamav.conf
SecRule FILES_TMPNAMES "@inspectFile /etc/apache2/modsecurity.d/modsec_clamav.pl"    "id:'400001',    phase:2,    t:none,    deny,    log,    msg:'Infected File upload detected',    tag:'MALICIOUS_SOFTWARE/VIRUS'"

接下来,在规则文件中包含规则。

echo 'Include "/etc/apache2/modsecurity.d/modsec_clamav.conf"' >> /etc/apache2/modsecurity.d/modsec_rules.conf

你的规则文件现在看起来像;

less /etc/apache2/modsecurity.d/modsec_rules.conf
Include "/etc/apache2/modsecurity.d/modsecurity.conf" Include "/etc/apache2/modsecurity.d/owasp-crs/crs-setup.conf" Include "/etc/apache2/modsecurity.d/owasp-crs/rules/*.conf" Include "/etc/apache2/modsecurity.d/modsec_clamav.conf"

查看 Apache 配置语法;

apachectl configtest

如果你得到 Syntax OK,然后继续重新启动/重新加载 Apache;

systemctl restart apache2

使用 ModSecurity 和 ClamAV 测试对恶意文件上传的拦截

如果您有测试环境,您可以从 Eicar 下载测试恶意文件并尝试上传到您的站点。

上传时,请务必拖尾 Apache 错误日志和 ModSecurity 审计日志文件。

例如,在下面的屏幕截图中,我尝试在我的 WordPress 上上传 eicar_com.zip,这是结果;

以及 ModSecurity 审计日志;

tail -f /var/log/modsec_audit.log
---i6mkrLhp---H-- ModSecurity: Access denied with code 403 (phase 2). Matched "Operator `InspectFile' with parameter `/etc/apache2/modsecurity.d/modsec_clamav.pl' against variable `FILES_TMPNAMES:' (Value: `' ) [file "/etc/apache2/modsecurity.d/modsec_clamav.conf"] [line "1"] [id "400001"] [rev ""] [msg "Infected File upload detected"] [data ""] [severity "0"] [ver ""] [maturity "0"] [accuracy "0"] [tag "MALICIOUS_SOFTWARE/VIRUS"] [hostname "wp.kifarunix-demo.com"] [uri "/wp-admin/update.php"] [unique_id "161558337389.815242"] [ref "v1369,0"]  ---i6mkrLhp---I--  ---i6mkrLhp---J--  ---i6mkrLhp---Z--

这就是如何使用 ModSecurity 和 ClamAV 拦截恶意文件上传。 随时分享任何反馈!

有用的链接

ModSecurity v2 参考手册

其他相关教程

使用 libModSecurity 将 WordPress 登录页面的访问权限限制为特定 IP

为 ModSecurity 日志创建 Kibana 可视化仪表板

在 ELK Stack 上处理和可视化 ModSecurity 日志

配置 LibModsecurity Apache 在 CentOS 8 上