使用ModSecurity实现Nginx的WAF功能

ModSecurity 原本是Apache上的一款开源 WAF,可以有效的增强web安全性,目前已经支持 Nginx 配合 Nginx 的灵活和高效,可以打造成生产级的 WAF,是保护和审核 Web 安全的利器。

准备工作

环境:CentOS
Nginx:http://nginx.org/download/nginx-1.19.1.tar.gz
Modsecurity for Nginx:https://www.modsecurity.org/tarball/2.9.3/modsecurity-2.9.3.tar.gz
OWASP规则集: https://github.com/SpiderLabs/owasp-modsecurity-crs

安装依赖

1
2
3
4
# Nginx 依赖
$ yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel
# ModSecurity 依赖
$ yum -y install httpd-devel apr apr-util-devel apr-devel pcre pcre-devel libxml2 libxml2-devel

启用standalone模块并编译

1
2
3
4
5
6
7
$ cd /usr/local/src
$ wget https://www.modsecurity.org/tarball/2.9.3/modsecurity-2.9.3.tar.gz
$ tar zxvf modsecurity-2.9.3.tar.gz
$ cd modsecurity-2.9.3
$ sudo ./autogen.sh
$ sudo ./configure --enable-standalone-module --disable-mlogc
$ sudo make

下载并编译Nginx

1
2
3
4
5
6
7
$ cd /usr/local/src
$ wget http://nginx.org/download/nginx-1.19.1.tar.gz
$ tar zxvf nginx-1.19.1.tar.gz
$ cd nginx-1.19.1
$ ./configure --add-module=/usr/local/src/modsecurity-2.9.3/nginx/modsecurity --with-http_ssl_module
$ sudo make
$ sudo make install

添加规则

ModSecurity 倾向于过滤和阻止 Web 危险,之所以强大就在于规则,OWASP提供的规则是于社区志愿者维护的,被称为核心规则CRS(corerules),规则可靠强大,当然也可以自定义规则来满足各种需求。

下载OWASP规则:

1
2
3
4
$ cd /usr/local/nginx/conf
$ git clone https://github.com/SpiderLabs/owasp-modsecurity-crs
$ cd owasp-modsecurity-crs
$ mv modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf

启用OWASP规则

1
2
3
4
5
6
$ cp /usr/local/src/modsecurity-2.9.3/modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf
$ cp /usr/local/src/modsecurity-2.9.3/unicode.mapping /usr/local/nginx/conf/unicode.mapping
# 将 SecRuleEngine 设置为 on
$ vim /usr/local/nginx/conf/modsecurity.conf

SecRuleEngine on

owasp-modsecurity-crs 下有很多存放规则的文件夹,例如 base_rulesexperimental_rulesoptional_rulesslr_rules,里面的规则按需要启用,需要启用的规则使用Include进来即可。

1
2
3
4
5
6
7
8
9
10
# 配置规则
$ vim /usr/local/nginx/conf/modsecurity.conf

Include owasp-modsecurity-crs/modsecurity_crs_10_setup.conf
Include owasp-modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks.conf
Include owasp-modsecurity-crs/base_rules/modsecurity_crs_41_xss_attacks.conf
Include owasp-modsecurity-crs/base_rules/modsecurity_crs_40_generic_attacks.conf
Include owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_dos_protection.conf
Include owasp-modsecurity-crs/experimental_rules/modsecurity_crs_11_brute_force.conf
Include owasp-modsecurity-crs/optional_rules/modsecurity_crs_16_session_hijacking.conf

配置Nginx

只需在 Nginx 配置文件 location 中加入 ModSecurityEnabledModSecurityConfig 即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ vim /usr/local/nginx/conf/nginx.conf

server {
listen 80;

location / {
    ModSecurityEnabled on;
    ModSecurityConfig modsecurity.conf;
        proxy_pass http://upstream;
        proxy_redirect        off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

参考

本文主要参考以上文章,一些成果归功于原文作者。