跳转到主要内容
Chinese, Simplified

""

nginx是一个网络服务器,它正在世界上越来越多的网站上取代Apache。到目前为止,nginx还不能从ModSecurity提供的安全性中获益。下面是如何安装ModSecurity并让它与nginx一起工作。

今年早些时候,流行的开源网络应用防火墙ModSecurity发布了其软件的第三版。版本3与早期版本有很大的不同,因为它现在已经模块化了。在版本3之前,ModSecurity仅作为一个依赖模块与Apache web服务器一起工作,因此其他HTTP应用程序无法使用ModSecurity。现在,HTTP过滤引擎ModSecurity的核心功能作为一个独立的库libModSecurity存在,它可以通过一个“连接器”集成到任何其他应用程序中。连接器是允许任何应用程序访问libModSecurity的一小段代码。

Web应用程序防火墙(WAF)是用于HTTP请求的一种防火墙。标准防火墙在数据包到达和离开网络接口时检查数据包,并根据规则列表比较数据包的属性。规则规定防火墙是允许数据包通过还是阻止数据包。

ModSecurity执行与标准防火墙相同的任务,但它不是查看数据包,而是在HTTP流量到达服务器时检查它。当HTTP请求到达服务器时,它首先通过ModSecurity路由,然后再路由到目标应用程序,如Apache2或nginx。ModSecurity将入站HTTP请求与规则列表进行比较。这些规则定义了恶意或有害请求的形式,因此,如果传入的请求与规则匹配,ModSecurity将阻止请求到达可能造成伤害的目标应用程序。

下面的例子演示了ModSecurity如何保护WordPress站点。下面的HTTP请求是index.php文件的非恶意请求,它出现在Apache2的日志文件中:

GET /index.php HTTP/1.1

这个请求不匹配任何规则,因此ModSecurity允许它进入web服务器。

WordPress在一个名为wp-config的文件中保存了很多秘密信息,比如数据库密码。它位于与index.php文件相同的目录中。粗心的系统管理员可能不保护这个重要的文件,这意味着像Apache或nginx这样的web服务器很乐意为它提供服务。这是因为它们将提供不受特定配置保护的任何文件。这意味着以下恶意请求:

GET /wp-config.php HTTP/1.1

将由Apache提供给任何请求它的人。

这就是ModSecurity为接受HTTP数据的应用程序提供保护的地方。在本例中,免费的核心ModSecurity规则集包含拒绝任何试图访问WordPress安装中的任何敏感文件的HTTP请求的规则。核心规则集还包含另一个流行的CMS Drupal的规则。

核心规则集还包含许多其他规则,这些规则涵盖了恶意构造HTTP请求以从网站获得访问或机密信息的许多其他方法。这些方法包括SQL注入、漏洞扫描、Java和PHP漏洞利用等等。ModSecurity还支持自定义规则,因此您可以通过编写自己的规则来保护HTTP应用程序免受特定目标的攻击。

首先让我们安装核心ModSecurity库libModSecurity,然后安装nginx连接器,使nginx能够使用ModSecurity。在版本3之前,nginx不可能使用ModSecurity。如果您正在使用Apache2,您应该继续使用ModSecurity version 2,因为Apache2连接器仍然有很多bug,不建议在生产环境中使用。

 

编译和安装libModSecurity

ModSecurity3不能通过包管理器用于任何主要的Linux发行版。相反,您需要克隆ModSecurity GitHub存储库,并从其源代码构建库。但在此之前,您必须安装所有必需的构建工具和依赖项。下面的列表的包提供了所有必需的和大部分的可选的差异在Debian和Ubuntu发行版:野牛,flex,, automake, gcc, pkg-config, libtool, doxygen, git,卷发,zlib1g-dev, libxml2-dev, libpcre3-dev,建设重要,libyajl-dev, yajl-tools, liblmdb-dev, rdmacm-utils, libgeoip-dev, libcurl4-openssl-dev, liblua5.2-dev, libfuzzy-dev, openssl和libssl-dev。

注意,其中一些包在基于Red hat的发行版上有不同的名称。这个页面将帮助您确定具体的包名是什么。

安装这些包之后,您可以继续编译库。这些指令与分布无关。

