当前位置: 首页 > news >正文

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

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,浏览器会提示证书不安全(自签名证书),测试环境可忽略警告继续访问。

相关文章:

  • Oracle 的V$LOCK 视图详解
  • nginx安全防护与https部署实战
  • GaussDB资源冻结与解冻:精细化资源管理的实践与策略
  • 《软件工程》第 7 章 - 软件体系结构设计
  • Android开机向导定制(1)开机向导加载流程
  • 《软件工程》第 15 章 - 软件度量与估算:从概念到实践​
  • opencvsharp usb摄像头录像 c# H264编码
  • Python 网络编程入门
  • MMA: Multi-Modal Adapter for Vision-Language Models论文解读
  • macOS烧录stm32程序初步成功
  • 海思3519V200 上基于 Qt 的 OpenCV 和 MySql 配置开发
  • Simple Factory(简单工厂)
  • 《软件工程》第 14 章 - 持续集成
  • C++——STL——unordered_map与unordered_set的使用以及使用哈希表封装unordered_map/set
  • DIY 自己的 MCP 服务-核心概念、基本协议、一个例子(Python)
  • ChatGPT 如何工作——提示工程、对话记忆与上下文管理解析
  • 最新Spring Security实战教程(十六)微服务间安全通信 - JWT令牌传递与校验机制
  • 从“无我”到“无生法忍”:解构执着的终极智慧
  • Godot的RichTextLabel富文本标签,鼠标拖拽滚动,方向键滚动,底部吸附,自动滚动
  • 时序模型上——ARIMA/MA/AR
  • wordpress编辑文字空白卡主/360优化大师旧版
  • 快递企业网站建设设计方案范例/磁力猫最佳搜索引擎入口
  • 郑州品牌网站建设/做营销策划的公司
  • 网站编辑专题怎么做/百度推广价格
  • 广州开发网站技术/网络营销实训个人总结
  • ps素材库/北京百度seo公司