nginx安全防护与https部署

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

一. 核心安全配置

1. 编译安装Nginx

此步骤省略,可以参考主页的Nginx

2. 隐藏版本号

再生产环境中,需要隐藏Nginx的版本号,以避免泄露Nginx的版本,使攻击者不能针对特定的版本进行攻击

修改配置文件

在http里面写入 与http同级

3. 限制危险请求方法

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

修改配置文件

验证测试请求 

测试 PUT/DELETE 请求 

查看access.log日志

4. 请求限制(cc攻击防御)

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

(1) 使用 Nginx的 limit_req 模块限制请求速率 

关键参数说明:

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

(2) 压力测试验证 

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

 

发起测试请求

查看发现超过所定义的 限制区域,后面的访问会报错

5. 防盗链

防盗链是一种重要的安全设置,旨在防止未经授权的用户盗用网站(静态)资源。盗链行为不仅侵犯了内容创作者的版权,还可能导致原网站带宽和资源的过度消耗,影响正常用户的访问速度和体验。
一般来说,用户浏览一个完整的页面并不是一次性全部传送到客户端的。如果所请求的页面带有图片或其他信息,那么第一个 HTTP 请求传送的是这个页面的文本,然后通过客户端的浏览器对这段文本进行解释执行。如果发现其中还有图片,那么客户端的浏览器会再次发送一条 HTTP请求,当这个请求被处理后这个图片文件才会被传送到客户端,最后浏览器会将图片安放到页面的正确置,就这样一个完整的页面要经过多次发送 HTTP 请求才能够被完整的显示。基于这样的机制,就会产生盗链问题:如果一个网站中没有其页面中所说图片信息,那么它完全可以链接到其他网站的图片信息上。这样,没有任何资源的网站利用了其他网站的资源来展示给浏览者,提高了自己的访问量,而大部分浏览者又不会很容易地发现。一些不良网站为了不增加成本而扩充自己站点内容,经常盗用其他网站的链接。一方面损害了原网站的合法利益,另一方面又加重了服务器的负担 

资源清单

操作系统 域名 IP 服务
OpenEuler www.aaa.com 192.168.10.101 源主机
OpenEuler www.bbb.com 192.168.10.102 盗链主机

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

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

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

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

文章里面把70864f586e273774e3efcefe2c54bdc.jpg改成1.jpg

(5) 测试访问源网站

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

(7) 测试访问盗链网站

(8) 配置Nginx防盗链

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

(9) 测试访问盗链网站

二. 高级防护

为了方便往下做把配置文件复制一遍

1. 动态黑名单

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

(1) 编辑黑名单配置文件 

IP 地址后的数字含义:

0 “”; 允许
1 403; 完全封禁
2 444; 静默断开
3 503; 服务不可用

(2)编辑主配置文件 

 

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

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

三 . nginx https配置

1. https概念

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

Google 搜索引擎让https的网站在搜索排名中更靠前。
从2017年开始,chrome浏览器把只采用http的网站标记为不安全网站。
苹果要求App Store中的所有应用都必须使用https 加密链接。
微信小程序也要求必须使用 https。
新一代的http/2协议的支持需要以 https 为基础。

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

HTTP
SSL/TSL
TCP
IP

SSL:由 Netscape 公司开发,专门用于保护 Web 通讯。SSL 协议位于 TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为SSL记录协议(SSL Record Protocol)和 SSL,握手协议(SSL Handshake Protocol)两层。SSL经历了多个版本的迭代,包括从未公开发布的SSL1.0、存在严重安全漏洞且现已废弃的 SSL 2.0、在 2014 年因 POODLE 攻击漏洞而被逐步淘汰的 SSL3.0。

TLS:是IETF(Internet Engineering Task Force,互联网工程任务组)制定的一种新的协议,它建立在 SSL3.0协议规范之上,是 SSL3.0的后续版本从历史上看,TLS 对 SSL首先是继承关系,后来逐步发展并取代了SSL,成为当前主流的网络安全协议。TLS经历了多个版本的演进,包括TLS1.0(1999年发布,基于 SSL 3.0 但进行了改进)、TLS 1.1(2006 年发布,增加了对 CBC 攻击的保护)、TLS 1.2(2008年发布,引入了更强大的加密算法,如 AES)和 TLS 1.3(2018年发布,进一步简化了握手过程,提高了性能和安全性)。值得注意的是,TLS 1.0和 TLS 1.1也在 2021 年被正式弃用

2. HTTP 为什么不安全

HTTP 由于是明文传输,主要存在三大风险:窃听风险、篡改风险、冒充风险。

窃听风险

中间人可以获取到通信内容,由于内容是明文,所以获取明文后有安全风险

篡改风险

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

冒充风险

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

3. 安全通信的四大原则 

