内容简介:在考虑到我自己经历的这类安全性事件,我决定尝试使用ModSecurity启动Web应用程序,并在我自己的测试环境中运行。我的测试环境由一台NGINX的CentOS8设备组成,结果比我想象的要难一些。
在 CfgMgmtCamp 期间,我参加了FranziskaBühler(@bufrasch)主题为《 WAF——您的 DevOps pipeline 的朋友? 》的演讲。她谈到了Web应用程序防火墙(WAF)和 OWASP 的核心规则集(CRS)。
考虑到我自己经历的这类安全性事件,我决定尝试使用ModSecurity启动Web应用程序,并在我自己的测试环境中运行。
我的测试环境由一台NGINX的CentOS8设备组成,结果比我想象的要难一些。
ModSecurity模块是Apache Web服务器的标准可用模块,我本来应该选择它的。但是我喜欢挑战,所以就换成了CentOS8和NGINX。
在网络上搜索时,我发现了一些资源,虽然不是全部,但是对我有很大帮助,这里给大家参考一下。
启用PowerTools存储库
由于所有配置均在CentOS8上进行,因此所有开发 工具 都必须可用,在此需要启用PowerTools存储库。
dnf config-manager --set-enabled PowerTools
并且需要很多开发工具
dnf -y install \ autoconf \ automake \ GeoIP-devel \ bison \ bison-devel \ curl \ curl-devel \ doxygen \ flex \ gcc \ gcc-c++ \ git \ libcurl-devel \ libxml2-devel \ lmdb-devel \ lua-devel \ openssl-devel \ ssdeep-devel \ yajl \ yajl-devel \ zlib-devel
获取所有资源
现在所有软件都已安装到位,设置一个可以使用的环境。请注意,因为这是一个测试环境,所以没有sudo使用,一切都以root身份完成。
cd mkdir owasp cd owasp
然后下载所有资源。需要GeoIP2,因为GeoIP将很快被弃用,下载后并与NGINX一起安装。
wget https://nginx.org/download/nginx-1.17.8.tar.gz wget https://github.com/SpiderLabs/ModSecurity/releases/download/v3.0.4/modsecurity-v3.0.4.tar.gz wget https://github.com/SpiderLabs/owasp-modsecurity-crs/archive/v3.2.0.tar.gz -O CRS_v3.2.0.tar.gz git clone --recursive https://github.com/maxmind/libmaxminddb git clone https://github.com/SpiderLabs/ModSecurity git clone https://github.com/SpiderLabs/ModSecurity-nginx git clone https://github.com/leev/ngx_http_geoip2_module
MaxMin library
ModSecurity库和ModSecurity模块都需要libmaxmin,因此首先
cd libmaxminddb ./bootstrap ./configure make make check make install cd ..
配置并安装modsecurity库
而之后libmaxmin的modsecurity库
tar -xvf modsecurity-v3.0.4.tar.gz cd modsecurity-v3.0.4 ./configure --with-lmdb --with-maxmind=/usr/local make make install cd ..
配置并安装modsecurity模块
现在modsecurity库已可用,创建模块
cd ModSecurity sh build.sh git submodule init git submodule update ./configure --with-lmdb --with-maxmind=/usr/local make make install cd ..
棘手的一点
为了使NGINX能够接受并加载模块,必须使用与已安装的NGXINX完全相同的配置选项来编译它们。这些可以通过nginx -V命令确定。
但是不知何故我这里无法正常工作。我尝试了所有可能找到的选项,但一直会遇到binairy不兼容错误。因此,我决定也从头开始编译NGINX。当然,这具有以下缺点:NGINX无法再通过packagemanager进行升级,但是由于模块和nginx二进制文件之间的严格匹配,已经无法实现。我想确保自建nginx内容不会干扰系统的其余部分,因此我将所有内容都放入/usr/local/nginx。首先,我采用了配置选项,利用安装的NGINX,最后得到了:
tar -xvf nginx-1.17.8.tar.gz cd nginx-1.17.8 ./configure \ --prefix=/usr/local/nginx \ --sbin-path=/usr/local/nginx/sbin/nginx \ --modules-path=/usr/local/nginx/modules \ --conf-path=/usr/local/nginx/etc/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-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-mail \ --with-mail_ssl_module \ --with-stream \ --with-stream_ssl_module \ --with-compat \ --with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -DNGX_HTTP_HEADERS' \ --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed'i \ --add-dynamic-module=../ModSecurity-nginx \ --add-dynamic-module=../ngx_http_geoip2_module make make install cd .. useradd -m -c'nginx' nginx mkdir -p /var/cache/nginx/client_temp chown nginx:nginx /var/cache/nginx/client_temp
配置ModSecurity
nginx被编译并安装到modsec即可,ModSec(SpiderLabs)的创建者有提供下载默认配置,让我们着手行动。
mkdir -p /usr/local/nginx/etc/modsec wget https://raw.githubusercontent.com/SpiderLabs/ModSecurity/v3/master/modsecurity.conf-recommended \ -O /usr/local/nginx/etc/modsec/modsecurity.conf cp -p /root/owasp/modsecurity-v3.0.4/unicode.mapping /usr/local/nginx/etc/modsec/unicode.mapping sed -i 's/^SecRuleEngine.*/SecRuleEngine On/' /usr/local/nginx/etc/modsec/modsecurity.conf cat <<- '@EOF' > /usr/local/nginx/etc/modsec/main.conf Include "/usr/local/nginx/etc/modsec/modsecurity.conf" # Basic test rule SecRule ARGS:blogtest "@contains test" "id:1111,deny,status:403" SecRule REQUEST_URI "@beginsWith /admin" "phase:2,t:lowercase,id:2222,deny,msg:'block admin'" @EOF
使用ModSec模块配置nginx。
worker_processes 1; load_module modules/ngx_http_modsecurity_module.so; load_module modules/ngx_http_geoip2_module.so; load_module modules/ngx_stream_geoip2_module.so; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; modsecurity on; modsecurity_rules_file /usr/local/nginx/etc/modsec/main.conf; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
要验证它是否全部损坏,请运行/usr/local/nginx/sbin/nginx -t并确保一切正常。检查ModЅecurity是否适用于:
curl http://localhost/adminaccess <html> <head><title>403 Forbidden</title></head> <body> <center><h1>403 Forbidden</h1></center> <hr><center>nginx/1.17.8</center> </body> </html>
而/var/log/nginx/error.log文件显示:
2020/02/07 16:04:08 [error] 17871#17871: *3 [client 127.0.0.1] ModSecurity: Access denied with code 403 (phase 2). Matched "Operator `BeginsWith' with parameter `/admin' against variable `REQUEST_URI' (Value: `/adminaccess' ) [file "/usr/local/nginx/etc/modsec/main.conf"] [line "7"] [id "2222"] [rev ""] [msg "block admin"] [data ""] [severity "0"] [ver ""] [maturity "0"] [accuracy "0"] [hostname "127.0.0.1"] [uri "/adminaccess"] [unique_id "158108784890.091254"] [ref "o0,6v4,12t:lowercase"], client: 127.0.0.1, server: localhost, request: "GET /adminaccess HTTP/1.1", host: "localhost"
差不多好了
此时,ModSecurity正在NGINX上运行,因此所需的就是核心规则集(CRS)。一旦达到这一目标,接下来就轻而易举了。
cd /usr/local/nginx/etc tar -xvf ~/owasp/CRS_v3.2.0.tar.gz ln -s owasp-modsecurity-crs-3.2.0 owasp-crs cp -p /usr/local/nginx/etc/owasp-crs/crs-setup.conf.example /usr/local/nginx/etc/owasp-crs/crs-setup.conf
将这些行添加到: /usr/local/nginx/etc/modsec/main.conf
Include "/usr/local/nginx/etc/owasp-crs/crs-setup.conf" Include "/usr/local/nginx/etc/owasp-crs/rules/*.conf"
还要确保文件/usr/local/nginx/etc/owasp-crs/crs-setup.conf包含以下行
SecDefaultAction "phase:1,log,auditlog,deny,status:403" SecDefaultAction "phase:2,log,auditlog,deny,status:403"
如果curl发出了正常状态,例如, curl http://localhost/trololo_singer.html 这不会触发任何安全规则,并且404会显示一个普通错误:
<html> <head><title>404 Not Found</title></head> <body> <center><h1>404 Not Found</h1></center> <hr><center>nginx/1.17.8</center> </body> </html>
但是,如果curl命令正在请求一个受保护的文件(如.htaccess文件),则将触发“核心规则集”并发出拒绝访问错误。
<html> <head><title>403 Forbidden</title></head> <body> <center><h1>403 Forbidden</h1></center> <hr><center>nginx/1.17.8</center> </body> </html>
而/var/log/nginx/error.log文件显示:
2020/02/07 16:17:28 [error] 2724#2724: *8 [client 127.0.0.1] ModSecurity: Access denied with code 403 (phase 2). Matched "Operator `PmFromFile' with parameter `restricted-files.data' against variable `REQUEST_FILENAME' (Value: `/.htaccess' ) [file "/usr/local/nginx/etc/owasp-crs/rules/REQUEST-930-APPLICATION-ATTACK-LFI.conf"] [line "104"] [id "930130"] [rev ""] [msg "Restricted File Access Attempt"] [data "Matched Data: .htaccess found within REQUEST_FILENAME: /.htaccess"] [severity "2"] [ver "OWASP_CRS/3.2.0"] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-lfi"] [tag "OWASP_CRS"] [tag "OWASP_CRS/WEB_ATTACK/FILE_INJECTION"] [tag "WASCTC/WASC-33"] [tag "OWASP_TOP_10/A4"] [tag "PCI/6.5.4"] [hostname "127.0.0.1"] [uri "/.htaccess"] [unique_id "15813292242.837003"] [ref "o1,9v4,10t:utf8toUnicode,t:urlDecodeUni,t:normalizePathWin,t:lowercase"], client: 127.0.0.1, server: localhost, request: "GET /.htaccess HTTP/1.1", host: "localhost"
*参考来源: tonkersten ,Sandra1432编译,转载请注明来自FreeBuf.COM
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Tomcat 7 启动分析(一)启动脚本
- dotnet 启动 JIT 多核心编译提升启动性能
- Win32 程序在启动时激活前一个启动程序的窗口
- 死磕Android_App 启动过程(含 Activity 启动过程)
- HADOOP 启动时 HDFS格式化后启动dfs出现以下错误:
- CentOS7 linux 安装 jdk、tomcat + 配置 tomcat 开机启动 + tomcat 快捷启动命令
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
网站入侵与脚本技术快速防杀
2011-1 / 56.00元
《反黑风暴·网站入侵与脚本技术快速防杀》由浅入深、图文并茂地再现了网站入侵与脚本技术快速防杀的全过程,内容涵盖:Windows系统编程基础、黑客程序的配置和数据包嗅探、Web脚本攻击与防御、基于Web的DDoS攻击与防御、流行的黑客编程技术、XSS跨站脚本攻击技术与防范、Cookie欺骗与防御技术剖析、数据库入侵与防范技术、SQL注入攻击与防范、网络上传漏洞的攻击与防范、系统后门编程技术、编程攻击......一起来看看 《网站入侵与脚本技术快速防杀》 这本书的介绍吧!