Nginx安全防护与HTTPS部署实战

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

核心安全配置

高级防护

一:核心安全配置
2.隐藏版本号

        在生产环境中,需要隐藏 Nginx 的版本号,以避免泄漏 Nginx 的版本,使攻击者不能针对特定版本进行攻击。在隐藏版本号之前,可以使用 Fiddler 工具抓取数据包,查看Nginx 版本,也可以在 0penEuler 中使用命令 curl -Ihttp://192.168.10.202/查看

修改配置文件

3.限制危险请求方法
        不安全的请求方式,是潜在的安全风险,TRACE(易引发XST 攻击)、PUT/DELETE(文件修改风险)、CONNECT(代理滥用),通过正则表达式匹配请求方法,非白名单方法返回 444(无响应关闭连接)
修改配置文件

测试 PUT/DELETE 请求

查看 access.log

4.请求限制(CC攻击防御)
        CC 攻击(Challenge Collapsar 攻击)是一种常见的网络攻击方式,通过大量合法或伪造的小流量请求来耗尽服务器资源,导致正常用户无法访问网站。要在 Nginx 中有效防止 CC 攻击,可以采用多种策略和方法。CC攻击,也称为连接数攻击或请求速率限制攻击,通过模拟大量用户访问来消耗服务器资源,从而使得正常用户无法正常访问网站。为了防止此类攻击,可以使用 Nginx 提供的模块来限制请求速率和并发连接数

(1)使用 Nginx的 limit reg 模块限制请求速率
编辑配置文件

关键参数说明:

  • limit req zone 定义共享内存区
  • $binary_remote_addr 是一个内置变量,用于表示客户端 IP 地址的二进制格式
  • zone=req limit:10m 创建名为 req_limit 的共享内存区,大小 10M,用来存储客户端IP
  • rate=10r/s 限制并发数,每个 IP 每秒可以发起的请求次数
  • limit req 实施速率限制
  • zone=req_limit 绑定到预定义的共享内存区
  • burst=20 类似与等候区,超出并发数的请求会到等候区,等候区占满后,多余的请求会立刻返回 503
  • nodelay立即处理突发请求而不延迟,相当于立即处理等候区的请求,多余的请求会立刻返回 503

(2)压力测试验证
安装 ab 测试工具
        ApacheBench(简称 ab)是 Apache HTTP 服务器白带的一个轻量级、易用的HTTP 服务器性能测试工具。它主要用于评估服务器在并发访问下的性能表现,包括响应时间、乔吐量等关键指标。

发起测试请求

共发起 300 个请求,每次发起 30 个请求

查看 access.log 发现大量请求日志状态码 503

5.防盗链
        防盗链是一种重要的安全设置,旨在防止未经授权的用户盗用网站(静态)资源。盗链行为不仅侵犯了内容创作者的版权,还可能导致原网站带宽和资源的过度消耗,影响正常用户的访问速度和体验。

资源清单

本实验需要两台主机

操作系统 域名 IP 服务
OpenEuler www.a.com 192.168.10.101 源主机
OpenEuler www.b.com

192.168.10.102

盗链主机

(1)修改 Windows 的C:\Windows\System32\drivers\etc\hosts 文件,设置域名和 IP 映射关系

(2)修改两台 Cent0s 的 hosts 文件,设置域名和 IP 映射关系

(3)把图片 logo.jpg 放到源主机(www.aaa.com)的工作目录下

(4)编辑原网站首页文件

(5)测试访问源网站

(6)编辑盗链网站首页文件

(7)测试访问盗链网站(盗链成功)

(8)配置 Nginx防盗链

  • ~*\.(jpg|gif|swf)$:这段正则表达式表示匹配不区分大小写,以.jpg或.gif 或.swf 结尾的文件;
  • Valid referers:设置信任的网站,可以正常使用图片;
  • 后面的网址或者域名:referer 中包含相关字符串的网址;
  • If 语句:如果链接的来源域名不在valid referers 所列出的列表中,
  • $invalid referer 为1,则执行后面的操作,即进行重写或返回 403 页面

(9)测试访问盗链网站(盗链失败 403)

