Rocky Linux 8 使用 Nginx 安装 ModSecurity

ModSecurity 是一种流行的免费开源 Web 应用程序防火墙,用于保护 Web 应用程序免受多种类型的攻击,包括 SQL 注入、跨站点脚本和本地文件包含。 它经常用于保护网站、cPanel 和其他托管控制面板。 虽然 ModSecurity 主要是为 Apache 网络服务器设计的,但它也可以与 Nginx 网络服务器一起使用。

在这篇文章中,我们将向我们展示 Rocky Linux 8 上使用 Nginx 安装 ModSecurity。

先决条件

  • 在 云平台上运行 Rocky Linux 8 的服务器
  • 在我们的服务器上配置的 root 密码

第 1 步 – 创建 云服务器

首先,登录到我们的 云服务器。 创建一个新服务器,选择 Rocky Linux 8 作为至少 2GB RAM 的操作系统。 通过 SSH 连接到我们的云服务器并使用页面顶部突出显示的凭据登录。

登录到服务器后,运行以下命令以使用最新的可用软件包更新基本系统。

dnf update -y

第 2 步 – 安装所需的依赖项

首先,我们需要在服务器上安装所有必需的依赖项。 我们可以使用以下命令安装所有这些:

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 -y

接下来,使用以下命令安装 EPEL 和 Remi 存储库:

dnf install epel-release https://rpms.remirepo.net/enterprise/remi-release-8.rpm -y

接下来,使用以下命令安装 GeoIP:

dnf --enablerepo=remi install GeoIP-devel -y

第 3 步 – 安装 ModSecurity

首先,使用以下命令下载最新版本的 ModSecurity:

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

接下来,将目录更改为 ModSecurity 并使用以下命令安装其他模块:

cd ModSecurity
git submodule init
git submodule update

接下来,使用以下命令编译和安装 ModSecurity:

./build.sh
./configure
make
make install

第 4 步 – 安装带有 LibModsecurity 支持的 Nginx

为了在 Nginx 中启用 LibModsecurity 支持,我们需要编译支持 LibModsecurity 的 Nginx。

首先,使用以下命令下载 ModSecurity-nginx 连接器:

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

接下来,使用以下命令下载 Nginx 的最新稳定版本:

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

接下来,使用以下命令提取下载的文件:

tar xzf nginx-1.19.10.tar.gz

接下来,使用以下命令为 Nginx 创建一个用户:

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

接下来,将目录更改为 Nginx 源并使用以下命令进行编译:

cd nginx-1.19.10
./configure --user=nginx --group=nginx --with-pcre-jit --with-debug --with-http_ssl_module --with-http_realip_module --add-module=/root/ModSecurity-nginx

接下来,使用以下命令安装它:

make
make install

接下来,使用以下命令复制示例 ModSecurity 配置文件和 Unicode 映射文件:

cp /root/ModSecurity/modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf
cp /root/ModSecurity/unicode.mapping /usr/local/nginx/conf/

接下来,备份 Nginx 配置文件:

cp /usr/local/nginx/conf/nginx.conf{,.bak}

接下来,使用以下命令编辑 Nginx 配置文件:

nano /usr/local/nginx/conf/nginx.conf

删除所有行并添加以下行:

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.example.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;
        }
    }
}

保存并关闭文件,然后创建一个 Nginx 日志目录:

mkdir /var/log/nginx

第 5 步 – 为 Nginx 创建一个 Systemd 服务文件

接下来,我们将需要创建一个 systemd 服务文件来管理 Nginx 服务。 我们可以使用以下命令创建它:

nano /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 二进制文件的符号链接:

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

接下来,重新加载 systemd 守护进程以应用更改:

systemctl daemon-reload

接下来,启动 Nginx 服务并使其在系统重新启动时启动:

systemctl enable --now nginx

我们可以使用以下命令检查 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 Mon 2021-11-08 09:59:48 UTC; 5s ago
  Process: 73046 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 73044 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 73043 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
 Main PID: 73048 (nginx)
    Tasks: 2 (limit: 11411)
   Memory: 3.2M
   CGroup: /system.slice/nginx.service
           ├─73048 nginx: master process /usr/sbin/nginx
           └─73049 nginx: worker process

Nov 08 09:59:48 rockylinux systemd[1]: Starting The nginx HTTP and reverse proxy server...
Nov 08 09:59:48 rockylinux nginx[73044]: nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
Nov 08 09:59:48 rockylinux nginx[73044]: nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
Nov 08 09:59:48 rockylinux systemd[1]: nginx.service: Failed to parse PID from file /run/nginx.pid: Invalid argument
Nov 08 09:59:48 rockylinux systemd[1]: Started The nginx HTTP and reverse proxy server.

第 6 步 – 启用 ModSecurity 规则

默认情况下,ModSecurity 已配置为仅检测模式,因此我们需要在 modsecurity.conf 文件中启用 ModSecurity 规则。

我们可以使用以下命令启用它:

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

此外,使用以下命令启用审核日志:

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

第 7 步 – 安装 OWASP ModSecurity 核心规则集

OWASP 为 ModSecurity 提供通用的攻击检测规则。 我们可以使用以下命令下载它:

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

接下来,使用以下命令重命名 OWASP 规则配置文件:

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

接下来,在 ModSecurity 配置文件中定义 OWASP 规则:

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

接下来,重新启动 Nginx 服务以应用更改:

systemctl restart nginx

第 8 步 – 验证 ModSecurity

至此,Nginx 已安装并配置了 ModSecurity 支持。 现在是测试它的时候了。

使用 curl 命令运行以下命令注入:

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

如果一切正常,我们应该会收到“403 Forbidden”错误,如下所示:


403 Forbidden

403 Forbidden


nginx/1.19.10

我们还可以验证 ModSecurity 日志以获取更多信息:

tail -100 /var/log/nginx/modsec_audit.log

我们应该看到以下输出:

---imefFQJy---D--

---imefFQJy---E--
\x0d\x0a403 Forbidden\x0d\x0a\x0d\x0a

403 Forbidden

\x0d\x0a
nginx/1.19.10
\x0d\x0a\x0d\x0a\x0d\x0a ---imefFQJy---F-- HTTP/1.1 403 Server: nginx/1.19.10 Date: Mon, 08 Nov 2021 10:00:55 GMT Content-Length: 154 Content-Type: text/html Connection: keep-alive ---imefFQJy---H-- 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 "1636365655"] [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 "80"] [id "949110"] [rev ""] [msg "Inbound Anomaly Score Exceeded (Total Score: 5)"] [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 "127.0.0.1"] [uri "/index.html"] [unique_id "1636365655"] [ref ""]

在上述指南中,我们解释了 Rocky Linux 8 上使用 Nginx 安装 ModSecurity。我们的 Nginx Web 服务器现在使用 ModSecurity WAF 保护。 ModSecurity 可以保护我们的服务器免受各种攻击。 立即从 开始使用 VPS 托管!

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发

请登录后发表评论