Nginx安全

1.1 安全通信四大原则

安全的网络通信必须满足以下四个核心原则,这也是 HTTPS 的设计基石:

  • 机密性:通过加密算法对数据进行加密处理,即使数据被中间人窃听,也无法获取明文内容,从根源上解决窃听风险。
  • 完整性:通过摘要算法与数字签名验证数据完整性,确保数据在传输过程中未被篡改,哪怕修改一个标点符号,接收方也能立即识别并拒绝非法报文。
  • 身份认证:通过数字证书确认通信双方的真实身份,解决冒充风险,避免用户访问钓鱼网站或被中间人劫持。
  • 不可否认:通过数字签名技术,确保已发生的通信行为无法被抵赖,类似电子借条的法律效力,避免交易纠纷。

1.2 HTTPS 架构与发展

HTTPS 本质是HTTP + SSL/TLS,在 TCP 与 HTTP 之间增加了 SSL/TLS 加密层,实现应用层数据的加解密。自 2016 年起,国内互联网巨头开始大力推行 HTTPS,相关里程碑事件包括:

  • Google 搜索引擎将 HTTPS 站点纳入搜索排名权重,安全站点获得更高曝光;
  • 2017 年起,Chrome 浏览器将纯 HTTP 站点标记为 "不安全";
  • 苹果 App Store、微信小程序强制要求使用 HTTPS 加密链接;
  • HTTP/2 等新一代协议的支持,必须以 HTTPS 为基础。

二、Nginx 编译安装与基础安全配置

Nginx 是目前最主流的高性能 Web 服务器与反向代理软件,为了实现完整的安全功能,推荐采用编译安装方式,便于自定义模块与安全参数。

2.1 编译安装 Nginx

(1)安装依赖环境

Nginx 的编译需要依赖 pcre、zlib、OpenSSL 等开发库,执行以下命令安装:

bash

复制代码
dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker git wget tar
(2)创建运行用户与日志目录

为了最小化权限风险,创建专用的 nginx 运行用户,避免使用 root 权限运行服务:

bash

复制代码
useradd -M -s /sbin/nologin nginx
mkdir -p /var/log/nginx
chown -R nginx:nginx /var/log/nginx
(3)编译与安装

下载 Nginx 源码包并编译,启用 SSL、HTTP/2 等核心安全模块:

bash

复制代码
tar zxf nginx-1.26.3.tar.gz
cd nginx-1.26.3
./configure \
  --prefix=/usr/local/nginx \
  --user=nginx \
  --group=nginx \
  --with-http_ssl_module \
  --with-http_v2_module \
  --with-http_realip_module \
  --with-http_stub_status_module \
  --with-http_gzip_static_module \
  --with-pcre \
  --with-stream
make && make install
(4)配置系统服务

创建 systemd 服务文件,实现 Nginx 的开机自启与进程管理:

bash

复制代码
vi /lib/systemd/system/nginx.service

文件内容如下:

ini

复制代码
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target

[Service]
Type=forking
ExecStartPre=/usr/local/sbin/nginx -t
ExecStart=/usr/local/sbin/nginx
ExecReload=/usr/local/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
User=root
Group=root

[Install]
WantedBy=multi-user.target

加载服务并启动:

bash

复制代码
systemctl daemon-reload
systemctl start nginx
systemctl enable nginx

2.2 核心安全加固配置

(1)隐藏版本号

生产环境中泄露 Nginx 版本号会被攻击者利用,针对性发起版本相关漏洞攻击,需隐藏版本信息:

bash

复制代码
vi /usr/local/nginx/conf/nginx.conf

http块中添加:

nginx

复制代码
http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens off;  # 隐藏版本号
    # ... 其他配置
}

验证配置:

bash

复制代码
nginx -t
nginx -s reload
curl -I 192.168.10.101

此时响应头中Server字段将不再显示版本号,仅显示nginx

(2)限制危险请求方法