不难猜到 HTTPS 就是为了解决上述三个风险而生的,一般我们认为安全的通信需要包括以下四个原则: 机密性、完整性,身份认证和不可否认。

  • 机密性:即对数据加密,解决了窃听风险,因为即使被中间人窃听,由于数据是加密的,他也拿不到明文;
  • 完整性:指数据在传输过程中没有被篡改,不多不少,保持原样,中途如果哪怕改了一个标点符号,接收方也能识别出来,从来判定接收报文不合法;
  • 身份认证:确认对方的真实身份,即证明“你妈是你妈”的问题,这样就解决了冒充风险,用户不用担心访问的是某宝结果却在和钓鱼网站通信的问题;
  • 不可否认:即不可否认已发生的行为,比如小明向小红借了1000元,但没打借条,或者打了借条但没有签名,就会造成小红的资金损失。

4. HTTPS 通信原理简述

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

使用对称加密的通信双方使用同一把密钥进行加解密

但是这里有一个关键问题:对称加密的通信双方要使用同一把密钥,这个密钥是如何协商出来的?如果通过报文的方式直接传输密钥,之后的通信其实还是在裸奔,因为这个密钥会被中间人截获甚至替换掉,这样中间人就可以用截获的密钥解密报文,甚至替换掉密钥以达到篡改报文的目的。 

有人说对这个密钥再次加密不就完了,但对方如果要解密这个密钥,那还是要传加密密钥给对方,依然还是会被中间人截获的,这么看来直接传输密钥无论
怎样都无法摆脱俄罗斯套娃的难题,是不可行的。直接传输密钥无论从哪一端传从上节分析来看是不行了,这里我们再看另-种加密方式:非对称加密。
非对称加密即加解密双方使用不同的密钥,一把作为公钥,可以公开的,把作为私钥,不能公开,公钥加密的密文只有私钥可以解密,私钥签名的内容,也只有公钥可以验签。
这样的话对 serve 来说,保管好私钥,发布公钥给其他 client,其他 client只要把对称加密的密钥(或用于生成对称加密密钥的信息)使用公钥加密后传给server 即可。如此一来由于公钥加密只有私钥能解密,而私钥只有 server 有,所以能保证 client 向 server 传输是安全的,server 解密后即可拿到对称加密密钥,这样交换了密钥之后就可以用对称加密密钥通信了。
但是问题又来了,server 怎么把公钥安全地传输给 client 呢???????
如果直接传公钥,也会存在被中间人调包的风险,好像没完没了了一样......

数字证书,解决公钥传输信任问题

如何解决公钥传输问题呢?从现实生活中的场景找答案。员工入职时,企业一般会要求提供学历证明,这个学历必须由第三方权威机构(CertificateAuthority 证书颁发机构,简称 CA)即教育部颁发。同理,server 也可以向 CA申请证书,在证书中附上公钥,然后将证书传给 client。
证书是由站点管理者向CA 申请,申请的时候会提交域名、组织单位信息和公钥等数据(这些数据组成了 Certificate Signing Request 证书签名请求,简称 CSR),CA 会根据这些信息生成证书

细心的你一定发现了问题,那 CA 公钥又是如何安全地传输到 client 的?如果还是从 server 传输到 client,依然无法解决公钥被调包的风险。实际上CA 公钥是存在于 CA 证书上,而此证书(也称 Root CA 证书)被操作系统信任内置在操作系统上的,无需传输,如果用的是 windows 的同学,可以通过:控制面板->网络和 Internet->Internet 选项->内容一>证书->受信任的根证书颁发机构,可以看到很多内置的被信任的证书

https 总结:
server 传输 CA 颁发的证书给 client,client 收到证书后使用系统内置的CA 证书的公钥来验签,验签通过证明证书是受信任的,证书受信任那么证书中的公钥也就是受信任的,这样的话就解决了公钥传输过程中被调包的风险Client 拿到 server 端的公钥后,使用公钥加密会话密钥(也就是对称加密的密钥),然后发送给服务端,服务端通过私钥解密获得会话密钥(对称加密的密钥),然后就可以安全愉快的进行数据传输了

Ps:
1. 为什么 client 拿到了 server 给的公钥,不直接使用公钥进行加密通信,反而用公钥加密会话密钥,用会话密钥来加密通信,多此一举,这是因为会话密钥是对称加密,而对称加密的密钥管理简单且具有更高的加密和解密效率。所以 https 加密是混合模式,在握手阶段是非对称加密在数据传输阶段是对称加密
2. 还有个问题,中间人如果也去 CA 申请一个受信任的证书呢,把 server 发送的证书截取并替换成自己的行不行呢,答案是不行的,因为client 除了要验证证书的合法性外,每个证书中包含的域名也是唯一的

四. nginx配置https证书

由于ssl证书需要向CA组织申购,实验采用自签名证书(就是自己给自己签名并颁发证书,这种证书是不被信任的)

创建证书存储目录

生成自签名证书 

参数解释:

  • -x509:生成自签名证书(而非CSR)
  • -nodes:不加密私钥(无密码保护)
  • -days 365:证书有效期1年。
  • -keyout:私钥文件。
  • -out:自签名文件。
  • -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 的私钥。适用于测试、内部环境或无需公开信任的场景

nginx 启用https 

 

 

 

通过浏览器验证

访问https://ip

浏览器会提示证书不安全(自签名),选择“继续访问”--继续前往或信任此证书


网站公告

今日签到

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