首先,克隆libModSecurity git存储库,它将下载构建libModSecurity所需的所有源代码。使用/opt/目录作为所有源代码的目标。移动到/opt/目录,并使用以下命令克隆libModSecurity git存储库:

cd /opt/
git clone https://github.com/SpiderLabs/ModSecurity

接下来,进入克隆ModSecurity存储库时创建的新目录,并切换到v3分支。你还需要引入几个必要的子模块:

cd ModSecurity
git checkout v3/master
git submodule init
git submodule update

现在可以构建libModSecurity了。对于任何从源代码编译程序的人来说,这应该是一个熟悉的过程。你只需要以下三个命令来编译和安装程式库:

sh build.sh
./configure
make
make install

如果您在一个普通的虚拟服务器上运行make命令,则需要几分钟。libModSecurity库现在安装在/usr/local/modsecurity/lib/ libModSecurity .so上。但是,在安装将HTTP数据连同一些规则重定向到libModSecurity库的应用程序和连接器之前,它不能做任何事情。下一节将介绍如何安装nginx连接器和ModSecurity开发人员提供的核心规则集。

编译nginx连接器

让我们利用nginx动态加载第三方模块的能力来编译nginx连接器。nginx从1.11.5版开始就能够做到这一点。此版本或更高版本在大多数主要发行版的标准存储库中都不可用。nginx为Red Hat/CentOS、Debian和Ubuntu的当前稳定版本提供了存储库,其中包含一个支持动态模块加载的版本。这个页面列出了这些存储库以及将nginx存储库添加到您的发行版的信息。在将nginx存储库添加到存储库配置之后,需要使用包管理器安装nginx。当你安装了nginx,用这个命令找到你安装的版本:

nginx - v

当您拥有版本号时,请切换到/opt/目录并从此页下载与nginx版本匹配的源代码,然后解压缩下载的存档文件。

接下来,您需要为ModSecurity nginx连接器克隆git存储库。从/opt/目录中运行以下命令克隆这个存储库:

git clone https://github.com/SpiderLabs/ModSecurity-nginx

现在切换到解压nginx源存档时创建的新目录。在该目录中,运行以下命令编译连接器:

./configure --with-compat
 ↪--add-dynamic-module=/opt/ModSecurity-nginx
make modules

现在,您需要使用以下命令将连接器模块复制到nginx modules目录中:

cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules/

现在已经编译了nginx连接器并将其复制到正确的位置,您需要配置nginx来使用它。此外,还需要下载libModSecurity用于过滤HTTP数据的规则。

首先,移动到nginx配置目录:

cd /etc/nginx/

并将以下行添加到nginx的主配置文件/etc/nginx/nginx.conf:

load_module modules/ngx_http_modsecurity_module.so;

您需要将这一行放在以pid开头的行下面的第一个部分中,而不是放在事件或http部分中。

接下来,创建一个新的目录,并加载ModSecurity规则和配置到其中:

mkdir /etc/nginx/modsec
cd /etc/nginx/modsec
git clone https://github.com/SpiderLabs/
↪owasp-modsecurity-crs.git

使用从git存储库下载的ModSecurity rules配置文件,使用以下命令重新命名它:

mv /etc/nginx/modsec/owasp-modsecurity-crs/
↪crs-setup.conf.example /etc/nginx/modsec/
↪owasp-modsecurity-crs/crs-setup.conf

现在需要将ModSecurity配置文件从构建libModSecurity的目录复制到/etc/nginx/modsec/:

cp /opt/ModSecurity/modsecurity.conf-recommended
 ↪/etc/nginx/modsec/modsecurity.conf

最后,创建一个新的配置文件,加载这两个配置文件和所有规则文件。这个文件将由nginx服务器配置块中的几行代码调用,这将调用ModSecurity的使用。用文本编辑器创建并开始编辑这个文件:

nano /etc/nginx/modsec/main.conf

添加以下三行到这个文件:

