ModSecurity 3.x + Nginx 编译安装

Platform: CentOS7.x

编译并生成 nginx_modsecurity3 RPM 安装包


安装依赖

yum -y install epel-release
yum install -y git rpm-build gperftools-devel openssl-devel pcre-devel zlib-devel GeoIP-devel gd-devel perl-devel libxslt-devel perl-ExtUtils-Embed.noarch gcc gcc-c++ autoconf automake libtool
yum -y install yum-utils yajl yajl-devel libcurl libcurl-devel lmdb lmdb-devel ssdeep ssdeep-devel lua lua-devel

安装 nignx

yum -y install nginx
cd /root/
yumdownloader --source nginx
rpm -i nginx-1.16.1-1.el7.src.rpm
  • 当前结果
[root@localhost ~]# ls -l
-rw-r--r--.  1 root root 1070280 10月  4 2019 nginx-1.16.1-1.el7.src.rpm
drwxr-xr-x.  4 root root      34 5月  19 14:41 rpmbuild

安装 libModSecurity

  • 下载 modsecurity
cd /root/
git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity
  • 安装 modsecurity
cd ModSecurity
git submodule init
git submodule update
./build.sh
./configure --with-lmdb
ModSecurity -  for Linux
 
 Mandatory dependencies
   + libInjection                                  ....v3.9.2-30-gbf234eb
   + SecLang tests                                 ....c8cf2c5
 
 Optional dependencies
   + GeoIP/MaxMind                                 ....found 
      * (GeoIP) v1.5.0
         -lGeoIP  , -I/usr/include/  
   + LibCURL                                       ....found v7.29.0 
      -lcurl  ,  -DWITH_CURL
   + YAJL                                          ....found v2.0.4
      -lyajl  , -DWITH_YAJL  
   + LMDB                                          ....disabled
   + LibXML2                                       ....found v2.9.1
      -lxml2 -lz -lm -ldl, -I/usr/include/libxml2 -DWITH_LIBXML2
   + SSDEEP                                        ....found 
      -lfuzzy -L/usr/lib64/, -DWITH_SSDEEP -I/usr/include
   + LUA                                           ....found v501
      -llua-5.1 -L/usr/lib64/, -DWITH_LUA -DWITH_LUA_5_1 -I/usr/include
 
 Other Options
   + Test Utilities                                ....enabled
   + SecDebugLog                                   ....enabled
   + afl fuzzer                                    ....disabled
   + library examples                              ....enabled
   + Building parser                               ....disabled
   + Treating pm operations as critical section    ....disabled
make -j2
make install

当前结果

[root@localhost ~]# ls -l
drwxr-xr-x. 14 root root    4096 5月  19 15:01 ModSecurity
-rw-r--r--.  1 root root 1070280 10月  4 2019 nginx-1.16.1-1.el7.src.rpm
drwxr-xr-x.  4 root root      34 5月  19 14:41 rpmbuild

[root@localhost ~]# find . -name libmodsecurity.so*
./ModSecurity/src/.libs/libmodsecurity.so.3.0.4
./ModSecurity/src/.libs/libmodsecurity.so.3
./ModSecurity/src/.libs/libmodsecurity.so
[root@localhost ~]# 

关联 nginx


  • 下载 ModSecurity-nginx
cd /root/
git clone https://github.com/SpiderLabs/ModSecurity-nginx.git

当前结果

[root@localhost ~]# ls -l
drwxr-xr-x. 14 root root    4096 5月  19 15:01 ModSecurity
drwxr-xr-x.  6 root root     192 5月  19 15:14 ModSecurity-nginx
-rw-r--r--.  1 root root 1070280 10月  4 2019 nginx-1.16.1-1.el7.src.rpm
drwxr-xr-x.  5 root root      47 5月  19 15:30 rpmbuild
  • 解压缩 nginx 源文件
cd /root/
tar zxf ./rpmbuild/SOURCES/nginx-1.16.1.tar.gz

当前结果

[root@localhost ~]# ls -l
drwxr-xr-x. 14 root root    4096 5月  19 15:01 ModSecurity
drwxr-xr-x.  6 root root     192 5月  19 15:14 ModSecurity-nginx
drwxr-xr-x.  9 1001 1001     186 5月  19 15:18 nginx-1.16.1
-rw-r--r--.  1 root root 1070280 10月  4 2019 nginx-1.16.1-1.el7.src.rpm
drwxr-xr-x.  5 root root      47 5月  19 15:30 rpmbuild
  • 更新 nginx build string
