通过部署nginx_lua_waf,具有使用简单、高性能、轻量级的优势,能够有效的防范sql注入、文件包含、XSS、fuzzing等web攻击,屏蔽异常的网络请求,防止webshell上传,相比于安全狗等商业版WAF,能够根据实际需求调整过滤规则,编辑符合企业自身业务需求的过滤规则。
实验安装环境:Redhat 6.2和7.3
手动安装nginx_lua_waf
安装依赖包
代码语言:javascript复制yum install -y zlib zlib-devel readline-devel pcre pcre-devel openssl-devel gcc
openresty安装方式nginx和lua环境
添加openresty的yum源:
代码语言:javascript复制yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
vim编辑openresty.repo,将$releaserver和$basearch替换为6和x86_64:
代码语言:javascript复制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:
代码语言:javascript复制yum install openresty -y
yum install openresty-resty -y
列出所有openresty仓库的所有软件安装包:
代码语言:javascript复制yum --disablerepo="*" --enablerepo="openresty" list available
可安装的软件包:
代码语言:javascript复制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即可。
yum 安装openresty默认安装在/usr/local/openresty,若需要自定义安装目录可以采用源码安装方式指定安装目录。如:
代码语言:javascript复制./configure --prefix=/opt/openresty --with-luajit --without-http_redis2_module --with-http_iconv_module --with-http_postgres_module
配置nginx文件,修改网页开放端口为8090或其他端口:
代码语言:javascript复制vim /usr/local/openresty/nginx/conf/nginx.conf
编辑防火墙配置,添加允许对8090端口的访问的规则:
代码语言:javascript复制vim /etc/sysconfig/iptables
启动nginx:
代码语言:javascript复制/usr/local/openresty/nginx/sbin/nginx -c /usr/local/openresty/nginx/conf/nginx.conf
或
代码语言:javascript复制nginx -p /usr/local/openresty/nginx/ -c /usr/local/openresty/nginx/conf/nginx.conf
或进入nginx安装目录,执行:
代码语言:javascript复制nginx -p `pwd`/ -c conf/nginx.conf
如果启动有如下提示,则说明端口被占用或nginx已经启动:
ps查看nginx开启的进程:
浏览器访问8090端口,页面正常则说明openresty部署成功:
下载配置waf
下载ngx_lua_waf到nginx的conf目录下,https://github.com/loveshell/ngx_lua_waf 用wget下载zip格式解压或者用git clone下载
git clone下载提示如下:
查看/usr/libexec/git-core下是否存在git-remote-https,若无,则需重新安装git,若有,下一步将/usr/libexec/git-core添加到PATH里面:
下载完成:
下载完的文件内容
在nginx.conf中的http段配置:
代码语言:javascript复制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;
修改ngx_lua_waf下的config.lua:
代码语言:javascript复制RulePath = "/usr/local/openresty/nginx/conf/ngx_lua_waf/wafconf"
attacklog = "on"
logdir = "/usr/local/nginx/logs/waf"
注意:logdir目录下的日志记录文件需要手动创建,并修改所属权限保证日志能够正常写入,然而修改权限,Linux的还是不能写入,但Windows的可以,是因为openresty默认安装时,nginx未指定所属用户,启动应用以后进程的user是nobody。
解决办法:将nginx.conf首行的”# user nobody;”的”#”注释去掉,重新启动nginx服务,然后将防护日志目录所属user和group修改为nobody,目录权限可设为700也可以写入。关键点在于,防护日志的所属user和group需要设置为nginx的运行user,比如nginx.conf首行为user nginx,防护日志目录所属user和group须为nginx:
配置完成以后重启nginx,测试生效:
利用脚本安装nginx_lua_waf
下载https://github.com/loveshell/ngx_lua_waf,可以看到下载到的文件中有一个install.sh,可以直接通过脚本安装环境进行部署,但因安装的组件版本比较旧,可以通过修改下载的安装包完成安装。
下载最新的lua-nginx-module,此部分必须更新版本,作者下载的版本不支持最新版本的nginx,不更新安装过程中会出错
因准备环境时已经安装pcre,所以注释掉该安装部分
安装最新版本的nginx,设置user和group为nginx
下载waf,配置过滤日志文件,根据脚本,将日志目录修改为775权限,或者700都可以.
确保selinux处于关闭状态
修改防护日志目录所属user和group
代码语言:javascript复制chown -R nginx.nginx /data/logs/waf
启动nginx以后,可以看到进程的user为nginx:
测试成功写入日志:
参考
代码语言:javascript复制https://openresty.org/cn/linux-packages.html
https://github.com/loveshell/ngx_lua_waf
感谢悬镜安全给予的帮助,解答了防护日志写入的问题。