nginx_lua_waf部署

运维安全 2017-12-03

1. nginx_lua_waf的用途

通过部署nginx_lua_waf,具有使用简单、高性能、轻量级的优势,能够有效的防范sql注入、文件包含、XSS、fuzzing等web攻击,屏蔽异常的网络请求,防止webshell上传,相比于安全狗等商业版WAF,能够根据实际需求调整过滤规则,编辑符合企业自身业务需求的过滤规则。

2 实验安装环境

Redhat 6.2 和 7.3

3. 安装的准备

需先用yum安装依赖库:

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

4. openresty安装方式nginx和lua环境

添加openresty的yum源:

yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo

vim编辑openresty.repo,将$releaserver和$basearch替换为6和x86_64

sed -i ‘s/$releaserver/6/g’ /etc/yum.repos.d/openresty.repo

sed -i ‘s/$basearch/x86_64/g’ /etc/yum.repos.d/openresty.repo

yum安装openresty:

yum install openresty -y

yum install openresty-resty -y

列出所有openresty仓库的所有软件安装包:

yum --disablerepo="*" --enablerepo="openresty" list available

可安装的软件包

openresty-asan.x86_64

openresty-asan-debuginfo.x86_64

openresty-debug.x86_64

openresty-debug-debuginfo.x86_64

openresty-debuginfo.x86_64

openresty-doc.noarch

openresty-openssl-asan.x86_64

openresty-openssl-asan-debuginfo.x86_64

openresty-openssl-asan-devel.x86_64

openresty-openssl-debug.x86_64

openresty-openssl-debug-debuginfo.x86_64

openresty-openssl-debug-devel.x86_64

openresty-openssl-debuginfo.x86_64

openresty-openssl-devel.x86_64

openresty-opm.noarch

openresty-pcre-asan.x86_64

openresty-pcre-asan-debuginfo.x86_64

openresty-pcre-asan-devel.x86_64

openresty-pcre-debuginfo.x86_64

openresty-pcre-devel.x86_64

openresty-valgrind.x86_64

openresty-valgrind-debuginfo.x86_64

openresty-zlib-asan.x86_64

openresty-zlib-asan-debuginfo.x86_64

openresty-zlib-asan-devel.x86_64

openresty-zlib-debuginfo.x86_64

openresty-zlib-devel.x86_64

perl-Lemplate.noarch

perl-Spiffy.noarch

perl-Test-Base.noarch

perl-Test-LongString.noarch perl-Test-Nginx.noarch

需要安装仓库内的软件包,直接用yum即可。

wpsDDA5.tmp.jpg

yum 安装openresty默认安装在/usr/local/openresty,若需要自定义安装目录可以采用源码安装方式指定安装目录。如:

./configure --prefix=/opt/openresty --with-luajit --without-http_redis2_module --with-http_iconv_module --with-http_postgres_module

配置nginx文件,修改网页开放端口为8090或其他端口:

vim /usr/local/openresty/nginx/conf/nginx.conf

wpsDDA6.tmp.jpg

编辑防火墙配置,添加允许对8090端口的访问的规则:

vim /etc/sysconfig/iptables

wpsDDA7.tmp.jpg

启动nginx:

/usr/local/openresty/nginx/sbin/nginx -c /usr/local/openresty/nginx/conf/nginx.conf

nginx -p /usr/local/openresty/nginx/ -c /usr/local/openresty/nginx/conf/nginx.conf

或进入nginx安装目录,执行:

nginx -p pwd/ -c conf/nginx.conf

如果启动有如下提示,则说明端口被占用或nginx已经启动:

wpsDDA8.tmp.jpg

ps查看nginx开启的进程

wpsDDA9.tmp.jpg

浏览器访问8090端口,页面正常则说明openresty部署成功:

wpsDDAA.tmp.jpg

5. 下载配置waf

下载ngx_lua_waf到nginx的conf目录下,https://github.com/loveshell/ngx_lua_waf

