使用ModSecurity和Nginx构建WAF
现在感觉有点晚了,但这是关于WebApplicationFireWall(ModSecurity)的文章。我们已经配置了一个能够进行WAF操作验证的环境,启动了Webgoat。
由于WAF的操作验证是目的,所以原本应该做的操作系统安全设置等都相对随意。如果考虑在生产环境中运行,请参考CIS基准等进行相应设置。
环境
-
- OS : CentOS7.9
-
- Kernel: 3.10.0-1160.49.1.el7.x86_64
-
- ModSecruity: v3.0.6-11-g76ce673
-
- Nginx: 1.18.0
-
- Tomcat: 7.0.76-16.el7_9
- webgoat: 7.0.1
2. 安装WebGoat
在安装WebGoat之前,请禁用SELinux并添加firewalld的端口许可设置。然后重新启动操作系统。如果您在生产环境中使用,请确保启用SELinux!
yum -y update
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload
shutdown -r now
我需要安装开发用的软件包。
yum groupinstall 'Development Tools' -y
yum -y install vim wget git policycoreutils-python libtool epel-release.noarch
我們要安裝Tomcat。
yum -y install tomcat
下载webgoat-container,并将其移动到webapps目录下。
wget https://github.com/WebGoat/WebGoat/releases/download/7.0.1/webgoat-container-7.0.1.war
mv webgoat-container-7.0.1.war /usr/share/tomcat/webapps/webgoat.war
systemctl start tomcat
3. 安装ModSecurity
安装ModSecurity所需的软件包。
yum -y install gcc-c++ flex bison yajl yajl-devel curl-devel curl GeoIP-devel doxygen zlib-devel pcre-devel lmdb lmdb-devel libxml2 libxml2-devel ssdeep ssdeep-devel lua lua-devel openssl openssl-devel
从Github下载ModSecurity的源代码并进行安装。
cd /opt/
git clone https://github.com/SpiderLabs/ModSecurity
cd ModSecurity
git checkout -b v3/master origin/v3/master
sh build.sh
git submodule init
git submodule update
./configure --with-lmdb --with-yajl
make
make install
オプション説明–with-yajlJSONライブラリであるYAILを有効にする。ModSecrutiyでは監査LOGをJSON形式で保存する場合必須となるコンパイルオプション-with-geoipGEOIPを有効にする(ModSecrutiy v2)–withmaxmindGEOIPを有効にする(ModSecrutiy v3)–withssdeepFuzzy Hashingによるマルウェア検出を有効にする–with-lmdbModSecurityのcollection保存⽤としてLMDBを有効にする–with-lualuaを有効にする。外部スクリプトを実⾏する際、Luaで書かれたスクリプトを実⾏する事を推奨されている–with-libxmlXMLを解析・操作するライブラリを有効にする–with-pcrePerl 5 互換の正規表現をC⾔語で実装したライブラリを有効にする
4. 安装Nginx
创建一个用于Nginx的用户。
groupadd -g 1001 nginx
useradd -u 1001 -g 1001 -d /var/lib/nginx -s /sbin/nologin -c "Nginx Web Server" nginx
我将安装Nginx。
cd ../
git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git
wget http://nginx.org/download/nginx-1.18.0.tar.gz
tar zxvf nginx-1.18.0.tar.gz
cd nginx-1.18.0
./configure --prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib64/nginx/module \
--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=/run/lock/subsys/nginx \
--user=nginx \
--group=nginx \
--with-http_addition_module \
--with-http_auth_request_module \
--with-http_realip_module \
--with-http_secure_link_module \
--with-http_slice_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-threads \
--add-dynamic-module=../ModSecurity-nginx \
--with-pcre \
--with-pcre-jit
make
make install
5. 创建Nginx启动前的Config文件。
mkdir /etc/nginx/conf.d
mkdir /etc/nginx/modules
mkdir /etc/nginx/modsecurity
cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules
cp ../ModSecurity/modsecurity.conf-recommended /etc/nginx/modsecurity/modsecurity.conf
cp ../ModSecurity/unicode.mapping /etc/nginx/modsecurity/
6. 安装CoreRuleSet(CRS)
下一步是下载WAF的CRS签名,并将其复制到/etc/nginx/modsecurity目录下。
cd ..
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git
mv owasp-modsecurity-crs/crs-setup.conf.example ./owasp-modsecurity-crs/crs-setup.conf
cp -pr owasp-modsecurity-crs /etc/nginx/modsecurity/
创建一个供Nginx加载的ModSecurity的conf文件。
vim /etc/nginx/modsecurity/modsec_includes.conf
include modsecurity.conf
include /etc/nginx/modsecurity/owasp-modsecurity-crs/crs-setup.conf
include /etc/nginx/modsecurity/owasp-modsecurity-crs/rules/*.conf
:wq
7. 修改Nginx配置文件
vim /etc/nginx/nginx.conf
load_module modules/ngx_http_modsecurity_module.so; #ファイルの一番上に追記
location / {
root html;
index index.html index.htm;
modsecurity on; #modsecurity有効化
modsecurity_rules_file /etc/nginx/modsecurity/modsec_includes.conf; #Configファイルを指定
proxy_pass http://localhost:8080/; #tomcatへのプロキシ設定
:wq
8. 制作Nginx启动脚本
vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
:wq
9. 权限变更和Nginx启动 hé Nginx
vim /etc/nginx/modsecurity/owasp-modsecurity-crs/rules/local-001.conf
SecRuleRemoveById 920350 #ipでアクセスしてもWAFルールで検知されないよう除外しておく
:wq
sed -i 's/SecDefaultAction "phase:1,log,auditlog,pass"/#SecDefaultAction "phase:1,log,auditlog,pass"/g' /etc/nginx/modsecurity/owasp-modsecurity-crs/crs-setup.conf
sed -i 's/SecDefaultAction "phase:2,log,auditlog,pass"/#SecDefaultAction "phase:2,log,auditlog,pass"/g' /etc/nginx/modsecurity/owasp-modsecurity-crs/crs-setup.conf
sed -i 's/# SecDefaultAction "phase:1,log,auditlog,deny,status:403"/SecDefaultAction "phase:1,log,auditlog,deny,status:403"/g' /etc/nginx/modsecurity/owasp-modsecurity-crs/crs-setup.conf
sed -i 's/# SecDefaultAction "phase:2,log,auditlog,deny,status:403"/SecDefaultAction "phase:2,log,auditlog,deny,status:403"/g' /etc/nginx/modsecurity/owasp-modsecurity-crs/crs-setup.conf
cd /etc
chown -R nginx:nginx nginx
nginx -t
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file /etc/nginx/nginx.conf test is successful
systemctl start nginx
chown root:nginx /var/log/modsec_audit.log
systemctl restart nginx
10. 进行操作确认
如果要将ModSecurity的默认模式更改为阻止模式,请将/etc/nginx/modsecurity/modsecurity.conf文件中的SecRuleEngine从DetectionOnly更改为On。
由于WebGoat是为了学习和实践Web应用程序的弱点而创建的,所以我想在另一篇文章中写一下它在ModSecurity下的防护情况。