HTTP 协议中存在多种高风险请求方法,如 TRACE(易引发 XST 攻击)、PUT/DELETE(文件篡改风险)、CONNECT(代理滥用),需通过配置白名单限制:

nginx

复制代码
server {
    # ... 其他配置
    if ($request_method !~ ^(GET|HEAD|POST)$ ) {
        return 444;  # 非白名单方法直接关闭连接
    }
}

验证测试:

bash

复制代码
curl -XPUT -I 192.168.10.101
# 预期结果:Empty reply from server
# 查看日志:tail /usr/local/nginx/logs/access.log | grep 444

⚠️ 注意:TRACE 和 CONNECT 方法会被 Nginx 核心层直接拦截,不会进入 location 处理流程,因此状态码可能为 405 或 400,而非 444。

(3)CC 攻击防御(请求速率限制)

CC 攻击(Challenge Collapsar)通过大量伪造请求耗尽服务器资源,使用 Nginx 的limit_req模块可有效限制请求速率:

nginx

复制代码
http {
    # 定义限制区:10MB内存,每个IP每秒最多10次请求
    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
    
    server {
        # ... 其他配置
        limit_req zone=req_limit burst=20 nodelay;
    }
}

参数说明:

  • zone=req_limit:10m:创建名为req_limit的共享内存区,大小 10MB,用于存储客户端 IP 信息;
  • rate=10r/s:限制每个 IP 每秒最多 10 次请求;
  • burst=20:设置等候队列,超出速率的请求可排队等待;
  • nodelay:立即处理等候队列中的请求,避免延迟。

压力测试验证:

bash

复制代码
# 安装ab测试工具
dnf install httpd-tools -y
# 发起300次请求,并发30个
ab -n 300 -c 30 http://192.168.10.101/
# 查看日志,大量请求将返回503状态码
tail -300 /usr/local/nginx/logs/access.log | grep -c 503
(4)防盗链配置

盗链行为会消耗服务器带宽并侵犯版权,通过验证请求来源实现防盗链:

nginx

复制代码
server {
    location ~* \.(jpg|jpeg|png|gif|ico)$ {
        valid_referers none blocked www.aaa.com;
        if ($invalid_referer) {
            return 403;  # 非法来源直接拒绝
        }
    }
}
  • valid_referers:指定合法的请求来源域名;
  • $invalid_referer:当请求来源不在白名单时,变量值为真,返回 403 拒绝访问。

三、HTTPS 证书生成与 Nginx 配置

HTTPS 的核心是 SSL/TLS 证书,分为CA 签名证书 (受浏览器信任)和自签名证书(用于测试 / 内部环境)。

3.1 生成自签名证书(测试环境)

使用 OpenSSL 生成自签名证书与私钥:

bash

复制代码
# 创建证书存储目录
mkdir -p /etc/nginx/ssl
# 生成证书与私钥(有效期365天,2048位RSA密钥)
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout /etc/nginx/ssl/nginx-selfsigned.key \
  -out /etc/nginx/ssl/nginx-selfsigned.crt \
  -subj "/C=CN/ST=Beijing/L=Beijing/O=MyOrg/CN=localhost"

参数说明:

  • -x509:生成自签名证书(而非 CSR 请求);
  • -nodes:不加密私钥,避免重启服务时输入密码;
  • -days 365:证书有效期 1 年;
  • -subj:指定证书主题信息,可按需修改。

3.2 Nginx 启用 HTTPS

修改 Nginx 配置文件,监听 443 端口并配置证书:

nginx

复制代码
server {
    listen 443 ssl;  # 监听HTTPS端口
    server_name localhost;  # 域名或IP
    
    # 指定证书与私钥路径
    ssl_certificate /etc/nginx/ssl/nginx-selfsigned.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx-selfsigned.key;
    
    # SSL协议与加密套件配置(提升安全性)
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers on;
    
    # 网站根目录配置
    location / {
        root /usr/local/nginx/html;
        index index.html;
    }
}

# 可选:将HTTP请求重定向到HTTPS
server {
    listen 80;
    server_name localhost;
    return 301 https://$host$request_uri;
}

