基于 Nginx + ModSecurity 构建防火墙


ModSecurity是一个开源的、跨平台的 Web 应用防火墙,它可以通过检查 Web 服务接收到的数据,以及发送出去的数据来对网站进行安全防护。

安装依赖包:

yum install -y pcre pcre-devel libxml2 libxml2-devel curl curl-devel httpd-devel
yum install -y gcc make automake autoconf libtool
yum install lmdb lmdb-devel ssdeep ssdeep-devel lua lua-devel
yum install gcc-c++ flex bison yajl yajl-devel GeoIP-devel doxygen zlib-devel

下载 ModSecurity-nginx、ModSecurity(v3版本)和服务器版本一样的nginx:

git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git
git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity
wget http://nginx.org/download/nginx-1.14.2.tar.gz

安装ModSecurity:

cd ModSecurity/
git submodule init
git submodule update
./build.sh
./configure
make
make install

这就安装完成了。

接下来要进行ModSecurity-nginx的操作,直接移动到/usr/local/nginx/modules下(nginx默认不带modules目录需要自己创建):

mv ModSecurity-nginx/ /usr/local/nginx/modules/

然后解压nginx:

tar -zxvf nginx-1.14.2.tar.gz
cd nginx-1.14.2

由于我已经安装了nginx了,所以这里直接重新编译一下并且加上--add-dynamic-module=/usr/local/nginx/modules/ModSecurity-nginx,如果想知道已经编译了那些模块可以用 nginx -V 查看:

./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --with-stream --with-stream_ssl_module --with-openssl=/home/lnmp/lnmp1.6/src/openssl-1.1.1b --with-openssl-opt=enable-weak-ssl-ciphers --with-ld-opt=-Wl,-rpath,/usr/local/luajit/lib --add-dynamic-module=/usr/local/nginx/modules/ModSecurity-nginx

然后

make modules (这里不需要make install)
cp objs/ngx_http_modsecurity_module.so /usr/local/nginx/modules

移动ModSecurity下的文件:

cp ../ModSecurity/unicode.mapping /usr/local/nginx/modsec/

由于已经安装了nginx,所以要移动一下启动文件,把编译的这个启动文件替换原有的启动文件(新安装可以省略)

cp objs/nginx /usr/local/nginx/sbin/nginx

然后编辑nginx的配置文件:

vi /usr/local/nginx/conf/nginx.conf

在 event的上面添加:

load_module /usr/local/nginx/modules/ngx_http_modsecurity_module.so;

然后下载规则

git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git

进入文件夹移动文件

mv owasp-modsecurity-crs/modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf
cp -R owasp-modsecurity-crs/rules /usr/local/nginx/conf/
cp owasp-modsecurity-crs/crs-setup.conf.example /usr/local/nginx/conf/crs-setup.conf

然后编辑

vim /usr/local/nginx/conf/modsecurity.conf

添加

include crs-setup.conf
include rules/*.conf


SecRuleEngine DetectionOnly

改为

SecRuleEngine on

SecRuleEngine:是否接受来自ModSecurity-CRS目录下的所有规则的安全规则引擎。因此,我们可以根据需求设置不同的规则。要设置不同的规则有以下几种。
SecRuleEngine On:将在服务器上激活ModSecurity防火墙,它会检测并阻止该服务器上的任何恶意攻击。
SecRuleEngine Detection Only:如果设置这个规则它只会检测到所有的攻击,并根据攻击产生错误,但它不会在服务器上阻止任何东西。
SecRuleEngine Off:这将在服务器上上停用ModSecurity的防火墙。
SecRequestBodyAccess:它会告诉ModSecurity是否会检查请求,它起着非常重要的作用。它只有两个参数ON或OFF。
SecResponseBodyAccess:如果此参数设置为ON,然后ModeSecurity可以分析服务器响应,并做适当处理。它也有只有两个参数ON和Off,我们可以根据求要进行设置。

编辑nginx配置文件加入:

modsecurity on;

查看log日志(在modsecurity.conf中配置)

cat /var/log/modsec_audit.log

如果报错那么修改modsecurity.conf中的

SecUnicodeMapFile unicode.mapping 20127

改为

SecUnicodeMapFile /usr/local/nginx/modsec/unicode.mapping 20127 
modsecurity_rules_file /usr/local/nginx/conf/modsecurity.conf;

然后访问网址

url/?id=1 AND 1=1 

url/?search=<scritp>alert('xss');</script>(xss)

如果以上两个地址都访问不了.则配置成功


点赞 取消点赞 收藏 取消收藏

<< 上一篇: Leetcode PHP题解--D107 453. Minimum Moves to Equal Array Elements

>> 下一篇: Leetcode刷题之PHP解析(96. Unique Binary Search Trees)