cd /root/nginx-1.16.1/
nginx -V 2>&1 | grep 'configure arguments' | sed "s#configure arguments:#./configure --add-dynamic-module=../ModSecurity-nginx #g"
nginx -V 2>&1 | grep 'configure arguments' | sed "s#configure arguments:#./configure --add-dynamic-module=../ModSecurity-nginx #g" |bash
make modules

当前结果:

[root@localhost nginx-1.16.1]# find . -name *modsecurity*
./objs/ngx_http_modsecurity_module_modules.c
./objs/addon/src/ngx_http_modsecurity_module.o
./objs/addon/src/ngx_http_modsecurity_pre_access.o
./objs/addon/src/ngx_http_modsecurity_header_filter.o
./objs/addon/src/ngx_http_modsecurity_body_filter.o
./objs/addon/src/ngx_http_modsecurity_log.o
./objs/addon/src/ngx_http_modsecurity_rewrite.o
./objs/ngx_http_modsecurity_module_modules.o
./objs/ngx_http_modsecurity_module.so
[root@localhost nginx-1.16.1]# 
  • 将生成的 modsecurity 相关文件复制到 rpmbuild 中
cd /root/
mkdir -p ./rpmbuild/BUILD
find . -type f -iname 'libmodsecurity.so.3.*' -exec cp {} ./rpmbuild/BUILD \;
find . -type f -iname 'ngx_http_modsecurity_module.so' -exec cp {} ./rpmbuild/BUILD \;

当前结果:

[root@localhost ~]# ls rpmbuild/BUILD/ -l
总用量 43780
-rwxr-xr-x. 1 root root 44442616 5月  19 15:49 libmodsecurity.so.3.0.4
-rwxr-xr-x. 1 root root   384824 5月  19 15:49 ngx_http_modsecurity_module.so
[root@localhost ~]# 

生成 rpm 安装包

  • vi /root/rpmbuild/SPECS/nginx-modsecurity.spec
Name: nginx-modsecurity3-centos7
Version: 3.0.4
Release: 1
Group: Applications/System
BuildArch: x86_64
Summary: modsecurity for nginx
License: GPL

%description
Brief description of software package.
Provides: libmodsecurity.so.3 nginx-modsecurity


%prep

%build

%install
mkdir -p %{buildroot}/opt/modsecurity
cp libmodsecurity.so.3.0.4 %buildroot/opt/modsecurity
cp ngx_http_modsecurity_module.so %buildroot/opt/modsecurity
%post
echo 'load_module "/usr/lib64/nginx/modules/ngx_http_modsecurity_module.so";' > /usr/share/nginx/modules/mod-modsecurity.conf
ln -sf /opt/modsecurity/ngx_http_modsecurity_module.so /usr/lib64/nginx/modules/ngx_http_modsecurity_module.so
cat > /etc/ld.so.conf.d/modsecurity.conf << EOF
/opt/modsecurity
EOF
ldconfig
%postun
rm -f /etc/ld.so.conf.d/modsecurity.conf
rm -f /usr/lib64/nginx/modules/ngx_http_modsecurity_module.so
rm -f /usr/share/nginx/modules/mod-modsecurity.conf
ldconfig


%clean

