Nginx 安全防护与 HTTPS 部署实战笔记

发布于:2025-05-28 ⋅ 阅读:(28) ⋅ 点赞:(0)

Nginx 安全防护与 HTTPS 部署实战笔记

一、核心安全配置

(一)编译安装 Nginx

  1. 安装支持软件
dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker git wget tar
  • 作用:安装 Nginx 编译所需的开发包,包括 pcre、zlib、openssl 等库和头文件。
  1. 创建运行用户、组和日志目录
useradd -M -s /sbin/nologin nginx
mkdir -p /var/log/nginx
chown -R nginx:nginx /var/log/nginx
  • 作用:创建非交互式用户 nginx 运行 Nginx 服务,避免使用 root 权限,提升安全性;创建日志目录并设置权限。
  1. 编译安装 Nginx
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
  • 关键参数说明:
    • --prefix:指定安装路径。
    • --user/--group:指定运行用户和组。
    • --with-http_ssl_module:启用 SSL 模块支持 HTTPS。
    • --with-http_realip_module:获取客户端真实 IP。
    • --with-http_stub_status_module:启用状态统计模块。
  1. 添加 Nginx 系统服务
vim /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
systemctl daemon-reload
systemctl start nginx
systemctl enable nginx
  • 作用:将 Nginx 注册为系统服务,便于通过 systemctl 命令管理启动、重启和开机自启。

(二)隐藏版本号

  1. 查看原始版本号
curl -I 192.168.10.101
  • 输出示例:Server: nginx/1.26.3
  1. 修改配置文件隐藏版本号
vi /usr/local/nginx/conf/nginx.conf
http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens off;     # 隐藏版本号
    ...
}
nginx -t
nginx -s reload
  • 作用:通过server_tokens off指令隐藏 Nginx 版本号,避免攻击者针对特定版本进行攻击。

(三)限制危险请求方法

  1. 修改配置文件限制请求方法
vi /usr/local/nginx/conf/nginx.conf
server {
    ...
    if ($request_method !~ ^(GET|HEAD|POST)$ ) {
        return 444;
    }
    ...
}
  • 作用:使用正则表达式匹配请求方法,只允许 GET、HEAD、POST 方法,其他方法(如 PUT、DELETE、TRACE 等)返回 444(无响应关闭连接),防止 XST 攻击、文件修改风险和代理滥用。

(四)请求限制(CC 攻击防御)

  1. 使用 limit_req 模块限制请求速率
vi /usr/local/nginx/conf/nginx.conf

nginx

http {
    # 定义限制区(10MB内存/每秒10请求)
    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
    ...

    server {
        location / {
            root html;
            index index.html index.php;
            limit_req zone=req_limit burst=20 nodelay;
        }
        ...
    }
}
  • 关键参数说明:
    • limit_req_zone:定义共享内存区存储客户端 IP 和请求频率信息。
    • $binary_remote_addr:客户端 IP 地址的二进制格式,节省内存。
    • zone=req_limit:10m:共享内存区名为 req_limit,大小 10M。
    • rate=10r/s:每个 IP 每秒最多 10 个请求。
    • limit_req:应用速率限制。
    • burst=20:突发请求队列大小,超出速率限制的请求进入队列,队列满后返回 503。
    • nodelay:立即处理突发请求,不延迟。
  1. 压力测试验证
dnf install httpd-tools -y  # 安装ab测试工具
ab -n 300 -c 30 http://192.168.10.101/  # 发起300个请求,30个并发
  • 验证方法:查看 access.log 中 503 状态码的数量,确认 CC 攻击防御效果。

(五)防盗链

  1. 配置 Nginx 防盗链
vi /usr/local/nginx/conf/nginx.conf

nginx

location ~* \.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|webp|ico)$ {
    root html;
    valid_referers aaa.com *.aaa.com;
    if ($invalid_referer) {
        return 403;
    }
}
  • 关键参数说明:
    • ~* \.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|webp|ico)$:匹配不区分大小写的静态资源文件后缀。
    • valid_referers:设置信任的 Referer 来源,只有来自aaa.com和子域名的请求被允许。
    • $invalid_referer:如果 Referer 不在信任列表中,该变量为 1,触发 403 禁止访问。

二、高级防护

(一)动态黑名单

  1. 编辑黑名单配置文件
vi /usr/local/nginx/conf/blockips.conf

plaintext

192.168.1.0/24 1; # 封禁整个网段
192.168.10.102 1; # 封禁IP
  • IP 地址后的数字含义:
    • 0:允许访问。
    • 1:返回 403 完全封禁。
    • 2:返回 444 静默断开。
    • 3:返回 503 服务不可用。
  1. 编辑主配置文件应用黑名单
vi /usr/local/nginx/conf/nginx.conf

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
    • default 0:默认允许访问,不在黑名单中的 IP 返回 0。
    • include:包含黑名单配置文件。
  1. 自动添加黑名单脚本
#!/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
  • 作用:统计 access.log 中访问次数超过 100 次的 IP,自动添加到黑名单。

三、Nginx HTTPS 配置

(一)HTTPS 概念

  1. HTTPS 定义:HTTPS = HTTP + SSL/TLS,在 HTTP 之下 TCP 之上添加 SSL 层,用于对应用层数据加解密,保障数据传输安全。
  2. HTTP 不安全的原因
    • 窃听风险:明文传输,中间人可获取通信内容。
    • 篡改风险:中间人可篡改报文内容。
    • 冒充风险:可能访问钓鱼网站,无法确认对方身份。
  3. 安全通信的四大原则
    • 机密性:数据加密,防止窃听。
    • 完整性:数据传输中未被篡改,接收方能识别。
    • 身份认证:确认对方真实身份,防止冒充。
    • 不可否认:不可否认已发生的行为。
  4. HTTPS 通信原理
    • 混合加密:握手阶段使用非对称加密协商对称加密密钥,数据传输阶段使用对称加密提高效率。
    • 数字证书:解决公钥传输信任问题,由 CA 颁发,包含公钥、域名、有效期等信息,通过 CA 私钥签名,客户端使用系统内置的 CA 公钥验签。

(二)Nginx 配置 HTTPS 证书

  1. 使用 openssl 生成自签名证书和私钥
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"
  • 关键参数说明:
    • -x509:生成自签名证书。
    • -nodes:不加密私钥。
    • -days 365:证书有效期 1 年。
    • -newkey rsa:2048:生成 2048 位 RSA 私钥。
    • -subj:证书主题信息,按需修改国家、省市、组织、域名等。
  1. Nginx 启用 HTTPS
vi /usr/local/nginx/conf/nginx.conf

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;
}
nginx -t
nginx -s reload
  • 关键参数说明:
    • listen 443 ssl:监听 443 端口并启用 SSL。
    • ssl_certificate/ssl_certificate_key:指定证书和私钥路径。
    • ssl_protocols:指定允许的 SSL/TLS 协议版本,禁用不安全的旧版本。
    • ssl_ciphers:指定加密套件,选择安全强度高的套件。
    • ssl_prefer_server_ciphers on:优先使用服务器端的加密套件。
  1. 浏览器验证
  • 访问https://服务器IP,浏览器会提示证书不安全(自签名证书),测试环境可忽略警告继续访问。

网站公告

今日签到

点亮在社区的每一天
去签到