04.NAXSI安装测试与简介


最后更新时间:2018-11-15 11:09:51 +0800

NAXSI安装测试与简介

一、安装和测试

安装环境Ubuntu Server 16.04。

1、安装ElasticSearch和Kibana作为日志存储和展示工具。

ubuntu环境首先安装jdk:

apt install openjdk-8-jre-headless

ElasticSearch和Kibana官方当前最新版本为6.4.2,但是nxapi工具目前只能支持到5.x系列,所以从官网https://www.elastic.co/downloads/past-releases ,分别找到Kibana和ElasticSearch的5.6.12版本的下载链接。然后下载、安装如下:

wget https://artifacts.elastic.co/downloads/kibana/kibana-5.6.12-linux-x86_64.tar.gz
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.12.tar.gz
tar zxf elasticsearch-5.6.12.tar.gz
tar zxf kibana-5.6.12-linux-x86_64.tar.gz

配置和启动ElasticSearch

ElasticSearch默认需要使用非root用户运行,所以:

chown -R linux:linux kibana-5.6.12-linux-x86_64/ elasticsearch-5.6.12/
su linux

修改ElasticSearch配置参数:

cd elasticsearch-5.6.12 && vi config/elasticsearch.yml
将参数修改为:
network.host: 0.0.0.0
http.port: 9200

增大max_map_count内核参数,然后启动服务:

sudo sysctl -w vm.max_map_count=262144
./bin/elasticsearch &

验证节点是否启动正常:

curl 127.0.0.1:9200/_cat/nodes?pretty
172.18.42.126 2 96 9 0.67 0.53 0.28 mdi * dYtak9q

配置和启动Kibana

cd ../kibana-5.6.12-linux-x86_64/
vi config/kibana.yml

将参数修改为:

server.port: 5601
server.host: "0.0.0.0"
elasticsearch.url: "http://localhost:9200"

启动服务:

./bin/kibana &

通过浏览器访问 http://172.18.42.126:5601 来验证服务是否启动正常。

2、安装 Nginx和NAXSI

从http://nginx.org/en/download.html 下载nginx源码包:

wget http://nginx.org/download/nginx-1.14.0.tar.gz

从https://github.com/nbs-system/naxsi/releases 下载naxsi:

wget https://github.com/nbs-system/naxsi/archive/0.56.tar.gz

编译安装

tar zxf nginx-1.14.0.tar.gz
mv 0.56.tar.gz naxsi-0.56.tar.gz && tar zxf naxsi-0.56.tar.gz ; 
cd nginx-1.14.0
./configure --prefix=/opt/naxsi/ --add-module=../naxsi-0.56/naxsi_src/ --with-http_ssl_module \
 --without-mail_pop3_module --without-mail_smtp_module \
 --without-mail_imap_module --without-http_uwsgi_module \
 --without-http_scgi_module
make && make intall

通过上面这种方式,直接将NAXSI编译进nginx中;也可以通过—add-dynamic-module添加NAXSI模块,将NAXSI编译为so库,然后在nginx配置文件中通过load_module /path/to/module.so;加载NAXSI功能;

配置

将NAXSI的默认配置拷贝到nginx配置目录

cp ../naxsi-0.56/naxsi_config/naxsi_core.rules  /opt/naxsi/conf/naxsi_core.rules

创建存储naxsi告警日志的文件

cd /opt/naxsi
touch logs/naxsi.log 

新建配置文件

vi conf/naxsi.conf

添加如下内容:

SecRulesEnabled;
LearningMode;
DeniedUrl "50x.html";
CheckRule "$SQL >= 8" BLOCK;
CheckRule "$XSS >= 8" BLOCK;
error_log /opt/naxsi/logs/naxsi.log;

编辑nginx默认配置文件:

vi conf/nginx.conf

首先更改监听端口为8011,然后在http部分添加:

include       /opt/naxsi/conf/naxsi_core.rules;

在server的location部分添加:

include naxsi.conf;

启动服务:

./sbin/nginx

验证nginx服务是否启动正常:

curl 172.18.42.126:8011/

3、测试NAXSI的检测功能

在一个终端中执行 tail -f /opt/naxsi/logs/naxsi.log 以实时查看NAXSI的日志。

在其他终端发起正常请求 curl 172.18.42.126:8011/ 在日志终端中没有任何输出。

在其他终端发起一个XSS测试请求:

curl ‘172.18.42.126:8011/?a=<'

可以看到在日志终端中,实时显示出了NAXSI的一条告警日志:

2018/10/09 02:49:54 [error] 17938#0: *4 NAXSI_FMT: ip=172.18.42.77&server=172.18.42.126&uri=/&learning=1&vers=0.56&total_processed=4&total_blocked=1&block=1&cscore0=$XSS&score0=8&zone0=ARGS&id0=1302&var_name0=a, client: 172.18.42.77, server: localhost, request: "GET /?a=< HTTP/1.1", host: "172.18.42.126:8011"

多次发起XSS测试请求,以便制造更多的告警日志:

curl ‘172.18.42.126:8011/test1?a=<111111111111'
curl ‘172.18.42.126:8011/tset1?a=<222222222222’
curl ‘172.18.42.126:8011/test3?a=<333333333333’
curl ‘172.18.42.126:8011/test3?a=<444444444444’
curl ‘172.18.42.126:8011/test3?a=<555555555555'

4、将告警日志输出到ElasticSearch并在Kibana显示

上面已经将告警日志直接存储在 /opt/naxsi/logs/naxsi.log 文件中; 进入NAXSI的源代码目录中:

cd naxsi-0.56/nxapi

安装nxtool.py依赖的elasticsearch接口驱动:

pip install elasticsearch

编辑配置文件

源代码目录中 nxapi.json 文件是 nxtool.py 执行时的配置文件,复制一份并编辑:

cp nxapi.json mytest.json
vi mytest.json

修改elasticsearch的版本配置为5:

"version" : "5"

删除其中syslogd相关的部分; 修改naxsi的配置为:

"naxsi" : {
 "rules_path" : "/opt/naxsi/conf/naxsi_core.rules"
},

导入数据

删除旧索引:
curl -XDELETE 127.0.0.1:9200/nxapi
 
建立新索引:
curl -XPUT 127.0.0.1:9200/nxapi

将naxsi的告警日志存储进ElasticSearch:
python nxtool.py -c mytest.json  —files=/opt/naxsi/logs/naxsi.log

检查ElasticSearch中数据状态,并做汇总分析输出:
python nxtool.py -c mytest.json -x

验证是否存在nxapi索引:
curl 127.0.0.1:9200/_cat/indices/?pretty

查看索引中的内容:
curl 127.0.0.1:9200/nxapi/_search?pretty

从浏览器访问Kibana,配置Index pattern为nxapi,即可在Discover中看到数据。

二、NAXSI和nxapi/nxtool

NAXSI

Naxsi是一个第三方Nginx模块,提供WAF功能,NAXSI是“Nginx Anti XSS & SQL Injection”的缩写。

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

NAXSI的核心规则文件是naxsi_core.rules,此文件包含了用于检测恶意攻击的通用签名。通常在nginx配置文件的http部分include这个文件;

另外我们还需要制定我们在自己的策略文件:如上述安装过程的naxsi.conf文件,这个文件包含了具体的防护策略,其中的一些内容如下:

LearningMode;
SecRulesEnabled;
DeniedUrl "/50x.html";

CheckRule "$SQL >= 8" BLOCK; #策略,当一个请求中SQL注入的分值大于等于8的时候则阻断请求,下面的类似
CheckRule "$RFI >= 8" BLOCK;
CheckRule "$TRAVERSAL >= 4" BLOCK;
CheckRule "$EVADE >= 4" BLOCK;
CheckRule "$XSS >= 8" BLOCK;

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

LearningMode -启动Naxsi学习模式,只记录,不拦截;只会在Nginx错误日志中出现安全异常日志,而不会阻断请求;这样的非阻塞初始行为是有用的,因为默认规则非常积极可能会产生很多误报;之后,根据这些例外情况(误报),我们将为合法流量创建白名单 SecRulesEnabled -为server块或位置启用Naxsi SecRulesDisabled -为server块或位置禁用Naxsi DeniedUrl -被拒绝的请求将被内部转发到这里配置的位置。类似50x文件。 CheckRule -设置阈值计数器,一旦达到该阈值(例如,SQL计数器为8分),请求将被阻塞

可以在任意location中引用上述策略配置,需要注意,NAXSI的配置需要在location配置的第一行; include /path/to/naxsi.rules;

规则定义了匹配什么,匹配后如何打分; 策略定义了是否开启拦截,以及对特定攻击的拦截阀值;

