[nginx]-nginx 安装naxsi模块

nginx 安装naxsi模块

 

如果需要 替换yum源为阿里源

 

查询已安装的yum

rpm -qa | grep yum

 

使用root权限卸载已安装的yum源

rpm -qa | grep yum | xargs rpm -e --nodeps

三、下载并安装阿里的yum源rpm包

 

创建安放rpm包的文件夹

cd /etc/yum.repos.d/

mkdir yum-rpm && cd yum-rpm

 

# 下载rpm包

 

wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-metadata-parser-1.1.4-10.el7.x86_64.rpm

wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-3.4.3-161.el7.centos.noarch.rpm

wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.31-50.el7.noarch.rpm

wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-utils-1.1.31-50.el7.noarch.rpm

wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/python-urlgrabber-3.10-9.el7.noarch.


 

安装rpm包

cd /etc/yum.repos.d/yum-rpm

rpm -ivh *.rpm  --force --nodeps

 

下载阿里镜像到/etc/yum.repos.d/目录下

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

 

修改Centos-7.repo文件将所有$releasever替换为7

vim /etc/yum.repos.d/CentOS-Base.repo

 

:%s/$releasever/7/g

 

运行以下命令

 

yum clean all

yum makecache

yum update

 

yum -y install gcc gcc-c++ autoconf automake make

yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel

yum -y install GeoIP GeoIP-devel GeoIP-data

 

 

 

 

安装nginx

cd /tmp

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

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

tar zxvf nginx-1.14.2.tar.gz

tar zxvf 0.55.3.tar.gz  -C /usr/local

cd nginx-1.14.2

./configure   --add-module=/usr/local/naxsi-0.55.3/naxsi_src/ --with-http_ssl_module  --with-http_stub_status_module --with-http_flv_module --with-http_gzip_static_module --with-http_realip_module

#如果已经安装nginx  则只需要执行make 然后覆盖nginx二级制文件即可

make &&make install

cd /usr/local/nginx/conf

touch naxsi.rules

在naxsi.rules中加入以下规则

#LearningMode  启用学习模式,即拦截请求后不拒绝访问,只将触发规则的请求写入error_log选项定义的文件中。如果对规则产生的影响不太清楚,可以先设置为学习模式。启用学习模式不能起到拦截非法请求的防御的效果。建议先使用学习模式,规则测试完成后再启用拦截模式。这样可以避免出现对网站、服务器某些不可知的影响。

#SecRulesEnabled|SecRulesDisabled

SecRulesEnabled;      #启用Naxsi模块

DeniedUrl "/RequestDenied";     #拒绝的请求发送到内部URL

#check rules  设置各规则不同的触发阈值。 一旦该阈值触发,请求将被阻塞。

CheckRule "$SQL >= 8" BLOCK;

CheckRule "$RFI >= 8" BLOCK;

CheckRule "$TRAVERSAL >= 4" BLOCK;

CheckRule "$EVADE >= 4" BLOCK;

CheckRule "$XSS >= 8" BLOCK;

#naxsi log

error_log        logs/naxsi.log;    #nginx相对路径都是相对于根目录

 

1 配置方法通过文件更改,在location下添加include naxsi.rules;

创建ngxsi规则

 

cp -r /usr/local/naxsi-0.55.3/naxsi_config/naxsi_core.rules  ./

 

为了方便测试 我修改了nginx.conf如下

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    include  naxsi_core.rules;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {

        listen       80;

        server_name  localhost 192.168.10.96;

 

 location / {

          include naxsi.rules;

           root /ftp/www/;

                 }

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            return 418;

        }

                    location = /403.html {

                                     root   html;

                    }

location /RequestDenied {

   return 403;

  }

                    }

    }

 

 

 

 

启动nginx

/usr/local/nginx/sbin/nginx

 

http://192.168.10.96/index.html

[nginx]-nginx 安装naxsi模块_第1张图片

http://192.168.10.96/index.html?asd=----

---是sql里面注释的语法 所以会匹配上

[nginx]-nginx 安装naxsi模块_第2张图片

 

 

如果错误日志出现NAXSI_FMT的信息说明成功。

[nginx]-nginx 安装naxsi模块_第3张图片

2 通过直接把naxsi规则location中

修改nginx.conf为

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    include  naxsi_core.rules;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {

        listen       80;

        server_name  localhost 192.168.10.96;

 

 location / {

    SecRulesEnabled;

    DeniedUrl "/RequestDenied";

    CheckRule "$SQL >= 8" BLOCK;

    CheckRule "$RFI >= 8" BLOCK;

    CheckRule "$TRAVERSAL >= 4" BLOCK;

    CheckRule "$EVADE >= 4" BLOCK;

    CheckRule "$XSS >= 8" BLOCK;

    error_log /var/log/nginx/foo.log;

           root /ftp/www/;

                 }

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            return 418;

        }

                    location = /403.html {

                                     root   html;

                    }