%files
/*
  • 生成 rpm 安装包
cd /root/rpmbuild/SPECS
rpmbuild -ba nginx-modsecurity.spec

最终生成的文件(见附件):

[root@localhost x86_64]# ls /root/rpmbuild/RPMS/x86_64/
nginx-modsecurity3-centos7-3.0.4-1.x86_64.rpm

安装 nginx 和 nginx_modsecurity3


  • 安装 nginx
yum -y install epel-release
yum -y install nginx-1.16.1

检查安装的 nginx 版本:

[root@localhost ~]# nginx -v
nginx version: nginx/1.16.1
  • 安装依赖
yum -y install yajl lua lmdb ssdeep
  • 下载 nginx-modsecurity3-centos7-3.0.4-1.x86_64.rpm

  • 安装 nginx-modsecurity3-centos7-3.0.4-1.x86_64.rpm

rpm -i nginx-modsecurity3-centos7-3.0.4-1.x86_64.rpm

结果检查:

[root@localhost /]# cd /usr/share/nginx/modules/
[root@localhost modules]# ls
mod-http-image-filter.conf  mod-http-perl.conf  mod-http-xslt-filter.conf  mod-mail.conf  mod-modsecurity.conf  mod-stream.conf

[root@localhost modules]# more mod-modsecurity.conf 
load_module "/usr/lib64/nginx/modules/ngx_http_modsecurity_module.so";

[root@localhost modules]# cd /usr/lib64/nginx/modules/
[root@localhost modules]# ls
ngx_http_image_filter_module.so  ngx_http_modsecurity_module.so  ngx_http_perl_module.so  ngx_http_xslt_filter_module.so  ngx_mail_module.so  ngx_stream_module.so

配置 modsecurity


Client ----- Nginx & ModSecurity ---- DVWA

下载配置文件

  • 下载 modsecurity.conf 配置文件
mkdir -p /etc/nginx/modsec
mkdir -p /etc/nginx/modsec/modsecurity
cd /etc/nginx/modsec/modsecurity/
wget https://raw.githubusercontent.com/SpiderLabs/ModSecurity/master/modsecurity.conf-recommended
mv modsecurity.conf-recommended modsecurity.conf
  • 下载 unicode.mapping 文件
cd /etc/nginx/modsec/modsecurity/
wget https://raw.githubusercontent.com/SpiderLabs/ModSecurity/master/unicode.mapping
  • 下载 OWASP CRS
cd /etc/nginx/modsec/modsecurity/
git clone --depth 1 -b v3.0/master https://github.com/SpiderLabs/owasp-modsecurity-crs.git
cd coreruleset/
mv crs-setup.conf.example crs-setup.conf

配置 modsecurity

  • 开启引擎: vi modesecurity.conf
# -- Rule engine initialization ----------------------------------------------

# Enable ModSecurity, attaching it to every transaction. Use detection
# only to start with, because that minimises the chances of post-installation
# disruption.
#
# SecRuleEngine DetectionOnly
SecRuleEngine On
  • 添加配置文件: vi /etc/nginx/modsec/main.conf
include /etc/nginx/default.d/modsecurity/modsecurity.conf
include /etc/nginx/default.d/modsecurity/coreruleset/crs-setup.conf
include /etc/nginx/default.d/modsecurity/coreruleset/rules/*.conf

配置 nginx

  • 配置 nginx.conf: vi /etc/nginx/nginx.conf
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        
        # server_name  $hostname;
        # root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        # Load modsecurity configuration files. 
        modsecurity_rules_file /etc/nginx/modsec/main.conf;

        location / {
            # Enable modsecurity for this block.
            modsecurity on;

            # Add backend server.
            proxy_pass http://183.169.1.12;

            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for;
            proxy_set_header Host $host:$server_port;
            proxy_set_header X-Forwarded_Proto $scheme;
        proxy_connect_timeout 600;
            proxy_send_timeout 600;
            proxy_read_timeout 600;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
  • 开启 nginx:systemctl start nginx

测试

  • SQLi


    SQLi
  • 访问日志: tail -f /var/log/nginx/access.log
183.168.1.11 - - [20/May/2020:18:25:19 +0800] "GET /?a=1%27=%271 HTTP/1.1" 403 153 "-" "curl/7.58.0" "-"
  • 错误日志:tail -f /var/log/nginx/error.log
2020/05/20 18:25:19 [error] 2373#0: *25 [client 183.168.1.11] ModSecurity: Access denied with code 403 (phase 2). Matched "Operator `Ge' with parameter `5' against variable `TX:ANOM
ALY_SCORE' (Value: `8' ) [file "/etc/nginx/modsec/modsecurity/coreruleset/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "80"] [id "949110"] [rev ""] [msg "Inbound Anomaly Score
 Exceeded (Total Score: 8)"] [data ""] [severity "2"] [ver "OWASP_CRS/3.2.0"] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [
tag "attack-generic"] [hostname "183.168.1.1"] [uri "/"] [unique_id "1589970319"] [ref ""], client: 183.168.1.11, server: , request: "GET /?a=1%27=%271 HTTP/1.1", host: "183.168.1.1
"

Reference:
https://github.com/SpiderLabs/ModSecurity/wiki/Compilation-recipes-for-v3.x
https://github.com/coreruleset/coreruleset/blob/v3.3/dev/crs-setup.conf.example

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343