Naxsi规则

Naxsi配置的最重要的部分是它的规则。 有两种类型的规则 —— 主规则和基本规则: 主规则(MainRule)将用于server全局,包含用于检测恶意活动的通用签名 基本规则(BasicRule)是主要用于白名单误报特征码和其他规则,应用于某个location

下面是一个MainRule的例子:

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

MainRule 是每一个规则的起始指令,类似地,每个规则以id号结束 str:在规则的第二部分中,str:意味着该签名是纯字符串;正则表达式可以用指令rx: msg:给出了一些说明信息 mz:表示match zone,即请求的哪一部分将被检查,这可以是正文,URL,参数等 s:确定匹配后给某个变量分配的得分。得分被添加到不同的变量,如SQL(SQL攻击),RFI(远程文件包含攻击)等

上述规则(id 1007)与注释”mysql comments”意味着如果字符串”–“在一个请求(体,参数等)的任何部分被发现,SQL变量加4分;

请求URI( http://Your_IP/index.html?asd=—- 触发SQL注入告警),你会发现,触发规则1007 我们需要4个破折号( – )这是因为对于每一对,我们得到4分,SQL链需要8分来阻止请求。因此,只有一对破折号不会有问题,在大多数情况下,合法流量不会受到影响。

上述签名规则的意思是:如果在请求中出现连续的两个中横线,则SQL计数增加4分;

一个特殊规则指令是negative 。 如果签名不匹配,则增加某变量的分数。

看另外一个例子:

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;

上述规则意思是:如果Content-type请求头既不是multipart/form-data ,也不是application/x-www-form-urlencoded,则匹配(因为有negative),则将EVADE变量加4分。

白名单规则

白名单是用第二种类型的规则,Naxsi的BasicRule创建的;使用基本规则,可以将已有的另外一个规则的全部或其中一部分列入白名单。

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

请求 http://Your_IP/some–file.html?asd=–

您应该在错误日志的输出中看到类似于下面的信息:

2015/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"

为了解决这个误报,我们需要一个白名单,看起来像这样:

BasicRule wl:1007 “mz:URL”; 重要的关键词是wl白名单,其次是规则ID,还指定了匹配区域为URL部分; 这句话的意思是:匹配规则1007的请求,如果匹配到的区域是URL部分,则放过这个请求,即认为这个请求是合法的,不做计数器分值处理。

要应用此白名单,请先为白名单创建新文件: vi /etc/nginx/naxsi_whitelist.rules 然后,将规则粘贴到文件中: BasicRule wl:1007 “mz:URL”; 如果还有其他白名单,可以一起放在这个文件内,每个一行;

将定义白名单的文件包含到配置中: vi /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_IP/some–file.html?asd=– 只有asd参数相当于两个破折号会引发4分的SQL计数,但文件名不会;因此,不会在错误日志中看到异常请求

确定错误日志中没有合法请求后,可以禁用Naxsi的学习模式: 注释掉LearningMode,在指令前加入#即可:

#LearningMode;
SecRulesEnabled;
#SecRulesDisabled;

最后重新加载Nginx使更改生效: service nginx reload 现在,Naxsi将阻止任何可疑的请求.

在nginx的每个server段加入 set $naxsi_extensive_log 1; 开启naxsi的扩展日志记录功能,可以记录下具体触发naxsi拦截规则的请求内容,方便后续分析拦截的是攻击请求还是误拦了正常的业务请求。

nxapi/nxtool

nxapi/nxtool的主要功能: 将NAXSI Events导入到elasticsearch中; 生成白名单; Event管理; 对数据库中的信息生产报告;

配置文件 nxtool的配置信息存储在一个json文件中,源代码目录中包含了一个默认的配置文件nxapi.json。

如果要将NAXSI的Event导入Elasticsearch,需要提前配置好Elasticsearch。 常用命令: ./nxtool.py -c nxapi.json —files=/PATH/TO/LOGFILE.LOG #将log文件中的Event导入到ElasticSearch中。 ./nxtool.py -c nxapi.json -x #nxtool从ElasticSearch中读出信息并做汇总统计分析,然后输出 nxtool同时也支持从FIFO管道文件读入信息转存到ElasticSearch,只需要把naxsi/nginx日志指向对应的管道文件即可。

×

订阅

最新的教程直接发送到您的收件箱。