介绍
Naxsi 是一个第三方 Nginx 模块,提供 Web 应用程序防火墙功能,为您的 Web 服务器带来额外的安全性,并保护您免受各种 Web 攻击,如 XSS 和 SQL 注射。
Naxsi 具有灵活性和强大功能,您可以使用易于使用的规则用于受欢迎的 Web 应用程序,如 WordPress. 同时,您还可以使用 Naxsi 的学习模式创建自己的规则并精心调整它们。
Naxsi 类似于 ModSecurity for Apache。因此,如果您已经熟悉 ModSecurity 和/或正在寻找 Nginx 的类似功能,Naxsi 肯定会对您感兴趣。
本教程将向您展示如何安装Naxsi,了解规则,创建白名单,以及在哪里找到已经为常用的Web应用程序编写的规则。
前提条件
在遵循本教程之前,请确保您完成以下先决条件:
- 一个 Ubuntu 14.04 Droplet
- 一个非 root sudo 用户. 查看 初始服务器设置与 Ubuntu 14.04 有关详细信息。
除非另有说明,本教程中需要 root 特权的所有命令都应该作为具有 sudo 特权的非 root 用户运行。
步骤 1 - 安装 Naxsi
要安装 Naxsi,您将需要安装一个与它编译的 Nginx 服务器. 为此,您将需要包 nginx-naxsi
. 您可以通过 apt-get
命令以常见的 Ubuntu 方式安装它:
1sudo apt-get update
2sudo apt-get install nginx-naxsi
这将安装 Naxsi 以及 Nginx 及其所有依赖,并确保该服务在 Droplet 上自动启动和停止。
<$>[注] 注: 如果您已经安装了 Nginx 没有 Naxsi,您将需要用「nginx-core」或您可能拥有的其他 Nginx 味道代替「nginx-naxsi」。
在大多数情况下,用nginx-naxsi替换nginx-core
不是一个问题,你可以继续使用以前的配置,但在升级时,先创建现有/etc/nginx/
目录的备份,这是一个很好的想法。
默认安装 Nginx 提供了基本的,工作 Nginx 环境,这足以熟悉 Naxsi. 我们不会花时间定制 Nginx,但我们会直接去配置 Naxsi. 但是,如果你没有经验与 Nginx 这是一个好主意检查 如何安装 Nginx 在 Ubuntu 14.04 LTS及其相关文章,特别是 如何设置 Nginx 服务器块 (虚拟主机) 在 Ubuntu 14.04 LTS。
步骤2 - 启用 Naxsi
首先,要启用 Naxsi,我们必须加载在文件中发现的核心规则 /etc/nginx/naxsi_core.rules
. 此文件包含用于检测恶意攻击的通用签名. 我们将稍后更详细地讨论这些规则。 目前,我们只会在 HTTP 倾听器部分中包含 Nginx 主配置文件 /etc/nginx/nginx.conf
的规则。
1sudo nano /etc/nginx/nginx.conf
然后找到http
部分,并通过在行开始时删除#
字符来删除纳克西的规则的包括部分。
1[label /etc/nginx/nginx.conf]
2http {
3...
4 # nginx-naxsi config
5 ##
6 # Uncomment it if you installed nginx-naxsi
7 ##
8
9 include /etc/nginx/naxsi_core.rules;
10...
保存文件并离开编辑器。
其次,我们必须启用以前的规则,并为 Naxsi 配置一些基本选项. 默认情况下,基本的 Naxsi 配置位于 `/etc/nginx/naxsi.rules’ 文件中。
1sudo nano /etc/nginx/naxsi.rules
只将DeniedUrl
的值更改为默认存在的错误文件,其余部分保持不变:
1[label /etc/nginx/naxsi.rules]
2# Sample rules file for default vhost.
3LearningMode;
4SecRulesEnabled;
5#SecRulesDisabled;
6DeniedUrl "/50x.html";
7
8## check rules
9CheckRule "$SQL >= 8" BLOCK;
10CheckRule "$RFI >= 8" BLOCK;
11CheckRule "$TRAVERSAL >= 4" BLOCK;
12CheckRule "$EVADE >= 4" BLOCK;
13CheckRule "$XSS >= 8" BLOCK;
保存文件和退出。
以下是上面的配置指令及其含义:
- 'LearningMode' - 在学习模式下启动 Naxsi. 这意味着没有请求实际上会被阻止. 只有安全例外将在 Nginx 错误日志中提出。 这种不阻止的初始行为很重要,因为默认规则相当激进。 后来,基于这些例外,我们将创建合法流量白名单。
- 'SeculesEnabled' - 启用 Naxsi 用于服务器块 / 位置。 同样,您可以通过不评论 'SecRulesDisabled' 或网站的一部分而禁用 Naxsi。
- 'DeniedUrl' - 拒绝请求的 URL 将被内部发送。 这是您应该更改的唯一设置。 您可以使用易于使用的 `50x.html 错误页
文件 naxsi.rules
必须按服务器块按位置加载. 让我们将其加载到默认服务器块的根位置(/
) 首先打开服务器块的配置文件 /etc/nginx/sites-enabled/default
:
1sudo nano /etc/nginx/sites-enabled/default
然后,找到根位置 /
并确保它看起来像这样:
1location / {
2 # First attempt to serve request as file, then
3 # as directory, then fall back to displaying a 404.
4 try_files $uri $uri/ =404;
5 # Uncomment to enable naxsi on this location
6 include /etc/nginx/naxsi.rules;
7 }
<$>[警告]
警告: 请确保在包括
声明的末尾添加一个半字符号,因为默认情况下没有。
一旦您完成了上述更改,您可以重新加载 Nginx,以便更改生效:
1sudo service nginx reload
下一步解释了如何检查更改是否成功,以及如何阅读日志。
步骤3 - 检查日志
为了确保 Naxsi 工作,即使仍处于学习模式,让我们访问一个应该投放例外的 URL,并查看该例外的错误日志。
现在,尾巴 Nginx 的错误日志以找到例外(‘-f’ 选项保持输出打开并附加新内容:
1sudo tail -f /var/log/nginx/error.log
尝试访问您的Droplet在URL http://Your_Droplet_IP/index.html?asd=----
. 这应该引发一个Naxsi安全例外,因为Dashes用于SQL中的评论,因此被认为是SQL注射的一部分。
在sudo tail -f /var/log/nginx/error.log
的输出中,你现在应该看到以下新内容:
1[secondary_label Output of nginx's error log]
22015/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和可疑请求的变量名称。
此外,‘X.X.X.X.X’是您本地计算机的 IP,而‘Y.Y.Y.Y’是您的 Droplet 的 IP. URI 还包含请求的文件名称(‘index.htm’),纳克西仍处于学习模式(‘learning=1’),以及所有处理请求的总数(‘total_processed=24’)。
此外,在上面的行之后,应该有关于重定向到DeniedUrl
的消息:
1[secondary_label Output of nginx's error log]
22015/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
,退出尾巴
,停止输出错误日志文件。
稍后,我们将更多地了解纳克西的规则,然后对日志有这个基本的理解是很重要的。
步骤 4 – 配置 Naxsi 规则
Naxsi 的配置中最重要的部分是其规则. 有两种类型的规则 - 主要规则和基本规则. 主要规则(由MainRule
识别)适用于服务器,因此是主要 Nginx 配置的http
块的一部分. 它们包含通用签名用于检测恶意活动。
基本规则(通过BasicRule
识别)主要用于白列表虚假正面的签名和规则,它们按位置应用,因此应该是服务器块(vhost)配置的一部分。
让我们从主要规则开始,看看在文件 /etc/nginx/naxsi_core.rules 中的
nginx-naxsi` 包提供的默认规则。
1[label /etc/nginx/naxsi_core.rules]
2...
3MainRule "str:--" "msg:mysql comment (--)" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:4" id:1007;
4...
从上面的规则中,我们可以概述以下部分,这些部分是普遍的,并且在每个规则中都存在:
同样,每个规则都以规则的ID号结尾。
str:
在规则的第二部分中找到。如果它是str:
,则意味着签名将是一个简单的字符串,如上面的例子所示。 规则表达式也可以与规则rx:
匹配。msg:
给出有关规则的一些澄清。mz:
表示匹配区域,或者将检查请求的哪个部分。
基本上,上面的规则(‘id 1007’)与评论mysql评论
意味着如果在请求的任何部分(体,参数等)中找到字符串--
,则将添加4个点到SQL计数器中。
如果我们回到例子 URI (http://Your_Droplet_IP/index.html?asd=----
) 触发了 SQL 例外在日志中,你会注意到,要触发 1007 规则,我们需要 2 对 dash (--
) 。 这是因为每对我们得到 4 点,SQL 链需要 8 点来阻止请求。
一个特殊的规则指令是负面
。如果签名不匹配,它适用于分数,即当请求中缺少某些东西时,您怀疑恶意活动。
例如,让我们从相同的文件 /etc/nginx/naxsi_core.rules
中看一个有 id 1402
的规则:
1[label /etc/nginx/naxsi_core.rules]
2...
3MainRule 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...
上面的规则意味着如果内容类型
请求标题中没有多部分/形式数据
或应用程序/x-www-form-urlencoded
,则将添加4个点到EVADE计数器中。
第五步:白名单规则
默认的Naxsi规则几乎肯定会阻止您网站上的一些合法流量,特别是如果你有一个复杂的Web应用程序,支持各种用户互动,这就是为什么有白名单来解决这些问题的原因。
白列表是用第二种类型的规则创建的,纳克西的基本规则. 有了基本规则,你可以白列表整个规则或部分规则。
要证明基本规则是如何工作的,让我们回到 SQL 评论规则(id 1007). 想象一下,您在您的网站上有一个文件中有两个字符串,例如 some--file.html
. 有了 1007 规则,这个文件将增加 SQL 计数 4 点。 单独这个文件名和结果的分数是不够的来阻止请求,但它仍然是一个错误的阳性,可能导致问题。
要测试它,请跟上错误日志,就像以前一样:
1sudo tail -f /var/log/nginx/error.log
尝试访问 `http://Your_Droplet_IP/some--file.html?asd=--. 你不需要在你的网站上有这个文件来测试。
您应该在错误日志的输出中看到类似于此的熟悉的例外:
1[secondary_label Output of nginx's error log]
22015/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
以停止显示错误日志输出。
为了解决这个虚假正面的触发因素,我们需要一个白名单,看起来像这个:
1BasicRule wl:1007 "mz:URL";
重要关键词是wl
为白列表,其次是规则ID. 为了更准确地说明我们正在白列表的内容,我们还指定了匹配区域 - URL。
若要应用此白列表,请先为白列表创建一个新的文件:
1sudo nano /etc/nginx/naxsi_whitelist.rules
然后将规则插入到文件中:
1[label /etc/nginx/naxsi_whitelist.rules]
2BasicRule wl:1007 "mz:URL";
如果你有其他白名单,他们也可以进入这个文件,每一个在一个新的行。
包含白名单的文件必须包含在您的服务器块中. 若要将其包含在默认服务器块中,请再次使用 nano:
1sudo nano /etc/nginx/sites-enabled/default
然后添加新的包含在前一个纳克西之后,如下:
1[label /etc/nginx/sites-enabled/default]
2
3 location / {
4 # First attempt to serve request as file, then
5 # as directory, then fall back to displaying a 404.
6 try_files $uri $uri/ =404;
7 # Uncomment to enable naxsi on this location
8 include /etc/nginx/naxsi.rules;
9 include /etc/nginx/naxsi_whitelist.rules;
10 }
要使此更改生效,请重新加载 Nginx:
1sudo service nginx reload
现在,如果您在浏览器中再次尝试同样的请求,以 Your_Droplet_IP/some--file.html?asd=--
只有等于两个盘点的 asd
参数将触发 SQL 计数器的 4 点,但不寻常的文件名不会。
编写所有必要的白名单可以是一个无聊的任务和科学本身,这就是为什么在开始时你可以使用易于使用的 Naxsi白名单。
一旦您确认在错误日志中没有看到任何合法请求的例外,您可以禁用 Naxsi 的学习模式。 为此,使用 nano 打开文件 `/etc/nginx/naxsi.rules:
1sudo nano /etc/nginx/naxsi.rules
通过在其前面添加#
字符来评论LearningMode
指令:
1[label /etc/nginx/naxsi.rules]
2...
3#LearningMode;
4SecRulesEnabled;
5#SecRulesDisabled;
6...
最后,重新加载 Nginx 以便更改生效:
1sudo service nginx reload
现在,Naxsi将阻止任何可疑的请求,您的网站将更加安全。
结论
这就是使用 Nginx 和 Naxsi 的 Web 应用程序防火墙有多么容易,这对于一个开始就足够了,希望你会对强大的 Naxsi 模块所提供的更多信息感兴趣。