前言
个人毕业设计,挺水的。本来想好好弄,把防火墙和机器学习综合一下,结果学校突然通知提前一个月验收,只好匆匆完成,不过最后答辩老师的评价还挺不错,大概是没有细看吧。总之是让大家见笑了。
核心思路
Nginx + ModSecurity + OWASP Core Rule Set + APP Specific Profiles
防火墙引擎采用ModSecurity模块,搭配OWASP Core Rule Set和基于OWASP AppSensor DetectionPoints自行编写的APP Specific Profiles。该防火墙基于Nginx反向代理技术。
具体细节
原理
- 利用Nginx单项代理技术对请求和返回进行处理。ModSecurity作为Apache的一个模块,在被修改后是可以被Nginx使用的。
- REST API现在被广泛使用,具体定义这里就不赘述了,大体是一个类似与http://hostname.com/version1/SchoolID/ClassID/StudentID这样一个URL对资源进行定位,个人感觉对URL这个统一资源定位符是一种新的解读,但这种新相对于旧的过渡却非常的自然。具体可以看这位UCI博士Roy Fielding的论文。http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm
- 现有的OWASP Core Rule Set能够防御很多攻击,但是这个规则集并没有针对REST API进行防御。这样一来,一方面我们可以部署这一套规则集,另一方面我们自行编写一些规则来针对REST API。而这些自定义的规则我们可以针对OWASP的AppSensor DetectionPoints来制定。https://www.owasp.org/index.php/AppSensor_DetectionPoints
- 要注意的是Nginx不支持动态模块加载,因此在变异Nginx时就需要把ModSecurity模块编译进去。
部署流程
Nginx
http://nginx.org/download/nginx‐1.10.3.tar.gz
wget http://nginx.org/download/nginx‐1.10.3.tar.gz
ModSecurity
https://modsecurity.org/download.html
wget https://www.modsecurity.org/tarball/2.9.1/modsecurity-2.9.1.tar.gz
安装ModSecurity编译时所需要的库
apt-get install apache2-threaded-dev libxml2-dev
修改ModSecurity源码使其支持PUT请求
将./nginx/modsecurity/ngx_http_modsecurity.c的第1011行修改为如下代码。
if ((r‐>method == NGX_HTTP_POST || r‐>method == NGX_HTTP_PUT) && modsecIsRequestBodyAccessEnabled(ctx‐>req) ) {
编译ModSecurity模块
checking if libcurl is linked with gnutls... no sudo apt‐get install gnutls‐bin sudo apt‐get install libyajl‐dev libcurl4‐openssl‐dev liblua5.1‐dev ./configure ‐‐enable‐standalone‐module ‐‐with‐yajl ‐‐disable‐mlogc
安装Nginx
./configure ‐‐add‐module=../modsecurity‐2.9.1/nginx/modsecurity make make install
开启反向代理,开启ModSecurity模块
指定nginx.conf对应内容为:
location / { root html; index index.html index.htm; ModSecurityEnabled on; ModSecurityConfig modsec_includes.conf; # Only needed if including proxies proxy_pass http://localhost:5000; proxy_read_timeout 180s; proxy_force_ranges on;}
部署Core Rule Set
include modsecurity.conf include owasp‐modsecurity‐crs/crs‐setup.conf include owasp‐modsecurity‐crs/rules/*.conf include rest‐modsecurity‐rules/*.conf
cp /home/modsecurity/modsecurity‐2.9.1/modsecurity.conf‐recommended /usr/local/nginx/conf/modsecurity.conf cp /home/modsecurity/modsecurity‐2.9.1/unicode.mapping /usr/local/nginx/conf/
https://github.com/SpiderLabs/owasp‐modsecurity‐crs
git clone https://github.com/SpiderLabs/owasp‐modsecurity‐crs.git
Move the crs‐setup.conf.example file to crs‐setup.conf
root@demo‐64bit:/usr/local/nginx/conf/owasp‐modsecurity‐crs# mv crs‐setup.conf.example crs‐setup.conf
Rename rules/REQUEST‐900‐EXCLUSION‐RULES‐BEFORE‐CRS.conf.example and rules/RESPONSE‐999‐ EXCLUSION‐RULES‐AFTER‐CRS.conf.example to remove the ‘.example’ extension.
编写APP Specific Profiles
敏感内容,和企业项目有关。可自行根据CRS修改。
修改ModSecurity配置文件
modsecurity.conf
1. SecAuditLogType Serial 2. SecAuditLog /var/log/modsec_audit.log
改为
1. SecAuditLogDirMode 0777 2. SecAuditLogFileMode 0550 3. SecAuditLogType Concurrent 4. SecAuditLog /var/log/modsec_audit.log
否则会出现:
ModSecurity: Audit log: Failed to lock global mutex: Permission denied [hostname “ubuntu”] [uri “/test.php”] [unique_id “AcccAYAcAcAWycbcA
关闭数据分享(可选,大致是维护方为了提升用户体验做的数据收取)
SecStatusEngine On 改为SecStatusEngine Off
修改日志目录权限
chmod 777 /var/log/
重启Nginx
/usr/local/nginx/sbin/nginx ‐s reload