ModSecurity 是由 Trustwave 的 SpiderLabs 开发的开源跨平台 Web 应用程序防火墙 (WAF) 引擎,适用于 Apache、IIS 和 Nginx。它具有强大的基于事件的编程语言,可防止针对 Web 应用程序的一系列攻击,并允许 HTTP 流量监控、日志记录和实时分析……
Libmodsecurity 是 ModSecurity v3 项目的一个组成部分。库代码库充当 ModSecurity 连接器的接口,接收网络流量并应用传统的 ModSecurity 处理。通常,它提供加载/解释以 ModSecurity SecRules 格式编写的规则的功能,并将它们应用于您的应用程序通过连接器提供的 HTTP 内容。
如果您正在寻找 Apache 的 ModSecurity(又名 ModSecurity v2.x),它仍在维护中并且可用: 这里。
[hidecontent type="logged" desc="隐藏内容:登录后可查看"]
Libmodsecurity 是对 ModSecurity 平台的完全重写。最初设计时,ModSecurity 项目只是一个 Apache 模块。随着时间的推移,由于大众需求,该项目已经扩展到支持其他平台,包括(但不限于)Nginx 和 IIS。为了满足对额外平台支持不断增长的需求,有必要删除该项目底层的 Apache 依赖项,使其更加独立于平台。
作为这个目标的结果,我们重新设计了 Libmodsecurity,使其不再依赖于 Apache Web 服务器(在编译和运行时)。这样做的一个副作用是,在所有平台上,用户都可以期待更高的性能。此外,我们还借此机会为用户长期寻求的一些新功能奠定了基础。例如,我们希望原生支持 JSON 格式的审计日志,以及未来版本中的许多其他功能。
“ModSecurity”分支不再包含传统上打包在一起的传统模块逻辑(用于 Nginx、Apache 和 IIS)。相反,此分支仅包含此项目的库部分 (libmodsecurity)。这个库被我们称为“连接器”的东西使用,这些连接器将与您的网络服务器连接,并为库提供它理解的通用格式。这些连接器中的每一个都作为一个单独的 GitHub 项目进行维护。例如,Nginx 连接器由 ModSecurity-nginx 项目 ( https://github.com/SpiderLabs/ModSecurity-nginx ) 提供。
保持这些连接器分离允许每个项目有不同的发布周期、问题和开发树。此外,这意味着当您安装 ModSecurity v3 时,您只会得到您所需要的,没有您不会使用的额外内容。
在开始编译过程之前,请确保您已准备好所有依赖项。阅读“依赖关系”小节以获取更多信息。
编译后确保您的构建/平台没有问题。我们强烈建议使用单元测试和回归测试。这些测试实用程序位于子文件夹“测试”下。
作为一个动态库,不要忘记 libmodsecurity 必须安装到操作系统将查找动态库的位置(文件夹)。
在 unix 上,该项目使用 autotools 来帮助编译过程。
$ ./build.sh
$ ./configure
$ make
$ sudo make install
有关特定于发行版的构建的详细信息,请参见我们的 Wiki: Compilation Recipes
这个库是使用 C++11 标准用 C++ 编写的。它还使用 Flex 和 Yacc 来生成“安全规则语言”解析器。其他强制依赖项包括 YAJL,因为 ModSecurity 使用 JSON 生成日志及其测试框架,libpcre(尚未强制)用于处理 SecRules 中的正则表达式,以及 libXML2(尚未强制)用于解析 XML 请求。
所有其他依赖项都与 SecRules 或配置指令中指定的运算符相关,编译可能不需要。此类依赖项的简短列表如下:
如果缺少这些库,ModSecurity 将在不支持运算符@detectXSS 和配置指令 SecRemoteRules 的情况下进行编译。
该库提供了 C++ 和 C 接口。某些资源目前只能通过 C++ 接口使用,例如,创建自定义日志记录机制的能力(请参阅回归测试以检查这些日志记录机制的工作原理)。目标是让两个 API(C、C++)提供相同的功能,如果您发现通过特定接口缺少 API 的某个方面,请打开一个问题。
在子文件夹示例中,有关于如何使用 API 的简单示例。下面是一些说明:
using ModSecurity::ModSecurity;
using ModSecurity::Rules;
using ModSecurity::Transaction;
ModSecurity *modsec;
ModSecurity::Rules *rules;
modsec = new ModSecurity();
rules = new Rules();
rules->loadFromUri(rules_file);
Transaction *modsecTransaction = new Transaction(modsec, rules);
modsecTransaction->processConnection("127.0.0.1");
if (modsecTransaction->intervention()) {
std::cout << "There is an intervention" << std::endl;
}
#include "modsecurity/modsecurity.h"
#include "modsecurity/transaction.h"
char main_rule_uri[] = "basic_rules.conf";
int main (int argc, char **argv)
{
ModSecurity *modsec = NULL;
Transaction *transaction = NULL;
Rules *rules = NULL;
modsec = msc_init();
rules = msc_create_rules_set();
msc_rules_add_file(rules, main_rule_uri);
transaction = msc_new_transaction(modsec, rules);
msc_process_connection(transaction, "127.0.0.1");
msc_process_uri(transaction, "http://www.modsecurity.org/test?key1=value1&key2=value2&key3=value3&test=args&test=test");
msc_process_request_headers(transaction);
msc_process_request_body(transaction);
msc_process_response_headers(transaction);
msc_process_response_body(transaction);
return 0;
}
[/hidecontent]