一、openwaf介绍
OpenWAF是第一个全方位开源的Web应用防护系统(WAF),他基于nginx_lua API分析HTTP请求信息。OpenWAF由行为分析引擎和规则引擎两大功能引擎构成。其中规则引擎主要对单个请求进行分析,行为分析引擎主要负责跨请求信息追踪。
规则引擎的启发来自modsecurity及freewaf(lua-resty-waf),将ModSecurity的规则机制用lua实现。基于规则引擎可以进行协议规范,自动工具,注入攻&击,跨站攻&击,信息泄露,异常请求等安全防护,支持动态添加规则,及时修补漏洞。
行为分析引擎包含基于频率的模糊识别,防恶意爬虫,人机识别等防探测模块,防CSRF,防CC,防提权,文件上传防护等防御模块,cookie防篡改,防盗链,自定义响应头,响应页面等防信息泄露模块。
除了两大引擎之外,还包含统计,日志,响应页面,接入规则等基础模块。除了已有的功能模块,OpenWAF还支持动态修改配置, 动态添加第三方模块,使得在不重启引擎中断业务的条件下,升级防护。
OpenWAF支持将上述功能封装为策略,不同的web application应用不同的策略来防护。将来还会打造云平台,策略还可分享供他人参考。
基础模块如下:
静态配置管理器 openwaf_conf
日志 openwaf_log
统计 openwaf_reqstat
核心层 openwaf_core
接入规则 openwaf_access_rule
功能模块如下:
规则引擎 openwaf_rule_engine
响应页面 openwaf_attack_response
API openwaf_api
防恶意爬虫 openwaf_anti_mal_crawler
防CC openwaf_anti_cc
详细配置文档及示例请看上述各模块文档
https://gitee.com/miracleqi/OpenWAF
二、安装openwaf服务器(10.0.0.77)
1、安装openwaf依赖
cd /opt yum install gcc gcc-c++ wget GeoIP-devel git swig make perl perl-ExtUtils-Embed readline-devel zlib-devel -y wget http://www.over-yonder.net/~fullermd/projects/libcidr/libcidr-1.2.3.tar.xz wget https://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz wget https://www.openssl.org/source/openssl-1.1.1d.tar.gz wget https://openresty.org/download/openresty-1.15.8.2.tar.gz tar -xvf libcidr-1.2.3.tar.xz tar -zxvf pcre-8.43.tar.gz tar -zxvf openssl-1.1.1d.tar.gz tar -zxvf openresty-1.15.8.2.tar.gz rm -rf pcre-8.43.tar.gz \ openssl-1.1.1d.tar.gz \ openresty-1.15.8.2.tar.gz cd /opt/libcidr-1.2.3 make && make install
2、安装openwaf
cd /opt git clone https://github.com/titansec/OpenWAF.git ##建议采用电信线路 mv /opt/OpenWAF/lib/openresty/ngx_openwaf.conf /etc mv /opt/OpenWAF/lib/openresty/configure /opt/openresty-1.15.8.2 cp -RP /opt/OpenWAF/lib/openresty/* /opt/openresty-1.15.8.2/bundle/ cd /opt/OpenWAF make clean make install ln -s /usr/local/lib/libcidr.so /opt/OpenWAF/lib/resty/libcidr.so
3、编译 openresty
cd /opt/openresty-1.15.8.2/ ./configure --with-pcre-jit --with-ipv6 \ --with-http_stub_status_module \ --with-http_ssl_module \ --with-http_realip_module \ --with-http_sub_module \ --with-http_geoip_module \ --with-openssl=/opt/openssl-1.1.1d \ --with-pcre=/opt/pcre-8.43 make && make install
参考资料:https://github.com/titansec/OpenWAF/blob/master/doc/%E8%BD%BB%E6%9D%BE%E7%8E%A9%E8%BD%ACOpenWAF%E4%B9%8B%E5%AE%89%E8%A3%85%E7%AF%87.md
三、安装web服务器(10.0.0.88)
1.创建统一用户
groupadd www -g 666
useradd www -u 666 -g 666 -M -s /sbin/nologin
id www
tail -1 /etc/passwd
2.Nginx安装部署
- 使用官方源YUM安装Nginx最新版本
[root@web01 ~]# cat /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
- 安装nginx并启动
yum makecache fast
yum install nginx
systemctl start nginx
- 修改运行用户为www并重启
sed -i '/^user/s#nginx#www#g' /etc/nginx/nginx.conf
systemctl restart nginx
3.PHP安装部署
- 使用第三方源YUM安装PHP7.1
yum remove php-mysql-5.4 php php-fpm php-common
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
- 安装部署php
yum makecache fast
yum -y install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-redis php71w-pecl-mongodb
- 修改运行用户为PHP
sed -i '/^user/c user = www' /etc/php-fpm.d/www.conf
sed -i '/^group/c group = www' /etc/php-fpm.d/www.conf
- 启动检查
systemctl start php-fpm
ps -ef|grep php-fpm
4.Mysql安装部署
- YUM安装mariadb
yum install mariadb mariadb-server -y
systemctl start mariadb
- 安全初始化配置
mysql_secure_installation
mysql -uroot -p
四、调试web服务器(10.0.0.88)
[root@web01 code]# cat /etc/nginx/conf.d/php.conf
server {
server_name www.hand123.com;
listen 80;
root /code;
index index.php index.html;
location ~ \.php$ {
root /code;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
- 检查语法并重启nginx
nginx -t
systemctl restart nginx
- 创建站点目录
mkdir /code -p
- 创建php测试页面
[root@web01 code]# cat index.php
<?php
phpinfo();
?>
- windows访问测试
绑定hosts并ping测试
web访问: www.hand123.com
五、调试openwaf服务器(10.0.0.77)
1、修改openwaf提供的nginx配置文件
如果用 OpenWAF 默认的 /etc/ngx_openwaf.conf 配置文件(默认监听 80 端口)
修改 /opt/OpenWAF/conf/twaf_access_rule.json 文件中第一条接入规则的"forward_addr"值
2、启动nginx
启动nginx命令 /usr/local/openresty/nginx/sbin/nginx -c /etc/ngx_openwaf.conf
停止nginx命令 /usr/local/openresty/nginx/sbin/nginx -c /etc/ngx_openwaf.conf -s stop
参考资料:https://github.com/titansec/Openwaf/tree/master/doc
六、访问验证
1、修改hosts文件
10.0.0.77 www.hand123.com
2、正常访问
3、功能验证
游览器输入http://www.hand123.com/?name=test AND 1=1
触发的事件类型: attack.injection.sql.libinjection
游览器输入http://www.hand123.com/?a=1 order by 1
触发的事件类型: attack.injection.sql.libinjection