为 Nginx 安装 Mod_Security 无需重新编译

jul*_*lio 2 security nginx web-server mod-security

我已经完成了 LEMP 的所有设置。现在我想添加mod_security

我试图研究,但我能找到的只是关于如何重新编译 nginx 的说明。有没有办法添加 mod_security 而不需要重新编译?

我目前正在运行安装了 PPA 的 nginx/1.9.15,因为我在使用 HTTP/2。我没有编译 nginx 的经验,我不知道如果我重新编译我会破坏 nginx,因为我是从 PPA 得到的。

希望你能帮忙。

谢谢你。

Vah*_*eni 5

您可以通过添加 ModSecurity 作为动态模块或使用 Dockerized 和强化的 Nginx 容器来实现。

将 ModSecurity 与 Docker 结合使用

使用默认设置运行 HTTP 服务器

docker run -p 80:80 -v /path/to/web/files:/www bunkerity/bunkerized-nginx
Run Code Online (Sandbox Code Playgroud)

使用自动化的 Let's Encrypt 运行 HTTPS 服务器

docker run -p 80:80 -p 443:443 -v /path/to/web/files:/www -v /where/to/save/certificates:/etc/letsencrypt -e SERVER_NAME=www.yourdomain.com -e AUTO_LETS_ENCRYPT=yes -e REDIRECT_HTTP_TO_HTTPS=yes bunkerity/bunkerized-nginx
Run Code Online (Sandbox Code Playgroud)

证书存储在 /etc/letsencrypt 目录中,您应该将其保存在本地驱动器上。
如果您不希望您的网络服务器侦听 HTTP,请添加LISTEN_HTTP带有“no”值的环境变量。但是 Let's Encrypt 需要打开端口 80,因此必须重定向端口。

这里有三个环境变量:

  • SERVER_NAME:定义您的网络服务器的 FQDN,这对于 Let's Encrypt 是必需的(www.yourdomain.com应指向您的 IP 地址)
  • AUTO_LETS_ENCRYPT : 启用自动 Let's Encrypt 创建和更新证书
  • REDIRECT_HTTP_TO_HTTPS : 启用 HTTP 到 HTTPS 重定向

Docker Hub : bunkerized-nginx

要求:NGINX 1.11.5 及更高版本。

第 1 步:安装所需的软件包

apt-get install -y apt-utils autoconf automake build-essential git libcurl4-openssl-dev libgeoip-dev liblmdb-dev libpcre++-dev libtool libxml2-dev libyajl-dev pkgconf wget zlib1g-dev
Run Code Online (Sandbox Code Playgroud)

##Step 2:下载并编译 ModSecurity 3 源代码##

git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity
cd ModSecurity
git submodule init
git submodule update
./build.sh
./configure
make
make install
Run Code Online (Sandbox Code Playgroud)

注意:编译大约需要 15 分钟,具体取决于您系统的处理能力。#Step 3:下载用于 ModSecurity 的 NGINX 连接器并将其编译为动态模块#

git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git
wget http://nginx.org/download/nginx-1.13.7.tar.gz 
tar zxvf nginx-1.13.7.tar.gz 
cd nginx-1.13.7
./configure --with-compat --add-dynamic-module=../ModSecurity-nginx
make modules
cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules
Run Code Online (Sandbox Code Playgroud)

##Step 4 : 加载 NGINX ModSecurity 连接器动态模块 ## 将此行添加到/etc/nginx/nginx.conf

load_module modules/ngx_http_modsecurity_module.so;
Run Code Online (Sandbox Code Playgroud)

##Step 5 : 配置和启用## 设置适当的 ModSecurity 配置文件。在这里,我们使用由 ModSecurity 的企业赞助商 TrustWave Spiderlabs 提供的推荐的 ModSecurity 配置。

mkdir /etc/nginx/modsec
wget -P /etc/nginx/modsec/ https://raw.githubusercontent.com/SpiderLabs/ModSecurity/v3/master/modsecurity.conf-recommended
wget -P /etc/nginx/modsec/ https://raw.githubusercontent.com/SpiderLabs/ModSecurity/v3/master/unicode.mapping
mv /etc/nginx/modsec/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf
Run Code Online (Sandbox Code Playgroud)

更改配置中的 SecRuleEngine 指令,从默认的“仅检测”模式更改为主动丢弃恶意流量。

sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' /etc/nginx/modsec/modsecurity.conf
Run Code Online (Sandbox Code Playgroud)

配置一个或多个规则。出于本博客的目的,我们正在创建一个简单的规则,该规则会丢弃一个请求,其中名为 testparam 的 URL 参数在其值中包含字符串 test。将以下文本放入/etc/nginx/modsec/main.conf

# From https://github.com/SpiderLabs/ModSecurity/blob/master/\
# modsecurity.conf-recommended
#
# Edit to set SecRuleEngine On
Include "/etc/nginx/modsec/modsecurity.conf"


# Basic test rule
SecRule ARGS:testparam "@contains test" "id:1234,deny,status:403"
Run Code Online (Sandbox Code Playgroud)

将 modsecurity 和 modsecurity_rules_file 指令添加到 NGINX 配置以启用 ModSecurity:

server {
    # ...
    modsecurity on;
    modsecurity_rules_file /etc/nginx/modsec/main.conf;
}
Run Code Online (Sandbox Code Playgroud)

来源:nginx.com