二.高级防护
1:动态黑名单
        动态黑名单是 Nginx 中一种实时拦截恶意请求的安全机制,它允许在不重启服务的情况下,动态更新需要封禁的 IP地址或网段。相比静态配置的 allow/deny指令,动态黑名单更灵活高效,适用于高并发、多变的攻击防护场景。
(1)编辑黑名单配置文件

(2)编辑主配置文件

  • geo:Nginx 内置模块指令,专门用于处理P 地址相关的逻辑。基于客户端地址生成一个变量值,用于后续的访问控制判断
  • $block ip:自定义的变量名,存储计算结果(通常为0或1)。
  • default 0:默认值,表示不在黑名单中的 IP 允许访问
  • if($block ip):当变量值为1时触发封禁逻辑

(3)使用封禁 ip 测试访问

2.nginx https配置
2.1 https 概念

        HTTPS,全称HyperText Transfer Protocol over Secure Socket Layer,设计初衷是为了保证数据传输安全。国内大型互联网巨头在 2016 开始大力推行https,期间关于 https 的重大事件有:

        众所周知,http(超文本传输协议)是客户端浏览器与 web 服务器之间的通信协议,而 https 协议可以认为是 HTTP + SSL/TLS,在 http 之下 tcp 之上加了ss1 一层,用于对应用层数据的加解密。如下图所示。

HTTP
SSL/TSL
TCP
IP

2.1.1 HTTP 为什么不安全
HTTP 由于是明文传输,主要存在三大风险:窃听风险、篡改风险、冒充风险
窃听风险
中间人可以获取到通信内容,由于内容是明文,所以获取明文后有安全风险

篡改风险
中间人可以篡改报文内容后再发送给对方,风险极大。

冒充风险
比如你以为是在和某宝通信,但实际上是在和一个钓鱼网站通信

2.1.2 安全通信的四大原则
        不难猜到 HTTPS 就是为了解决上述三个风险而生的,一般我们认为安全的通信需要包括以下四个原则: 机密性、完整性,身份认证和不可否认。
机密性:即对数据加密,解决了窃听风险,因为即使被中间人窃听,由于数据是加密的,他也拿不到明文;
完整性:指数据在传输过程中没有被篡改,不多不少,保持原样,中途如果哪怕改了一个标点符号,接收方也能识别出来,从来判定接收报文不合法;

身份认证:确认对方的真实身份,即证明“你妈是你妈”的问题,这样就解决了冒充风险,用户不用担心访问的是某宝结果却在和钓鱼网站通信的问题;

不可否认:即不可否认已发生的行为,比如小明向小红借了1000元,但没打借条,或者打了借条但没有签名,就会造成小红的资金损失。

2.1.3 HTTPS 通信原理简述
        既然 HTTP 是明文传输的,那我们给报文加密不就行了,既然要加密,我们肯定需要通信双方协商好密钥吧。一种是通信双方使用同一把密钥,即对称加密的方式来给报文进行加解密

2.2 nginx 配置 https 证书
        由于 ss1 证书需要向 CA 组织申购,实验采用自签名证书(也就是自己给自己签名并颁发证书,当然这种证书是不被信任的)

2.2.1 使用生成证书和私钥生成证书和私钥openssl
创建证书存储目录

  • -x509:生成自签名证书(而非 CSR)。
  • nodes:不加密私钥(无密码保护)。
  • days 365:证书有效期1年。
  • newkey rsa:2048:生成2048 位的 RSA 私钥。
  • subj:证书主题信息(按需修改字段)。

Ps
CA 签名证书:
需要由受信任的第三方证书颁发机构(CA)签发。流程如下:

1.用户生成私钥和 CSR(证书签名请求)。
2.将 CSR 提交给 CA(如 Let's Encrypt、DigiCert 等)

3.CA 机构验证身份后,用CA的私钥对证书签名,生成最终证书。

自签名证书:
证书的颁发者(Issuer)和主体(Subject)是同一个实体(即自己)

无需第三方 CA 参与,直接用工具(如 0penSSL)生成私钥和证书。

签名时使用自己的私钥,而不是 CA 的私钥。

适用于测试、内部环境或无需公开信任的场景。

2.2.2 nginx        启用 https
编辑 nginx 配置文件

2.2.2 通过浏览器验证


网站公告

今日签到

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