location /RequestDenied {

   return 403;

  }

                    }

    }

 

开启学习模式  修改naxsi.rules

    SecRulesEnabled;

    LearningMode;

    DeniedUrl "/RequestDenied";

    CheckRule "$SQL >= 8" BLOCK;

    CheckRule "$RFI >= 8" BLOCK;

    CheckRule "$TRAVERSAL >= 4" BLOCK;

    CheckRule "$EVADE >= 4" BLOCK;

    CheckRule "$XSS >= 8" BLOCK;

    error_log /usr/local/nginx/logs/foo.log;

 

 

请求注入的url  返回404

nginx的日志如下

 

 

 

 

 

 

 

还可以添加白名单naxsi_BasicRule.conf   也需要再conf中include

conf/naxsi_BasicRule.conf

BasicRule wl:0 "mz:$ARGS_VAR:script";

BasicRule wl:0 "mz:$ARGS_VAR:id";

 

这表示xss攻击正常是被拦截的,若被添加白名单,则不被拦截.此处是Get参数名若为id或者script,则不被拦截.

basicrule规则参考  http://code.google.com/p/naxsi/wiki/BasicRule

 

 

 

 

白名单规则语法:
BasicRule wl:ID [negative] [mz:[$URL:target_url]|[match_zone]|[$ARGS_VAR:varname]|[$BODY_VARS:varname]|[$HEADERS_VAR:varname]|[NAME]]

wl:ID (White List ID) 哪些拦截规则会进入白名单
wl:0:把所有拦截规则加入白名单
wl:42:把ID为42的拦截规则加入白名单
wl:42,41,43:把ID为42, 41和43的拦截规则加入白名单
wl:-42:把所有拦截规则加入白名单,除了ID为42的拦截规则

mz:(Match Zones)
ARGS: GET的整个参数,如: foo=bar&in=%20
$ARGS_VAR: GET参数的参数名, 如:foo=bar&in=%20中的foo和in
$ARGS_VAR_X: 正则匹配的GET参数的参数名
HEADERS: 整个HTTP协议头
$HEADERS_VAR: HTTP协议头的名字
$HEADERS_VAR_X: 正则匹配的HTTP协议头的名字
BODY: POST的整个参数内容
$BODY_VAR: POST参数的参数名
$BODY_VAR_X: 正则匹配的POST参数的参数名
URL: URL(?前的)
URL_X: 正则匹配的URL(?前的)
FILE_EXT: 文件名 (POST上传文件时上传的文件名)

Naxsi 社区提供了一些常用的白名单规则,例如 wordpress 。可以在 https://github.com/nbs-system/naxsi-rules 下载白名单规则。

 

在使用中发现jumpserver https的请求可以通过 ,但是yearning的话 有些请求会被拦截掉。导致选择工单提交的时候下拉框为空。

 

[nginx]-nginx 安装naxsi模块_第4张图片

 

 

暂时添加了一条规则

[root@op-jumpserver01 nginx]# cat /etc/nginx/naxsi_whitelists.rules

BasicRule wl:16 ;

 

