目标:在Nginx中成功安装Naxsi模块并验证防护策略是否生效
准备环境:宿主机-Windows10系统、虚拟机-Ubantu(通过win10应用商店安装)、Nginx(在Ubantu中)、Chrome(在win10中)
目录
2.下载Naxsi、Nginx源代码、编译Nginx并替换Nginx可执行文件
1.查看当前的Nginx版本及相关文件目录
PS:本文登陆Ubantu是以非超管权限的账号登录的,所以命令前要加上sudo,然后输入超管密码即可以管理员权限操作(下同)。
sudo nginx -v
- 确认当前nginx版本为:,即,1.17.10
- 确认当前nginx的配置(nginx.conf)位置,一般在Ubantu根目录下的etc/nginx,即,/etc/niginx
- 确认当前nginx可执行文件的位置(在第2步要被新编译完的Nginx替换),一般在Ubantu根目录下的usr/sbin(该目录下还包括各种其他程序的可执行文件),即,/usr/sbin
- 可以在Ubantu系统中,用以下命令查找nginx文件和文件夹。
find / -name nginx
2.下载Naxsi、Nginx源代码、编译Nginx并替换Nginx可执行文件
-
在宿主机win10下载nginx-1.17.10版本的源代码(http://nginx.org/download/nginx-1.17.10.tar.gz),注意,必须与当前已经安装的nginx版本一致。
-
在宿主机win10下载naxsi最新发布的版本的源代码(https://github.com/nbs-system/naxsi),在页面右侧找到
-
把源代码文件包从宿主机win10移动到虚拟机Ubantu系统中(移动文件的方法见:https://blog.csdn.net/u010046615/article/details/110135930),放在系统根目录的tmp文件夹下(即,/tmp/),并用tar命令进行解压缩,
tar zxvf nginx-1.17.10.tar.gz tar zxvf naxsi-1.3.tar.gz
-
查看当前nginx版本的详细配置参数(注意是大写的V):
sudo nginx -V
打印:
nginx version: nginx/1.17.10 (Ubuntu) built with OpenSSL 1.1.1f 31 Mar 2020 TLS SNI support enabled configure arguments: --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-Pmk9_C/nginx-1.17.10=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-compat --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module
把打印的参数(configure arguments:)后面的全部内容拷贝存起来,PS:在编译时,在参数前面加上addmodule重新编译。
-
进入到nginx-1.17.10源代码目录里,使用以下命令重新配置nginx:
./configure --add-module=/tmp/naxsi-1.3/naxsi_src/ --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-Pmk9_C/nginx-1.17.10=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-compat --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module
重点在于,在configure后(configure是一个系统脚本,用来配置源代码),加上以下语句,表示把naxsi的源代码也配进来。
--add-module=/tmp/naxsi-1.3/naxsi_src/
-
接着系统会开始Run脚本,可能run到一半会有问题,报错,例如:,这说明当前系统找不到对应的依赖库.
(图中的例子是OpenSLL lib库,其他库可以百度一下,大同小异),需要先安装。因此先执行安装语句:
sudo apt-get install libssl-dev
然后重新执行上一步的./configure语句。如果还有其他库未安装,再继续执行sudo apt-get 进行安装。(如果有库找不到,可以考虑换软件源为清华大学或阿里云。)
-
配置成功后系统返回各种配置路径:
Configuration summary + using threads + using system PCRE library + using system OpenSSL library + using system zlib library nginx path prefix: "/usr/share/nginx" nginx binary file: "/usr/share/nginx/sbin/nginx" nginx modules path: "/usr/lib/nginx/modules" nginx configuration prefix: "/etc/nginx" nginx configuration file: "/etc/nginx/nginx.conf" nginx pid file: "/run/nginx.pid" nginx error log file: "/var/log/nginx/error.log" nginx http access log file: "/var/log/nginx/access.log" nginx http client request body temporary files: "/var/lib/nginx/body" nginx http proxy temporary files: "/var/lib/nginx/proxy" nginx http fastcgi temporary files: "/var/lib/nginx/fastcgi" nginx http uwsgi temporary files: "/var/lib/nginx/uwsgi" nginx http scgi temporary files: "/var/lib/nginx/scgi"
-
接着执行编译语句,
make
编译完成后最后返回,其中包括了Nginx配置和Nginx错误日志的文件的路径:
sed -e "s|%%PREFIX%%|/usr/share/nginx|" \ -e "s|%%PID_PATH%%|/run/nginx.pid|" \ -e "s|%%CONF_PATH%%|/etc/nginx/nginx.conf|" \ -e "s|%%ERROR_LOG_PATH%%|/var/log/nginx/error.log|" \ < man/nginx.8 > objs/nginx.8 make[1]: Leaving directory '/tmp/nginx-1.17.10'
-
将Naxsi的核心规则模块拷贝到nginx配置目录中:
sudo cp naxsi_core.rules /etc/nginx/naxsi_core.rules
-
在/tmp/nginx-1.17.10/objs目录下,把刚编译好的nginx可执行文件替换掉原有的nginx可执行文件(保险起见,可以先把原有的可执行程序nginx备份后,再替换):
sudo cp nginx /usr/sbin/
-
完成以上步骤,再次执行nginx -V,会发现新的配置已生效:
3.新增Naxsi策略配置文件
- 进入/etc/nginx/目录,新建防护策略文件:mysite.rules , 其内容为:
#LearningMode; #Enables learning mode SecRulesEnabled; ##SecRulesDisabled; DeniedUrl "/403.html"; ### check rules CheckRule "$SQL >= 8" BLOCK; CheckRule "$RFI >= 8" BLOCK; CheckRule "$TRAVERSAL >= 4" BLOCK; CheckRule "$EVADE >= 4" BLOCK; CheckRule "$XSS >= 8" BLOCK;
其中,SecRulesEnabled,表示开启WAF防护;DeniedUrl,表示策略生效后,指向的Url的位置,相对位置,相对当前目录(/etc/nginx/)。
4.修改Nginx配置及其Http站点配置