nginx

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > nginx > Nginx安全防护与HTTPS部署

Nginx安全防护与HTTPS部署实战

作者:枕布响丸辣

文章介绍了Nginx安全加固与HTTPS部署,从编译安装、隐藏版本号、限制危险请求、请求限制、防盗链、动态黑名单、HTTPS部署等方面进行了详细说明,需要的朋友可以参考下

前言

在互联网高速发展的今天,Web 服务安全已成为企业与开发者必须重视的核心问题。Nginx 凭借轻量、高并发、模块化设计,占据全球近三分之一 Web 服务器市场。但 DDoS、CC 攻击、恶意爬虫、SQL 注入等威胁层出不穷,加之 GDPR、等保 2.0 等法规要求,掌握 Nginx 安全加固与 HTTPS 部署,已是运维与开发人员的必备技能。

一、Nginx 核心安全配置(生产必配)

1. 编译安装 Nginx(安全基础)

生产环境不推荐 yum 直接安装,编译安装可按需开启模块、关闭危险功能,安全性更高。

(1)安装依赖包

dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker git wget tar

(2)创建专用运行用户(最小权限原则)

禁止 nginx 使用 root 运行,降低入侵后风险:

useradd -M -s /sbin/nologin nginx
mkdir -p /var/log/nginx
chown -R nginx:nginx /var/log/nginx

(3)编译配置(开启安全必备模块)

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)创建软链接、配置系统服务

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

新建 systemd 服务文件:

vi /lib/systemd/system/nginx.service

写入内容:

[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

启动并设置开机自启:

systemctl daemon-reload
systemctl start nginx
systemctl enable nginx

2. 隐藏 Nginx 版本号(防版本定向攻击)

攻击者可通过版本号查找对应 CVE 漏洞,生产环境必须隐藏

查看版本号

curl -I 192.168.10.101
# 返回:Server: nginx/1.26.3

关闭版本显示

vi /usr/local/nginx/conf/nginx.conf

http块中添加:

http {
    server_tokens off;
}

重载配置:

nginx -t && nginx -s reload

再次验证:

curl -I 192.168.10.101
# 返回:Server: nginx(无版本号)

3. 限制危险 HTTP 请求方法

HTTP 中PUT/DELETE/CONNECT/TRACE等方法存在高危风险:

只放行GET/HEAD/POST,其他直接返回 444 断开连接。

配置:

server {
    ...
    if ($request_method !~ ^(GET|HEAD|POST)$ ) {
        return 444;
    }
}

测试:

curl -XPUT -I 192.168.10.101
# 返回 Empty reply from server

注意:TRACE/CONNECT 会被 Nginx 核心层直接拦截,返回 405/400,不会进入 if 判断。

4. 请求限制(CC 攻击防御核心)

CC 攻击通过海量请求耗尽服务器资源,Nginx 自带limit_req模块可精准限速。

配置请求速率限制

http {
    # 定义限流区域:10M内存,按IP限速,10请求/秒
    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
    server {
        location / {
            root html;
            index index.html;
            # 突发队列20,不延迟直接处理
            limit_req zone=req_limit burst=20 nodelay;
        }
    }
}

关键参数说明

压力测试验证

安装 ab 工具:

dnf install httpd-tools -y

发起 300 请求,30 并发:

ab -n 300 -c 30 http://192.168.10.101/

查看日志:

tail -300 /usr/local/nginx/logs/access.log | grep -c 503

大量请求返回 503,限流生效。

5. 防盗链配置(保护静态资源)

盗链会消耗服务器带宽、侵犯版权,Nginx 可通过referer机制拦截。

实验环境

配置防盗链

location ~* \.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|webp|ico)$ {
    root html;
    # 信任域名
    valid_referers aaa.com *.aaa.com;
    # 非法referer返回403
    if ($invalid_referer) {
        return 403;
    }
}

配置后,盗链网站直接显示图片 403,防护生效。

二、Nginx 高级防护(进阶安全)

1. 动态黑名单(实时封禁恶意 IP)

静态allow/deny需要重启服务,动态黑名单可热加载,无需重启。

(1)创建黑名单文件

vi /usr/local/nginx/conf/blockips.conf

写入:

192.168.1.0/24 1;
192.168.10.102 1;

数字含义

(2)主配置加载

http {
    geo $block_ip {
        default 0;
        include /usr/local/nginx/conf/blockips.conf;
    }
    server {
        if ($block_ip) {
            return 403;
        }
    }
}

重载:

nginx -t && nginx -s reload

(3)自动封禁高频 IP 脚本

#!/bin/bash
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

访问量超 100 的 IP 自动加入黑名单,配合定时任务使用。

三、Nginx HTTPS 部署(全站加密)

1. HTTPS 核心原理

HTTPS = HTTP + SSL/TLS,解决 HTTP 三大风险:

HTTPS 采用混合加密

数字证书解决公钥信任问题,由 CA 机构签名,系统内置根证书信任。

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

生产请使用 Let’s Encrypt、DigiCert 等正规 CA 证书。

mkdir -p /etc/nginx/ssl
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"

3. Nginx 配置 HTTPS

server {
    listen 443 ssl;
    server_name localhost;
    # 证书路径
    ssl_certificate /etc/nginx/ssl/nginx-selfsigned.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx-selfsigned.key;
    # 安全协议与加密套件
    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;
}

重载配置:

nginx -t && nginx -s reload

4. 验证 HTTPS

访问https://服务器IP,浏览器提示证书不安全(自签名),测试环境可忽略。生产环境使用受信任证书后,浏览器显示安全锁,支持 HTTP/2,SEO 权重更高。

四、生产环境安全加固总结

  1. 最小权限:使用专用 nginx 用户,禁止 root 运行
  2. 隐藏信息:关闭版本号、隐藏服务器信息
  3. 请求限流:limit_req 防 CC,limit_conn 防并发过量
  4. 方法限制:只放行 GET/HEAD/POST
  5. 防盗链:保护静态资源,减少带宽浪费
  6. 动态黑名单:实时封禁恶意 IP
  7. 全站 HTTPS:开启 TLS1.2+,禁用不安全协议
  8. 定期更新:Nginx 保持最新版,修复 CVE 漏洞

五、结语

Nginx 安全防护不是一次性配置,而是持续优化的过程。本文覆盖的编译加固、版本隐藏、请求限流、防盗链、动态黑名单、HTTPS 部署,可直接应用于中小企业生产环境,大幅提升 Web 服务安全性。

以上就是Nginx安全防护与HTTPS部署实战的详细内容,更多关于Nginx安全防护与HTTPS部署的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文