如何在 Ubuntu 14.04 上安装和配置 Naxsi

介绍

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

Naxsi 具有灵活性和强大功能,您可以使用易于使用的规则用于受欢迎的 Web 应用程序,如 WordPress. 同时,您还可以使用 Naxsi 的学习模式创建自己的规则并精心调整它们。

Naxsi 类似于 ModSecurity for Apache。因此,如果您已经熟悉 ModSecurity 和/或正在寻找 Nginx 的类似功能,Naxsi 肯定会对您感兴趣。

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

前提条件

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

除非另有说明,本教程中需要 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 模块所提供的更多信息感兴趣。

Published At
Categories with 技术
comments powered by Disqus