基于Nginx + ModSecurity V3实现对web流量的安全访问控制

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.net/tech/29577.html

发表评论

登录后才能评论