如何安装和配置Naxsi在Ubuntu 14.04

介绍

Naxsi是第三方Nginx模块,提供Web应用程序防火墙功能。 它为您的Web服务器带来额外的安全性,并保护您免受各种Web攻击,如XSS和SQL注入。

Naxsi灵活强大。 您可以为流行的Web应用程序(如WordPress)使用现成的规则。 同时,您也可以使用Naxsi的学习模式创建自己的规则并微调它们。

Naxsi是类似的ModSecurity为Apache 因此,如果你已经熟悉ModSecurity和/或寻求类似的功能Nginx,Naxsi一定会对你感兴趣。 但是,您可能无法在Naxsi中找到所有ModSecurity的功能。

本教程将向您介绍如何安装Naxsi,了解规则,创建白名单以及在哪里可以找到为常用Web应用程序编写的规则。

先决条件

在遵循本教程之前,请确保您满足以下先决条件:

除非另有说明,本教程中需要root权限的所有命令都应以具有sudo权限的非root用户身份运行。

第1步 - 安装Naxsi

要安装Naxsi,你必须安装一个用它编译的Nginx服务器。 为此,你将需要包nginx-naxsi 您可以在通常的Ubuntu的方式与安装apt-get命令:

sudo apt-get update
sudo apt-get install nginx-naxsi

这将安装Naxsi以及Nginx及其所有的依赖项。 它还将确保服务在Droplet上自动启动和停止。

注意:如果你已经没有Naxsi安装的Nginx,你将需要更换包nginx-core ,或Nginx的另一种风格,你可能有,与包nginx-naxsi 其他Nginx软件包不支持可加载模块,你不能只是将Naxsi加载到现有的Nginx服务器。

在大多数情况下,更换nginx-corenginx-naxsi是没有问题的,你可以继续使用以前的配置。 尽管如此,它总是与这样的升级是一个好主意,以创建现有的备份/etc/nginx/第一个目录。 之后,按照说明进行新安装,并确认您同意删除您的系统上现有的Nginx软件包。

Nginx的默认安装提供了一个基本的,工作的Nginx环境,这足以熟悉Naxsi。 我们不会花时间定制Nginx,而是直接配置Naxsi。 但是,如果你有Nginx的没有经验是检查一个好主意, 如何在Ubuntu 14.04 LTS安装的Nginx和它相关的文章,特别是如何设置的Nginx服务器块(虚拟主机),在Ubuntu 14.04 LTS

第2步 - 启用Naxsi

首先,让我们Naxsi需要加载的文件中找到它的核心规则/etc/nginx/naxsi_core.rules 此文件包含用于检测恶意攻击的通用签名。 稍后我们将更详细地讨论这些规则。 现在,我们只包括Nginx的主配置文件中的规则/etc/nginx/nginx.conf在HTTP侦听器的一部分。 所以,打开后面的文件用nano编辑:

sudo nano /etc/nginx/nginx.conf

然后找到http部分,并通过删除取消对包括Naxsi的规则的一部分#在该行的开头字符。 它现在应该看起来像这样:

/etc/nginx/nginx.conf
http {
...
        # nginx-naxsi config
        ##
        # Uncomment it if you installed nginx-naxsi
        ##

        include /etc/nginx/naxsi_core.rules;
...

保存文件并退出编辑器。

其次,我们必须启用以前的规则并为Naxsi配置一些基本选项。 默认情况下,基本Naxsi配置是在文件中找到/etc/nginx/naxsi.rules 打开此文件:

sudo nano /etc/nginx/naxsi.rules

只为值更改DeniedUrl到已经默认存在错误的文件,并保留其余不变:

/etc/nginx/naxsi.rules
# Sample rules file for default vhost.
LearningMode;
SecRulesEnabled;
#SecRulesDisabled;
DeniedUrl "/50x.html";

## check rules
CheckRule "$SQL >= 8" BLOCK;
CheckRule "$RFI >= 8" BLOCK;
CheckRule "$TRAVERSAL >= 4" BLOCK;
CheckRule "$EVADE >= 4" BLOCK;
CheckRule "$XSS >= 8" BLOCK;

保存文件并退出。

这里是从上面的配置指令及其含义:

  • LearningMode -启动Naxsi学习模式。 这意味着没有请求实际被阻止。 只有在Nginx错误日志中出现安全异常。 这样的非阻塞初始行为是重要的,因为默认规则是相当积极的。 之后,根据这些例外情况,我们将为合法流量创建白名单。
  • SecRulesEnabled -为服务器块/位置启用Naxsi。 同样,您可以通过取消注释一个站点的站点的一部分或者禁用Naxsi SecRulesDisabled
  • DeniedUrl - URL到拒绝的请求将被内部发送。 这是唯一应该更改的设置。 您可以使用现成的50x.html默认文档根目录(内发现错误页面/usr/share/nginx/html/50x.html ),或者你可以创建自己的自定义错误页。
  • CheckRule -设置门槛不同的计数器。 一旦该阈值通过(例如,SQL计数器为8个点),请求将被阻塞。 为了使这些规则更具侵略性,减小它们的值,反之亦然。

文件naxsi.rules具有基于每个位置的基础为一个服务器块被装载。 让我们来加载它的根位置( /默认的服务器块)。 首先打开服务器模块的配置文件/etc/nginx/sites-enabled/default

sudo nano /etc/nginx/sites-enabled/default

然后,找到根位置/ ,并确保它看起来是这样的:

    location / {
            # First attempt to serve request as file, then
            # as directory, then fall back to displaying a 404.
            try_files $uri $uri/ =404;
            # Uncomment to enable naxsi on this location
            include /etc/nginx/naxsi.rules;
    }

警告:请务必在末尾添加分号include for语句naxsi.rules因为没有这样的默认。 因此,如果只取消注释语句,配置中将会出现语法错误。

一旦你做了上面的改变,你可以重新加载Nginx使更改生效:

sudo service nginx reload

下一步解释了如何检查更改是否成功以及如何读取日志。

第3步 - 检查日志

为了确保Naxsi工作,即使仍然处于学习模式,让我们访问一个应该抛出异常并观察异常的错误日志的URL。

我们稍后会看到这条规则是如何工作的。 现在,尾部的Nginx的错误日志查找异常(的-f选项保持开放的输出,并追加新的内容吧:

sudo tail -f /var/log/nginx/error.log

尝试在URL来访问你的Droplethttp:// Your_Droplet_IP /index.html?asd=---- 这应该触发Naxsi安全异常,因为破折号用于SQL中的注释,因此被认为是SQL注入的一部分。

在输出sudo tail -f /var/log/nginx/error.log ,您现在应该看到下面的新内容:

Output of nginx's error log2015/11/14 03:58:35 [error] 4088#0: *1 NAXSI_FMT: ip=X.X.X.X&server=Y.Y.Y.Y&uri=/index.html&learning=1&total_processed=24&total_blocked=1&zone0=ARGS&id0=1007&var_name0=asd, client: X.X.X.X, server: localhost, request: "GET /index.html?asd=---- HTTP/1.1", host: "Y.Y.Y.Y"

上述生产线的最重要的部分是强调: zone0=ARGS&id0=1007&var_name0=asd 它为您提供区域(请求的部分),触发规则的ID和可疑请求的变量名称。

此外, XXXX就是你的本地计算机的IP,而YYYY是你Droplet的IP。 该URI还包含请求(的文件名index.htm ),事实上Naxsi仍然在学习模式(工作learning=1 ),并且所有处理的请求(总数total_processed=24 )。

此外,上述行之后,应该遵循一个关于重定向到消息DeniedUrl

Output of nginx's error log2015/11/14 03:58:35 [error] 4088#0: *1 rewrite or internal redirection cycle while internally redirecting to "/50x.html" while sending response to client, client: X.X.X.X, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "Y.Y.Y.Y", referrer: "http://Y.Y.Y.Y/index.html?asd=----"

当Naxsi处于学习模式时,此重定向将仅显示在日志中,但不会实际发生。

CTRL-C退出tail和停止错误日志文件的输出。

稍后,我们将更多地了解Naxsi的规则,然后对这些日志有基本的了解是很重要的。

第4步 - 配置Naxsi规则

Naxsi配置的最重要的部分是它的规则。 有两种类型的规则 - 主规则和基本规则。 的主要规则(通过鉴定MainRule )将用于服务器全局应用,并且因此所述的部分http主Nginx的配置的框。 它们包含用于检测恶意活动的通用签名。

基本规则(由确定BasicRule )是主要用于白名单误报特征码和规则。 它们根据每个位置应用,因此应该是服务器块(vhost)配置的一部分。

让我们与主要规则入手,看看在提供的默认的nginx-naxsi包中的文件/etc/nginx/naxsi_core.rules 这里是一个示例行:

/etc/nginx/naxsi_core.rules
...
MainRule "str:--" "msg:mysql comment (--)" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:4" id:1007;
...

从上面的规则,我们可以概述以下部分,它们是普遍的,并且在每个规则中存在:

  • MainRule是开始与每一个规则的指令。 类似地,每个规则以规则的id号结束。
  • str:在规则的第二部分中找到。 如果它是str:这意味着该签名将纯字符串,按照上述的例子。 正则表达式可以用指令来也符合rx:
  • msg:给出了一些澄清规则。
  • mz:表示比赛区,或请求的哪一部分将被检查。 这可以是正文,URL,参数等。
  • s:确定当发现签名将被分配的得分。 比分被添加到不同的柜台,如SQL (SQL攻击), RFI (远程文件包含攻击)等。

基本上,上述规则( id 1007 )与评论mysql comments意味着如果串--在一个请求(体,参数等)的任何部分被发现,4分将被添加到SQL计数器。

如果我们回到例子URI( http:// Your_Droplet_IP /index.html?asd=----触发在日志中的SQL除外),你会发现,触发规则1007,我们需要2双破折号( -- 这是因为对于每一对,我们得到4点,SQL链需要8点来阻止请求。 因此,只有一对破折号不会有问题,在大多数情况下,合法流量不会受到影响。

一个特殊规则指令是negative 如果签名不匹配,则应用分数,即您怀疑请求中的某些内容丢失时的怀疑活动。

例如,让我们来看看与规则id 1402在同一文件/etc/nginx/naxsi_core.rules

/etc/nginx/naxsi_core.rules
...
MainRule negative "rx:multipart/form-data|application/x-www-form-urlencoded" "msg:Content is neither mulipart/x-www-form.." "mz:$HEADERS_VAR:Content-type" "s:$EVADE:4" id:1402;
...

上述规则意味着4分将被添加到逃避柜台,如果Content-type请求头既没有multipart/form-data ,也不是application/x-www-form-urlencoded在里面。 这条规则是怎么也正则表达式的一个例子( rx:可以被用于签名的描述。

第5步 - 白名单规则

默认的Naxsi规则几乎肯定会阻止您的网站上的一些合法流量,特别是如果您有一个复杂的Web应用程序支持各种用户交互。 这就是为什么有白名单来解决这样的问题。

白名单是用第二种类型的规则,Naxsi的基本规则创建的。 使用基本规则,您可以将整个规则或其中的一部分列入白名单。

为了演示基本规则的工作原理,让我们回到SQL注释规则(id 1007)。 试想一下,你有文件名两个破折号,如文件some--file.html您的网站。 使用规则1007,此文件将增加具有4点的SQL计数器。 这个文件名和结果分数不足以阻止请求,但它仍然是一个假阳性,可能会导致问题。 例如,如果我们还有一个带有两个破折号的参数,那么请求将触发规则1007。

要测试它,尾部的错误日志像之前一样:

sudo tail -f /var/log/nginx/error.log

尝试访问http:// Your_Droplet_IP /some--file.html?asd=-- 您不需要在您的网站上有此文件进行测试。

您应该在错误日志的输出中看到类似于此的常见异常:

Output of nginx's error log2015/11/14 14:43:36 [error] 5182#0: *10 NAXSI_FMT: ip=X.X.X.X&server=Y.Y.Y.Y&uri=/some--file.html&learning=1&total_processed=10&total_blocked=6&zone0=URL&id0=1007&var_name0=&zone1=ARGS&id1=1007&var_name1=asd, client: X.X.X.X, server: localhost, request: "GET /some--file.html?asd=-- HTTP/1.1", host: "Y.Y.Y.Y"

CTRL-C停止显示错误日志输出。

为了解决这个假阳性触发器,我们需要一个白名单,看起来像这样:

BasicRule wl:1007 "mz:URL";

重要的关键词是wl白名单,其次是规则ID。 为了更准确地说明我们列入白名单,我们还指定了匹配区域 - 网址。

要应用此白名单,请先为白名单创建新文件:

sudo nano /etc/nginx/naxsi_whitelist.rules

然后,将规则粘贴到文件中:

/etc/nginx/naxsi_whitelist.rules
BasicRule wl:1007 "mz:URL";

如果您有其他白名单,他们也可以进入这个文件,每一个在一个新的行。

具有白名单的文件必须包含在服务器块中。 要将其包括在默认服务器块中,请再次使用nano:

sudo nano /etc/nginx/sites-enabled/default

然后添加新的包括紧接着上一个为Naxsi像这样:

/ etc / nginx / sites-enabled / default

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
                # Uncomment to enable naxsi on this location
                include /etc/nginx/naxsi.rules;
                include /etc/nginx/naxsi_whitelist.rules;
        }

要使此更改生效,请重新加载Nginx:

sudo service nginx reload

现在,如果你再试一次相同的请求在您的浏览器Your_Droplet_IP /some--file.html?asd=--只有asd参数相当于两个破折号会引发4分的SQL计数器,但不常见文件名不会。 因此,您不会在错误日志中看到此请求作为异常。

写所有必要的白名单可能是一个单调乏味的任务和自己的科学。 这就是为什么在一开始,你可以使用现成的Naxsi白名单 对于大多数流行的Web应用程序,有这样的。 你只需要下载它们,并将它们包含在服务器块中,就像我们刚才那样。

确定错误日志中没有看到合法请求的任何例外情况后,可以禁用Naxsi的学习模式。 为此目的打开文件/etc/nginx/naxsi.rules纳米:

sudo nano /etc/nginx/naxsi.rules

注释掉LearningMode加入指令#在它前面的是这样的性格:

/etc/nginx/naxsi.rules
...
#LearningMode;
SecRulesEnabled;
#SecRulesDisabled;
...

最后,重新加载Nginx使更改生效:

sudo service nginx reload

现在,Naxsi将阻止任何可疑的请求,您的网站将更安全。

结论

这是多么容易与Nginx和Naxsi有一个Web应用程序防火墙。 这足够了一个开始,希望你会有兴趣了解更多的强大的Naxsi模块提供。 现在你可以使你的Nginx服务器不仅快,而且安全。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