在CentOS 8上使用Nginx配置LibModsecurity

在本指南中,您将学习如何在CentOS 8上使用Nginx配置LibModsecurity。 LibMosecurity是 ModSecurity 2.9版或更低版本。因此,它被称为ModSecurity版本3。

在CentOS 8上使用Nginx配置LibModsecurity

执行系统更新

首先更新系统软件包。

dnf update

安装所需的构建工具和依赖项

由于Nginx和LibModsecurity都是从源代码编译的,因此需要许多构建工具和依赖项。要安装它们,请运行以下命令:

dnf install gcc-c++ flex bison yajl curl-devel curl zlib-devel pcre-devel autoconf automake git curl make libxml2-devel pkgconfig libtool httpd-devel redhat-rpm-config git wget openssl openssl-devel vim
dnf --enablerepo=PowerTools install doxygen yajl-devel

安装GeoIP库

dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
dnf --enablerepo=remi install GeoIP-devel

下载LibModsecurity源代码

创建一个临时目录来存储源tarball。

mkdir /tmp/modsec

您可以选择使用 /opt 相反。

运行以下命令以克隆最新的LibModsecurity GitHub存储库。

cd /tmp/modsec
git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity

编译并安装LibModsecurity

导航到LibModsecurity源目录并配置,编译和安装

cd ModSecurity

下载libInjection代码,它作为git子模块形式的ModSecurity源代码的一部分提供

git submodule init
git submodule update

配置LibModsecurity以适合您的系统并检查所需的依赖性。

./build.sh
./configure

致命:找不到名称,无法解释任何内容 您可以放心地忽略它。如果您有依赖性问题,请修复它。

编译并安装LibModSecurity。

make
make install

安装具有LibModsecurity支持的Nginx

要使用LibModsecurity设置Nginx,您需要编译支持LibModsecurity的Nginx。

因此,克隆git存储库并下载ModSecurity-nginx连接器,该连接器提供了Nginx和LibModsecurity之间的通信通道。

cd /tmp/modsec
git clone https://github.com/SpiderLabs/ModSecurity-nginx.git

接下来,从以下位置下载Nginx的最新主要版本: Nginx下载。在撰写本文时,最新版本为 nginx-1.17.6.tar.gz

wget http://nginx.org/download/nginx-1.17.6.tar.gz

解压缩档案。

tar xzf nginx-1.17.6.tar.gz

创建非特权的Nginx系统用户和组。

useradd -r -M -s /sbin/nologin -d /usr/local/nginx nginx

转到Nginx源目录并进行配置。

cd nginx-1.17.6
./configure --user=nginx --group=nginx --with-pcre-jit --with-debug --with-http_ssl_module --with-http_realip_module --add-module=/tmp/modsec/ModSecurity-nginx

编译并安装Nginx。

make
make install

使用ModSecurity配置Nginx

首先,将示例ModSecurity配置文件从源目录复制到Nginx配置目录。

cp /tmp/modsec/ModSecurity/modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf

复制 unicode.mapping 从ModSecurity源目录到Nginx配置目录的文件。

cp /tmp/modsec/ModSecurity/unicode.mapping /usr/local/nginx/conf/

接下来,编辑Nginx配置文件并进行如下所示的更改。

创建Nginx配置文件的备份。

cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak

打开配置文件进行编辑。

vim /usr/local/nginx/conf/nginx.conf

配置Nginx,使您的配置如下所示:

user  nginx;
worker_processes  1;
pid        /run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  nginx.kifarunix-demo.com;
        modsecurity  on;
        modsecurity_rules_file  /usr/local/nginx/conf/modsecurity.conf;
        access_log  /var/log/nginx/access_kifarunix-demo.log;
        error_log  /var/log/nginx/error_kifarunix-demo.log;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

注意行。

modsecurity  on;
modsecurity_rules_file  /usr/local/nginx/conf/modsecurity.conf;

打开Modsecurity并指定Modsecurity规则的位置。

请注意,可以在每个目录中打开ModSecurity 3。

创建一个Nginx日志目录。

mkdir /var/log/nginx

创建一个Nginx Systemd服务

要使Nginx能够作为服务运行,请创建如下所示的systemd服务。

vim /etc/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=mixed
PrivateTmp=true

[Install]
WantedBy=multi-user.target

为Nginx二进制文件创建符号链接 /usr/sbin/ 路。

ln -s /usr/local/nginx/sbin/nginx /usr/sbin/

重新加载systemd配置。

systemctl daemon-reload

对Nginx配置执行语法错误验证。

nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

如果一切顺利,请启动Nginx并在系统启动时运行。

systemctl enable --now nginx

检查状态。

systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/etc/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2019-11-30 09:52:05 EAT; 9s ago
  Process: 2679 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 2678 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 2676 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
 Main PID: 2681 (nginx)
    Tasks: 2 (limit: 11524)
   Memory: 3.5M
   CGroup: /system.slice/nginx.service
           ├─2681 nginx: master process /usr/sbin/nginx
           └─2682 nginx: worker process
...

启用ModSecurity规则引擎

默认情况下,ModSecurity设置为仅检测模式,该模式仅记录请求而不会基于触发的规则进行阻止。可以通过设置以下值来更改: SecRuleEngineOn

sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' /usr/local/nginx/conf/modsecurity.conf

您还可以更改Modsecurity的默认日志目录

sed -i 's#/var/log/modsec_audit.log#/var/log/nginx/modsec_audit.log#' /usr/local/nginx/conf/modsecurity.conf

安装OWASP ModSecurity核心规则集(CRS)

