宝塔面板的 WAF 防火墙太贵啦,买不起的说,不如支持下社区开源免费的 ModSecurity 防火墙啦。下面是本次使用到的环境:
二、ModSecurity 部署
总的流程如下:
1. 编译部署 ModSecurity
sudo apt install make gcc build-essential autoconf automake libtool libfuzzy-dev ssdeep gettext pkg-config libcurl4-openssl-dev liblua5.3-dev libpcre3 libpcre3-dev libxml2 libxml2-dev libyajl-dev doxygen libcurl4 libgeoip-dev libssl-dev zlib1g-dev libxslt-dev liblmdb-dev libpcre++-dev libgd-dev
|
具体的存放目录随意,这个不重要,我是偷懒放到了 '/home/ubuntu/WAF' 目录下。cd /home/ubuntu/WAF git clone https://github.com/SpiderLabs/ModSecurity.git cd ModSecurity/ git submodule init git submodule update
|
sudo ./build.sh sudo ./configure
|
sudo make -j4 sudo make install
|
2. 下载连接件
cd /home/ubuntu/WAF git clone https://github.com/SpiderLabs/ModSecurity-nginx.git
|
cd ModSecurity-nginx git checkout v1.0.2
|
3. 编译安装 Nginx
将 ModSecurity-nginx 以动态模块的方式添加至 Nginx,由于宝塔面板的安装特性,你需要先卸载已经存在的 Nginx 应用。在【应用商店-运行环境】中安装 Nginx,选择编译安装,添加模块:
命令填写如下内容,其他随意--with-compat --add-dynamic-module=/home/ubuntu/WAF/ModSecurity-nginx
|
注:重装 Nginx 应用会丢失主配置文件,网站配置文件不会丢失。
4. 下载规则集
cd /home/ubuntu/WAF git clone https://github.com/coreruleset/coreruleset.git
|
cd coreruleset git checkout v3.3.2
|
5. 整合配置文件
cd /home/ubuntu/WAF/ModSecurity cp modsecurity.conf-recommended modsecurity.conf
|
将 SecRuleEngine DetectionOnly
修改为 on
,DetectionOnly 表示仅记录,修改为 on 用以阻止攻击。
# 配置规则引擎是否开启。 # On:开启规则匹配并进行相应的拦截 # Off:关闭规则匹配 # DetectionOnly:开启规则匹配,但不执行任何拦截操作(阻止,拒绝,放弃,允许,代理和重定向) SecRuleEngine On
|
cd /home/ubuntu/WAF/coreruleset cp crs-setup.conf.example crs-setup.conf
|
cd /home/ubuntu/WAF touch modsec_includes.conf
|
写入如下内容,其中 rules 目录中可以放入我们的自定义白名单、黑名单规则。
# 加载 ModSecurity 主配置文件 include ModSecurity/modsecurity.conf
# 规则集 include coreruleset/crs-setup.conf
# 自定义白名单 include rules/whitelist.conf
# 规则集-核心规则文件 include coreruleset/rules/*.conf
# 自定义全局禁用规则文件 include rules/disablerule.conf
|
宝塔面板找到 Nginx 设置,选择配置修改,添加如下内容,然后保存并重启 Nginx 即可~
添加高亮行内容,位置见结构worker_rlimit_nofile 51200; load_module modules/ngx_http_modsecurity_module.so;
events { use epoll; worker_connections 51200; multi_accept on; }
http { modsecurity on; modsecurity_rules_file /home/ubuntu/WAF/modsec_includes.conf;
include mime.types;
|
modsecurity_rules_file 写入到 http 节点代表全局开启,写入到 server 节点可实现只对具体的某个站点开启。
二、测试与调整
1. 测试 ModSecurity 是否生效
修改 /home/ubuntu/WAF/rules/disablerule.conf
,添加如下内容:
添加高亮行内容,位置见结构SecRuleEngine On SecRule ARGS:testparam "@contains test" "id:40000,deny,status:403,msg:'Test Successful'"
|
重启 Nginx 服务器,浏览器访问带有 ?testparam=test
后缀的 URL,如果收到 403 Forbidden
提示则代表规则已经生效,同时你还可以在对应网站的错误日志中找到本次拦截记录。
2. 白名单调整
事实上宝塔面板的操作过程中会撞到很多个规则,这些或多或少都可以归类为误判,所以我们需要将宝塔面板的所有操作加入进白名单中,这里采用的是校验请求头的方式,通过检查指定请求头的参数值,如果符合匹配的结果则放行。因为安全考虑为了隐藏服务器的真实 IP,在通过域名访问面板前是套有一层 CDN,所以我们可以在各家的 CDN 配置处手动添加特殊的请求头用以校验。
如果访问的请求头中包含 head-check: test 则放行所有规则SecRule REQUEST_HEADERS:head-check "test" "id:40001,phase:1,pass,nolog,ctl:ruleEngine=Off"
|
3. Cloudflare 添加自定义请求头
这里以 Cloudflare 举例如何添加请求头,找到 规则 ➡ 转换规则 中的 HTTP 请求头修改,传入请求匹配可以根据你的真实情况填写,修改请求头使用 Set static
,然后正常填入你自己的 标头名称 和 值 即可。
三、规则与设置
待补充…