介绍
Naxsi是第三方Nginx模块,提供Web应用程序防火墙功能。 它为您的Web服务器带来额外的安全性,并保护您免受各种Web攻击,如XSS和SQL注入。
Naxsi灵活强大。 您可以为流行的Web应用程序(如WordPress)使用现成的规则。 同时,您也可以使用Naxsi的学习模式创建自己的规则并微调它们。
Naxsi是类似的ModSecurity为Apache 。 因此,如果你已经熟悉ModSecurity和/或寻求类似的功能Nginx,Naxsi一定会对你感兴趣。 但是,您可能无法在Naxsi中找到所有ModSecurity的功能。
本教程将向您介绍如何安装Naxsi,了解规则,创建白名单以及在哪里可以找到为常用Web应用程序编写的规则。
先决条件
在遵循本教程之前,请确保您满足以下先决条件:
- 一个Ubuntu 14.04 Droplet
- 非root用户sudo。 退房初始服务器设置与Ubuntu 14.04的详细信息。
除非另有说明,本教程中需要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-core
与nginx-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的规则的一部分#
在该行的开头字符。 它现在应该看起来像这样:
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
到已经默认存在错误的文件,并保留其余不变:
# 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。 同样,您可以通过取消注释一个站点的站点的一部分或者禁用NaxsiSecRulesDisabled
。 -
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
。 这里是一个示例行:
...
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
:
...
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
然后,将规则粘贴到文件中:
BasicRule wl:1007 "mz:URL";
如果您有其他白名单,他们也可以进入这个文件,每一个在一个新的行。
具有白名单的文件必须包含在服务器块中。 要将其包括在默认服务器块中,请再次使用nano:
sudo nano /etc/nginx/sites-enabled/default
然后添加新的包括紧接着上一个为Naxsi像这样:
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
加入指令#
在它前面的是这样的性格:
...
#LearningMode;
SecRulesEnabled;
#SecRulesDisabled;
...
最后,重新加载Nginx使更改生效:
sudo service nginx reload
现在,Naxsi将阻止任何可疑的请求,您的网站将更安全。
结论
这是多么容易与Nginx和Naxsi有一个Web应用程序防火墙。 这足够了一个开始,希望你会有兴趣了解更多的强大的Naxsi模块提供。 现在你可以使你的Nginx服务器不仅快,而且安全。