Include /etc/nginx/modsec/modsecurity.conf
Include /etc/nginx/modsec/owasp-modsecurity-crs/crs-setup.conf
Include /etc/nginx/modsec/owasp-modsecurity-crs/rules/*.conf

现在已经完成了nginx、libModSecurity、nginx连接器和ModSecurity规则的构建和安装。现在可以启动或重新启动nginx来加载新配置。如果一切正常,在重新启动nginx时,您不会看到打印出任何错误。

测试ModSecurity

让我们通过向“默认”服务器添加几行代码并发出一个将被ModSecurity阻塞的请求来测试ModSecurity。默认的服务器配置是nginx在安装时使用的配置,并且只在本地主机上监听,而不在面向internet的网络接口上监听。这使得在创建任何自定义服务器配置之前启动nginx是安全的,因为默认配置无法从internet访问。

默认服务器配置位于/etc/nginx/conf.d/default.conf。使用文本编辑器打开此文件,并在server_name行下添加以下两行:

modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;

重新启动nginx来加载这个新配置。现在,要测试ModSecurity是否正常工作,您所需要做的就是发出一个匹配禁用规则的HTTP请求。

ModSecurity有两种操作模式。默认情况下,它将只记录与禁止规则匹配但允许它们传递给应用程序的查询。这种模式允许系统管理员运行ModSecurity一段时间,并确保没有干扰网站正常运行的假阳性请求被阻塞。ModSecurity将这些与/var/log/modsec_audit.log中禁止的规则匹配的请求记录下来。

您可以创建一个HTTP请求,通过使用curl发出包含禁用用户代理头的请求,该请求将被记录到该日志文件中。下面的命令发出一个HTTP请求,其中包含标题“User-Agent: masscan”。这是一个被禁止的用户代理,所以ModSecurity记录了它目睹了一个被禁止的HTTP请求。这个命令看起来像:

curl -H "User-Agent: masscan" http://localhost/

nginx返回默认的欢迎页面作为原始HTML,但是ModSecurity在/var/log/modsec_audit.log中创建了一个很长的日志条目,开头是:

ModSecurity: Warning. Matched "Operator `PmFromFile'
 ↪with parameter `scanners-user-agents.data' against
 &rarrhkk;variable `REQUEST_HEADERS:User-Agent' (Value: `masscan' )

这表明ModSecurity成功拦截并匹配了恶意HTTP请求。

当您想要将ModSecurity从记录恶意HTTP请求切换到主动阻塞它们时,请编辑/etc/nginx/modsec/modsecurity.conf中的行:

SecRuleEngine DetectionOnly

to

SecRuleEngine On

并重启nginx。现在相同的curl请求将导致403错误:

curl -H "User-Agent: masscan" http://localhost/
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.12.2</center>
</body>
</html>

被阻塞的请求也将被记录到/var/log/modsec_audit.log。

额外的ModSecurity连接器

ModSecurity新的模块化特性意味着任何接受或处理HTTP数据的应用程序都可以使用ModSecurity及其规则来分析HTTP数据。在撰写本文时,ModSecurity v3的发布质量只有几个月的时间,因此没有太多额外的连接器可以让应用程序连接到libModSecurity。

谷歌代码之夏产生了一些有趣的新连接器。第一个扩展了Snort v3使用ModSecurity规则的能力。Snort是一个入侵检测和实时包嗅探及日志记录应用程序。这个连接器允许Snort将捕获的HTTP数据发送到libModSecurity,并根据ModSecurity规则集对其进行检查。这个项目的主页(https://akoul.github.io/)在这里。

第二个google赞助的连接器目标是node.js服务器。js是一个JavaScript运行时,支持创建可伸缩的网络应用程序。该连接器通过ModSecurity路由所有入站HTTP请求,从而向节点应用程序添加一个安全层。你可以在它的主页上阅读更多关于这个项目的信息(https://m2n.me/gsoc)。

ModSecurity v3的发布将ModSecurity从Apache模块转换为一个灵活的应用程序,任何接受HTTP数据的应用程序都可以轻松地利用这个灵活的应用程序。由于人们所依赖的应用程序越来越多地从本地计算机转移到数据中心,因此确保这些应用程序和数据的安全性变得越来越重要。

 

原文:https://www.linuxjournal.com/content/modsecurity-and-nginx

本文:

讨论:请加入知识星球或者小红圈【首席架构师圈】

Article
知识星球
 
微信公众号
 
视频号