ModSecurity-nginx 连接器是 nginx 和 libmodsecurity (ModSecurity v3) 之间的连接点。换句话说,这个项目提供了 nginx 和 libmodsecurity 之间的通信通道。需要此连接器才能将 LibModSecurity 与 nginx 结合使用。
ModSecurity-nginx 连接器采用 nginx 模块的形式。该模块只是充当 nginx 和 ModSecurity 之间的通信层。
请注意,该项目依赖于 libmodsecurity 而不是 ModSecurity(版本 2.9 或更低)。
旧版本使用独立的 ModSecurity,它是 Apache 内部的包装器,用于将 ModSecurity 链接到 nginx。当前版本更接近 nginx,使用不再依赖于 Apache 的新 libmodsecurity。因此,当前版本的依赖性更少,错误更少,并且速度更快。此外,还提供了一些新功能,例如可以使用全局规则配置和每个目录/位置自定义(例如 SecRuleRemoveById)。
在编译此软件之前,请确保您已安装 libmodsecurity。您可以从 ModSecurity git 存储库下载它。有关 libmodsecurity 的编译和安装的信息,请参阅随附的文档。
安装 libmodsecurity 后,您可以继续安装 ModSecurity-nginx 连接器,该连接器遵循 nginx 第三方模块安装过程。从 nginx 源目录:
./configure --add-module=/path/to/ModSecurity-nginx
或者,构建动态模块:
./configure --add-dynamic-module=/path/to/ModSecurity-nginx --with-compat
请注意,构建动态模块时,您的 nginx 源版本需要与您为其编译的 nginx 版本相匹配。
有关 nginx 第三方插件支持的更多信息,请访问:http://wiki.nginx.org/3rdPartyModules
ModSecurity for nginx 扩展了您的 nginx 配置指令。它添加了四个新指令,它们是:
语法: modsecurity on |离开
上下文: http、服务器、位置
默认值:关闭
打开或关闭 ModSecurity 功能。请注意,此配置指令不再与 SecRule 状态相关。相反,它现在仅用作 nginx 标志来启用或禁用该模块。
语法: modsecurity_rules_file <规则文件路径>
上下文: http、服务器、位置
默认值:否
指定 modsecurity 配置文件的位置,例如:
server {
modsecurity on;
location / {
root /var/www/html;
modsecurity_rules_file /etc/my_modsecurity_rules.conf;
}
}
语法: modsecurity_rules_remote
上下文: http、服务器、位置
默认值:否
指定从何处(在互联网上)下载 modsecurity 配置文件。它还指定将用于验证该服务器的密钥:
server {
modsecurity on;
location / {
root /var/www/html;
modsecurity_rules_remote my-server-key https://my-own-server/rules/download;
}
}
语法: modsecurity_rules
上下文: http、服务器、位置
默认值:否
允许将 ModSecurity 规则直接包含到 nginx 配置中。以下示例从文件加载规则并为每个目录/别名注入特定配置:
server {
modsecurity on;
location / {
root /var/www/html;
modsecurity_rules_file /etc/my_modsecurity_rules.conf;
}
location /ops {
root /var/www/html/opts;
modsecurity_rules '
SecRuleEngine On
SecDebugLog /tmp/modsec_debug.log
SecDebugLogLevel 9
SecRuleRemoveById 10
' ;
}
}
语法: modsecurity_transaction_id 字符串
上下文: http、服务器、位置
默认值:否
允许从 nginx 传递事务 ID,而不是在库中生成它。这对于跟踪目的很有用,例如考虑以下配置:
log_format extended ' $remote_addr - $remote_user [ $time_local ] '
'" $request " $status $body_bytes_sent '
'" $http_referer " " $http_user_agent " $request_id ' ;
server {
server_name host1;
modsecurity on;
modsecurity_transaction_id "host1- $request_id " ;
access_log logs/host1-access.log extended;
error_log logs/host1-error.log;
location / {
...
}
}
server {
server_name host2;
modsecurity on;
modsecurity_transaction_id "host2- $request_id " ;
access_log logs/host2-access.log extended;
error_log logs/host2-error.log;
location / {
...
}
}
使用 log_format 和 modsecurity_transaction_id 的组合,您将能够使用相同的唯一标识符找到访问日志和错误日志条目之间的相关性。
字符串可以包含变量。
作为一个开源项目,我们邀请(并鼓励)社区中的任何人为我们的项目做出贡献。这可能采取以下形式:新功能、错误修复、错误报告、初学者用户支持以及您愿意提供帮助的任何其他内容。谢谢。
我们更愿意将您的补丁放在 GitHub 基础设施中,以促进我们的审核工作和 QA 集成。 GitHub 提供了有关如何执行“拉取请求”的优秀文档。更多信息请参见:https://help.github.com/articles/using-pull-requests/
请尊重所使用的编码风格。拉取请求可以包含各种提交,因此每次提交都提供一项修复或一项功能。不要更改目标工作范围之外的任何内容(例如,您经过的函数中的编码风格)。
在我们的代码中,有多个标记为 TODO 或 FIXME 的项目可能需要您注意。通过执行 grep 检查项目列表:
$ cd /path/to/modsecurity-nginx
$ egrep -Rin "TODO|FIXME" -R *
您还可以查看最近的错误报告和未解决的问题,以了解我们正在寻求什么样的帮助。
除了手动测试之外,我们强烈建议您使用 nginx 测试实用程序,以确保您的补丁不会对 nginx 的行为或性能产生不利影响。
nginx 测试位于:http://hg.nginx.org/nginx-tests/
要使用这些测试,请确保您拥有 Perl 实用程序 Prove(Perl 5 的一部分)并继续执行以下命令:
$ cp /path/to/ModSecurity-nginx/tests/* /path/to/nginx/test/repository
$ cd /path/to/nginx/test/repository
$ TEST_NGINX_BINARY=/path/to/your/nginx prove .
如果您在让添加的功能通过所有 nginx 测试时遇到问题,请随时联系我们或 nginx 邮件列表:http://nginx.org/en/support.html
我们尊重 nginx 调试模式。通过在 nginx 配置期间使用配置选项“--with-debug”,您还将启用连接器的调试消息。核心转储和崩溃预计以与调试 nginx 相同的方式进行调试。更多信息请查看nginx调试信息:http://wiki.nginx.org/Debugging
如果您遇到配置问题或者某些内容未按您的预期运行,请使用 ModSecurity 用户的邮件列表。 GitHub 上的问题也是受欢迎的,但我们更喜欢先让用户在邮件列表上提出问题,这样您就可以联系整个社区。另外,在打开新问题之前,不要忘记查找现有问题。
最后,如果您打算在 GitHub 上提出问题,请不要忘记告诉我们您的 libmodsecurity 版本和您正在运行的 nginx 连接器版本。
请不要公开报告任何安全问题。相反,请通过 [email protected] 联系我们来报告问题。一旦问题得到解决,我们将为您的发现提供荣誉。
我们很乐意讨论您对新功能的任何想法。请记住,这是一个社区驱动的项目,因此请务必通过邮件列表联系社区以首先获取反馈。或者,您可以随意打开 GitHub 问题来请求新功能。在打开新问题之前,请检查是否存在所需功能的现有功能请求。
我们非常希望能够按时发布我们的软件包。如果我们可以做些什么来促进您作为包装工的工作,请告诉我们。