OWASP ModSecurity核心规则集(CRS) 与ModSecurity一起使用的一组通用攻击检测规则。它旨在保护Web应用程序免受各种攻击,包括OWASP Top 10,最少的错误警报。

从克隆CRS GitHub存储库/usr/local/nginx/conf/ 如下图所示。

git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git /usr/local/nginx/conf/owasp-crs

然后更改名称 crs-setup.conf.examplecrs-setup.conf

sudo cp /usr/local/nginx/conf/owasp-crs/crs-setup.conf{.example,}

设置OWASP规则后,将ModSecurity配置为使用这些规则。因此,您必须通过在ModSecurity配置文件中输入以下行来指定规则的位置:

echo -e "Include owasp-crs/crs-setup.confnInclude owasp-crs/rules/*.conf" >> /usr/local/nginx/conf/modsecurity.conf

此命令添加以下行 /usr/local/nginx/conf/modsecurity.conf

Include owasp-crs/crs-setup.conf
Include owasp-crs/rules/*.conf

再次检查Nginx配置文件。

nginx -t

然后,如果一切正常,请重新启动Nginx。

systemctl restart nginx

使用Nginx测试ModSecurity

然后,您可以使用命令注入来测试OWASP规则中Modsecurity的有效性。执行以下命令。

curl localhost/index.html?exec=/bin/bash

需要得到 403 Forbidden 如果规则是文件。


403 Forbidden

403 Forbidden


nginx/1.17.6

检查日志文件。

tail /var/log/nginx/mod
ModSecurity: Warning. Matched "Operator `PmFromFile' with parameter `unix-shell.data' against variable `ARGS:exec' (Value: `/bin/bash' ) [file "/usr/local/nginx/conf/owasp-crs/rules/REQUEST-932-APPLICATION-ATTACK-RCE.conf"] [line "496"] [id "932160"] [rev ""] [msg "Remote Command Execution: Unix Shell Code Found"] [data "Matched Data: bin/bash found within ARGS:exec: /bin/bash"] [severity "2"] [ver "OWASP_CRS/3.2.0"] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-shell"] [tag "platform-unix"] [tag "attack-rce"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "OWASP_CRS/WEB_ATTACK/COMMAND_INJECTION"] [tag "WASCTC/WASC-31"] [tag "OWASP_TOP_10/A1"] [tag "PCI/6.5.2"] [hostname "127.0.0.1"] [uri "/index.html"] [unique_id "157509875732.654695"] [ref "o1,8v21,9t:urlDecodeUni,t:cmdLine,t:normalizePath,t:lowercase"]
ModSecurity: Access denied with code 403 (phase 2). Matched "Operator `Ge' with parameter `5' against variable `TX:ANOMALY_SCORE' (Value: `5' ) [file "/usr/local/nginx/conf/owasp-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "79"] [id "949110"] [rev ""] [msg "Inbound Anomaly Score Exceeded (Total Score: 5)"] [data ""] [severity "2"] [ver ""] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-generic"] [hostname "127.0.0.1"] [uri "/index.html"] [unique_id "157509875732.654695"] [ref ""]
ModSecurity: Warning. Matched "Operator `Ge' with parameter `5' against variable `TX:INBOUND_ANOMALY_SCORE' (Value: `5' ) [file "/usr/local/nginx/conf/owasp-crs/rules/RESPONSE-980-CORRELATION.conf"] [line "76"] [id "980130"] [rev ""] [msg "Inbound Anomaly Score Exceeded (Total Inbound Score: 5 - SQLI=0,XSS=0,RFI=0,LFI=0,RCE=5,PHPI=0,HTTP=0,SESS=0): individual paranoia level scores: 5, 0, 0, 0"] [data ""] [severity "0"] [ver ""] [maturity "0"] [accuracy "0"] [tag "event-correlation"] [hostname "127.0.0.1"] [uri "/index.html"] [unique_id "157509875732.654695"] [ref ""]

您也可以创建自己的测试规则。例如,替换以下行 /usr/local/nginx/conf/modsecurity.conf

SecRule ARGS "@streq test" "id:1,phase:1,deny,msg:'Mytest Rule'"

保存配置文件。您还可以创建一个自定义规则文件,并验证它是否包含在主ModSecurity配置文件中。

重新启动Nginx。

systemctl restart nginx

测试规则。

curl localhost/index.html?a=test

403 Forbidden

403 Forbidden


nginx/1.17.6

检查日志文件。

ModSecurity: Access denied with code 403 (phase 1). Matched "Operator `StrEq' with parameter `test' against variable `ARGS:a' (Value: `test' ) [file "/usr/local/nginx/conf/modsecurity.conf"] [line "254"] [id "1"] [rev ""] [msg "'Mytest Rule'"] [data ""] [severity "0"] [ver ""] [maturity "0"] [accuracy "0"] [hostname "127.0.0.1"] [uri "/index.html"] [unique_id "157509886780.823503"] [ref "v18,4"]

这将运行ModSecurity并保护Web服务器。到此结束有关如何在CentOS 8上使用Nginx配置LibModsecurity的教程。

如果要运行某些需要安装LAMP堆栈/ LEMP堆栈的Web应用程序,则可以按照以下链接在CentOS 8上设置LEMP / LAMP堆栈。

在CentOS 8上安装LEMP堆栈

在CentOS 8上安装LAMP堆栈

单击下面的链接以找到有关ModSecurity的其他指南。

在Ubuntu 18.04上使用Apache安装LibModsecurity

在Fedora 30/29 / CentOS 7上使用Apache安装LibModsecurity

Sidebar