并且在nginx.conf中引入

    location / {

        include  naxsi_whitelists.rules;

        include naxsi.rules;

 

 

重新reload nginx 之后 可以了。但是规则16 是不是放的太大了。还需要研究一下

[nginx]-nginx 安装naxsi模块_第5张图片

 

 

白名单规则示例

以下对静态的白名单规则进行举例说明。

 

BasicRule wl:1000;
已知拦截规则1000是过滤包含select|union|update|delete|insert|table|from|ascii|hex|unhex之类SQL关键字的规则。
在本子规则中完全禁用拦截规则1000。因为没有指定区域,所以全部加入白名单。

BasicRule wl:1000 “mz:$ARGS_VAR:foo”;
在全部GET参数名为foo的值中禁用拦截规则1000 (即不用1000规则检查GET中参数名为foo中的值)。所以, http://127.0.0.1/?foo=select * from a 不会被过滤。

BasicRule wl:1000 “mz:$ARGS_VAR:foo|$URL:/bar”;
在URL为/bar的GET请求中参数名为foo的值中禁用拦截规则1000。所以, http://127.0.0.1/bar?foo=select * from a 不会被过滤。

BasicRule wl:1000 “mz:$URL:/bar|ARGS”;
在URL为/bar的GET请求中的参数禁用拦截规则1000。所以, http://127.0.0.1/bar?my=select * from a 不会被过滤。http://127.0.0.1/bar?from=weibo 也不会被过滤。

BasicRule wl:1000 “mz:ARGS|NAME”;
在全部GET请求中对所有参数名(只是名,不包含参数值)中禁用拦截规则1000。所以, http://127.0.0.1?from=weibo 不会被过滤。但是, http://127.0.0.1?foo=select 会被过滤(因为select属于参数值,不在白名单范围内)。

BasicRule wl:1000 “mz:$URL:/bar|ARGS|NAME”;
在URL为/bar的全部GET请求中对所有参数名(只是名,不包含参数值)中禁用拦截规则1000。所以, http://127.0.0.1/bar?from=weibo 不会被过滤。但是, http://127.0.0.1/bar?foo=select 会被过滤(因为select属于参数值,不在白名单范围内)。

BasicRule wl:0 “mz:|URL”;
在全部请求中对符合^/upload/(.).(.)$正则规则的URL禁用全部拦截规则。所以, http://127.0.0.1/upload/select.db 不会被过滤 (原本会触发1000拦截规则)。
以下对含正则表达式的白名单规则进行举例说明。

BasicRule wl:1000 “mz:$ARGS_VAR_X:meh”;
在全部GET参数名含有meh的值中禁用拦截规则1000 (即不用1000规则检查GET中参数名含有meh中的值)。所以, http://127.0.0.1/?smehe=select * from a 不会被过滤。

BasicRule wl:1000 “mz:$ARGS_VAR_X:^meh”;
在全部GET参数名以meh开始的值中禁用拦截规则1000 (即不用1000规则检查GET中参数名以meh开始的值)。所以, http://127.0.0.1/?mehe=select * from a 不会被过滤。

BasicRule wl:1000 “mz:$ARGS_VAR_X:^meh_[0-9]+$”
在全部GET参数名格式为“meh_数字”的值中禁用拦截规则1000 (即不用1000规则检查GET中参数名格式为“meh_数字”的值)。所以, http://127.0.0.1/?meh_12=select * from a 不会被过滤。

BasicRule wl:1000 “mz:$URL_X:^/foo|ARGS”;
在URL以/foo开始的GET请求中的参数禁用拦截规则1000。所以, http://127.0.0.1/foo1?my=select * from a 不会被过滤。http://127.0.0.1/foo2?from=weibo 也不会被过滤。

BasicRule wl:1000 “mz:$URL_X:/foo|$ARGS_VAR_X:[0-9]”;
在URL以/foo开始的GET请求中的以数字开始命名的参数禁用拦截规则1000。所以, http://127.0.0.1/foo1?2my=select * from a 不会被过滤。http://127.0.0.1/foo2?1from=weibo 也不会被过滤。

以下对RAW_BODY的白名单规则进行举例说明。以RAW_BODY为目标的白名单规则的编写方式与任何其他BODY规则相同。

BasicRule wl:4241 “mz:$URL:/|BODY”;
已知拦截规则4241是即便在学习模式下也要过滤RAW_BODT中包含字符串RANDOMTHINGS的规则。
在本子规则中,在URL为/的BODY中的内容禁用拦截规则4241,意味着该目录下的任意BODY内容都不会被过滤。

以下对FILE_EXT的白名单规则进行举例说明。

BasicRule wl:1337 “mz:$URL:/index.html|FILE_EXT”;
在本子规则中,在URL为/index.html的文件上传部分禁用拦截规则1337,意味着可在该目录下上传任意文件。

以下对JSON的白名单规则进行举例说明。

BasicRule wl:1302 “mz:$BODY_VAR:lol”;
JSON可被当作BODY, 以变量的形式表示文本内容。在本子规则中,对POST的参数lol禁用拦截规则1302,即以下JSON内容可以被通过。

{

    "lol" : "foo

}

 

手动编写白名单规则

以下为访问http://www.gugexueshu.com/?foo=select * from a的错误日志记录。

 

2018/08/19 13:35:16 [error] 1#0: *187 NAXSI_FMT: ip=*.*.*.*&server=www.123admin.com&uri=/&learning=0&vers=0.55.3&total_processed=116&total_blocked=1&block=1&cscore0=$SQL&score0=4&cscore1=$XSS&score1=8&zone0=ARGS&id0=1000&var_name0=foo, client: *.*.*.*, server: www.123admin.com, request: "GET /?a=select%20*%20from%20a HTTP/1.1", host: www.123admin.com

 

从zone0=ARGS可看出被过滤的区域是ARGS,从id0=1000可看出拦截规则的id是1000,从var_name0=foo可看出被过滤的变量为foo。因此可以编写如下白名单规则。

BasicRule wl:1000 "mz:$ARGS_VAR:foo";

 

 

 

 

 

 

你可能感兴趣的:(nginx)