用wget下载zip格式解压或者用git clone下载

git clone下载提示如下:

wpsDDAB.tmp.jpg

查看/usr/libexec/git-core下是否存在git-remote-https,若无,则需重新安装git,若有,下一步将/usr/libexec/git-core添加到PATH里面:

wpsDDAC.tmp.jpg

下载完成:

wpsDDAD.tmp.jpg

下载完的文件内容

wpsDDAE.tmp.jpg


├── config.lua          #waf的配置文件

├── init.lua            #读取waf的规则文件

├── install.sh            #waf安装文件,需要做修改

├── README.md        #说明文档

├── wafconf            #规则库

│   ├── args            #get请求的参数过滤规则

│   ├── cookie        #cookie过滤规则

│   ├── post            #post请求过滤规则

│   ├── url            #get请求的URL过滤规则

│   ├── user-agent        #user-agent过滤规则

│   └── whiteurl        #白名单

└── waf.lua            #waf规则执行文件

在nginx.conf中的http段配置:

lua_package_path "/usr/local/openresty/nginx/conf/ngx_lua_waf/?.lua";

lua_shared_dict limit 10m;

init_by_lua_file /usr/local/openresty/nginx/conf/ngx_lua_waf/init.lua;

access_by_lua_file /usr/local/openresty/nginx/conf/ngx_lua_waf/waf.lua;

wpsDDBF.tmp.jpg

修改ngx_lua_waf下的config.lua:

RulePath = "/usr/local/openresty/nginx/conf/ngx_lua_waf/wafconf"

attacklog = "on"

logdir = "/usr/local/nginx/logs/waf"

wpsDDC0.tmp.jpg

注意:logdir目录下的日志记录文件需要手动创建,并修改所属权限保证日志能够正常写入,然而修改权限,Linux的还是不能写入,但Windows的可以,是因为openresty默认安装时,nginx未指定所属用户,启动应用以后进程的user是nobody。

wpsDDC1.tmp.jpg

解决办法:将nginx.conf首行的”# user nobody;”的”#”注释去掉,重新启动nginx服务,然后将防护日志目录所属user和group修改为nobody,目录权限可设为700也可以写入。关键点在于,防护日志的所属user和group需要设置为nginx的运行user,比如nginx.conf首行为user nginx,防护日志目录所属user和group须为nginx:

wpsDDC2.tmp.jpg

wpsDDC3.tmp.jpg

wpsDDC4.tmp.jpg

配置完成以后重启nginx,测试生效:

wpsDDC5.tmp.jpg

6. 利用脚本安装nginx_lua_waf

下载https://github.com/loveshell/ngx_lua_waf,可以看到下载到的文件中有一个install.sh,可以直接通过脚本安装环境进行部署,但因安装的组件版本比较旧,可以通过修改下载的安装包完成安装。

下载最新的lua-nginx-module,此部分必须更新版本,作者下载的版本不支持最新版本的nginx,不更新安装过程中会出错

wpsDDC6.tmp.jpg

因准备环境时已经安装pcre,所以注释掉该安装部分

wpsDDC7.tmp.jpg

安装最新版本的nginx,设置user和group为nginx

wpsDDC8.tmp.jpg

下载waf,配置过滤日志文件,根据脚本,将日志目录修改为775权限,或者700都可以

wpsDDC9.tmp.jpg

确保selinux处于关闭状态

wpsDDCA.tmp.jpg

修改防护日志目录所属user和group

chown -R nginx.nginx /data/logs/waf

wpsDDCB.tmp.jpg

启动nginx以后,可以看到进程的user为nginx:

wpsDDCC.tmp.jpg

测试成功写入日志:

wpsDDCD.tmp.jpg

7. 参考

https://openresty.org/cn/linux-packages.html

https://github.com/loveshell/ngx_lua_waf

感谢悬镜安全给予的帮助,解答了防护日志写入的问题。


本文由 myh0st 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

楼主残忍的关闭了评论