验证并重载配置:

bash

复制代码
nginx -t
nginx -s reload

此时访问https://192.168.10.101即可启用 HTTPS 加密传输(自签名证书会被浏览器提示不安全,生产环境需使用 CA 签名证书)。


四、高级防护:动态黑名单

动态黑名单是 Nginx 中实时拦截恶意请求的高效机制,可在不重启服务的情况下更新封禁 IP,适用于高并发攻击场景。

4.1 配置动态黑名单

(1)创建黑名单文件

bash

复制代码
vi /usr/local/nginx/conf/blockips.conf

添加需要封禁的 IP 或网段:

plaintext

复制代码
192.168.1.0/24 1;  # 封禁整个网段
192.168.10.102 1; # 封禁单个IP

IP 后数字含义:

  • 0:允许访问;
  • 1:返回 403 Forbidden;
  • 2:返回 444 关闭连接;
  • 3:返回 503 服务不可用。
(2)修改主配置文件

http块中引入黑名单逻辑:

nginx

复制代码
http {
    geo $block_ip {
        default 0;  # 默认允许访问
        include /usr/local/nginx/conf/blockips.conf;
    }
    
    server {
        # ... 其他配置
        if ($block_ip) {
            return 403;  # 触发封禁逻辑
        }
    }
}
  • geo:Nginx 内置模块,基于客户端 IP 生成变量值;
  • $block_ip:自定义变量,存储 IP 封禁状态。
(3)自动封禁恶意 IP

编写 Shell 脚本,自动封禁访问次数超过阈值的 IP:

bash

复制代码
#!/bin/bash
# 自动封禁访问超过100次的IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr \
| awk '{if($1>100) print $2 " 1;"}' > /usr/local/nginx/conf/blockips.conf

将脚本加入定时任务,实现周期性自动封禁:

bash

复制代码
crontab -e
# 每小时执行一次
0 * * * * /bin/bash /path/to/block_ips.sh

五、总结与生产环境建议

本文从 HTTPS 原理出发,完整覆盖了 Nginx 编译安装、基础安全加固、HTTPS 证书部署及高级防护方案,核心要点如下:

  1. 安全原则:始终围绕机密性、完整性、身份认证、不可否认四大原则设计 Web 服务;
  2. 最小权限:编译安装时创建专用运行用户,避免使用 root 权限;
  3. 风险前置:隐藏版本号、限制危险请求方法,从源头减少攻击面;
  4. 流量控制 :通过limit_req模块防御 CC 攻击,保障服务可用性;
  5. 加密传输:生产环境必须使用 CA 签名证书部署 HTTPS,避免自签名证书的安全风险;
  6. 动态防护:结合日志分析与动态黑名单,实现自动化恶意 IP 拦截。
相关推荐
卢傢蕊5 小时前
Nginx安全防护与HTTPS部署实战
nginx·安全·https
岁岁种桃花儿5 小时前
kubenetes从入门到上天系列第十九篇:Kubernetes安装Nginx ingress controller
java·nginx·kubernetes
kc胡聪聪6 小时前
nginx安全
nginx
cramer_50h7 小时前
网络安全技术研究:渗透测试环境和APP安全测试教程(二)
安全·web安全
上海云盾-小余8 小时前
出海业务高可用方案:全球节点 + 智能清洗,让 DDoS 与网络故障不再影响业务
网络·安全·web安全·ddos
高梦轩8 小时前
Nginx 安全防护与 HTTPS 部署实战文档
nginx·安全·https
shuxiaohua8 小时前
一次现网问题定位-nginx报错upstream sent invalid chunked response while reading upstream
运维·nginx
lplum_9 小时前
2026 中国高校智能机器人创意大赛 软件系统安全赛 初赛wp
安全·web安全·网络安全·系统安全·密码学·网络攻击模型·安全威胁分析
m0_738120729 小时前
应急响应——知攻善防挖矿事件应急溯源详细过程
网络·数据库·安全·web安全