ModSecurity
- ModSecurity 是一个开源的、跨平台的 Web 应用防火墙,它可以通过检查 Web 服务器收发的数据来对网站流量进行安全防护
- 最初设计 ModSecurity 项目时,它只是一个 Apache 模块。随着时间的推移,该项目已经扩展到支持其他平台, 如 Nginx; 为了满足对额外平台支持不断增长的需求,有必要删除该项目底层的 Apache 依赖项,使其更加独立于平台
- 当前 ModSecurity v3 由 Libmodsecurity(对 ModSecurity 平台的完全重写) 和 对应 web 服务器的连接器(模块)组成
- 请求处理阶段 Request Headers、Request Body、Response Headers、Response Body、Logging
组件版本
- nginx v1.20.1
- libmodsecurity v3.05
- ModSecurity-nginx v1.0.2
- coreruleset v3.3.2
- CentOS Linux release 7.6.1810 (Core)
libmodsecurity
基于 SecRules 的 web 流量处理引擎, 提供了加载/解释与 ModSecurity SecRules 格式编写的规则的能力
1、安装 libmodsecurity 所需依赖库
# 安装依赖
yum install -y epel-release git gcc gcc-c++ autoconf libtool pcre-devel libxml2-devel curl-devel yajl-devel flex-devel lua-devel lmdb-devel ssdeep-devel
# 安装依赖项 libmaxminddb
wget -c https://github.com/maxmind/libmaxminddb/releases/download/1.6.0/libmaxminddb-1.6.0.tar.gz
./configure
make && make install
2、下载编译安装 libmodsecurity v3.05
git clone https://github.com/SpiderLabs/ModSecurity
cd ModSecurity
# 下载 libInjection
git submodule init
git submodule update
# 开始构建, 默认安装位置 /usr/local/modsecurity/
./build.sh
./configure && make && make install
# 备注: ./build.sh 执行中提示 `fatal: No names found, cannot describe anything.` 暂时忽略
modsecurity-nginx
nginx 和 libmodsecurity 之间的连接器, 其实就是一个第三方 Nginx 模块, Nginx 可以通过静态或动态方式加载该模块
1、Nginx 的编译安装
wget http://nginx.org/download/nginx-1.20.1.tar.gz
tar xzf nginx-1.20.1.tar.gz && cd nginx-1.20.1
yum install openssl-devel
git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' --add-dynamic-module=../ModSecurity-nginx
make -j4
mkdir /var/cache/nginx/ && useradd -r nginx && mkdir /etc/nginx/modules
cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules
# nginx 配置文件首行添加如下配置, 全局加载该模块
load_module modules/ngx_http_modsecurity_module.so;
2、添加 modsecurity 相关配置文件 modsecurity.conf, main.conf
# 创建配置文件 modsecurity.conf
mkdir /etc/nginx/modsec && cd /etc/nginx/modsec
wget https://raw.githubusercontent.com/SpiderLabs/ModSecurity/v3/master/modsecurity.conf-recommended
mv modsecurity.conf-recommended modsecurity.conf
# 修改 modsecurity.conf 中的对应配置项
vim /etc/nginx/modsec/modsecurity.conf
SecRuleEngine On # 默认 DetectionOnly(开启规则匹配,但不执行任何拦截操作), On(开启规则匹配并进行相应的拦截)
#SecUnicodeMapFile unicode.mapping 20127 # 默认启用, 现变更为注释该行
# 创建主配置 main.conf 及自定义规则
cat > /etc/nginx/modsec/main.conf << EOF
Include /etc/nginx/modsec/modsecurity.conf
# 自定义安全规则, 参数 x 值中包含 test 字符串, 则返回 403 状态
SecRule ARGS:x "@contains test" "id:1234,deny,log,status:403"
SecUploadFileLimit 15 # 配置在multipart POST中处理的最大文件上传数量
EOF
# 在 Nginx 的 server 上下文中添加如下配置
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
3、完整的 Nginx 配置文件如下
cat /etc/nginx/nginx.conf
load_module modules/ngx_http_modsecurity_module.so;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
location / {
root html;
index index.html index.htm;
}
}
}
OWASP
OWASP ModSecurity 核心规则集 (CRS) 是一组通用攻击检测规则, 用于 ModSecurity 或兼容的 Web 应用程序防火墙; CRS 旨在保护 Web 应用程序免受包括 OWASP 前十名在内的各种攻击, 同时将错误警报降至最低
1、在 Modsecurity 中启用 OWASP 核心规则集
# 下载部署 crs
wget https://github.com/coreruleset/coreruleset/archive/refs/tags/v3.3.2.tar.gz
tar xzf v3.3.2.tar.gz && cd cd coreruleset-3.3.2/
cp crs-setup.conf.example crs-setup.conf && cd ..
mv coreruleset-3.3.2/ /etc/nginx/modsec/crs3
# 在主配置文件 main.conf 中引用 modsecurity 及 crs 配置
cat > /etc/nginx/modsec/main.conf << EOF
# modsecurity 基本配置
Include /etc/nginx/modsec/modsecurity.conf
# OWASP CRS v3 rules
Include /etc/nginx/modsec/crs3/crs-setup.conf
Include /etc/nginx/modsec/crs3/rules/*.conf
# 自定义规则集
SecRule ARGS:x "@contains test" "id:1234,deny,log,status:403"
EOF
安全验证
1、请求参数 x 不包含字符串 test 的请求, 返回状态 200 http://192.168.31.66/?x=wyun
2、请求参数 x 包含非法字符串 test 的请求, 返回状态 403 http://192.168.31.66/?x=wyuntest
# 在 /var/log/nginx/error.log 中可以看到拦截的详细日志
2021/09/13 19:28:06 [error] 24702#24702: *7 [client 192.168.31.220] ModSecurity: Access denied with code 403 (phase 1). Matched "Operator `Contains' with parameter `test' against variable `ARGS:x' (Value: `test11' ) [file "/etc/nginx/modsec/main.conf"] [line "3"] [id "1234"] [rev ""] [msg ""] [data ""] [severity "0"] [ver ""] [maturity "0"] [accuracy "0"] [hostname "192.168.31.66"] [uri "/"] [unique_id "1631532486"] [ref "o0,4v8,6"], client: 192.168.31.220, server: localhost, request: "GET /?x=test11 HTTP/1.1", host: "192.168.31.66"
内容出处:,
声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。文章链接:http://www.yixao.com/tech/29577.html