Nginx安全防护与HTTPS部署实战

目录

一.核心安全配置

1.编译安装Nginx

(1)编译安装软件

(2)创建运行用户、组和日志目录

(3)编译安装Nginx

​编辑

​编辑

​编辑

​编辑

(4)添加Nginx系统服务

2.隐藏版本号

​编辑3.限制危险请求方法

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

(2)压力测试验证

4.防盗链

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

​编辑

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

​编辑

​编辑

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

​编辑

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

(5)测试访问源网站

​编辑

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

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

二.高级防护

1.动态黑名单

[2.nginx https配置](#2.nginx https配置)

(1)https概念

(2)HTTP为什么不安全

(3)安全通信的四大原则

(4)HTTPS通信原理简述

关键问题解决

3.nginx配置https证书

[(1)关键区别:自签名 vs CA签名证书](#(1)关键区别:自签名 vs CA签名证书)


一.核心安全配置

1.编译安装Nginx

(1)编译安装软件

Nginx 的配置及运行需要 pcre、zlib 等软件包的支持,因此应预先安装这些软件的开发包(devel),以便提供相应的库和头文件,确保 Nginx 的安装顺利完成。

**(2)**创建运行用户、组和日志目录

(3)编译安装Nginx

(4)添加Nginx系统服务

2.隐藏版本号

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

修改配置文件:

3.限制危险请求方法

| 配置项 | 说明 | 测试方法 | 预期结果 | 注意事项 |
|------------------|------------------------------------------------|--------------------------------------------------------------------|---------------------|---------------------------------------|------|-----------|
| 限制危险请求方法 | 通过正则表达式匹配请求方法,只允许 GET, HEAD, POST 方法,其他方法返回444 | curl -XPUT -I 192.168.10.101 | 返回444 (无响应关闭连接) | 语法应为 `if (request_method !\~ \^(GET | HEAD | POST))` |
| TRACE方法 | 默认被Nginx核心模块禁用 | curl -XTRACE -I 192.168.10.101 | 返回405 (Not Allowed) | Nginx在ngx_http_core_module阶段直接拦截 |
| CONNECT方法 | 当目标不是代理服务器时被拦截 | curl -XCONNECT -I 192.168.10.101 | 返回400 (Bad Request) | Nginx在请求解析阶段直接拦截,不进入location处理 |
| PUT/DELETE方法 | 被配置规则拦截 | curl -XPUT -I 192.168.10.101curl -XDELETE -I 192.168.10.101 | 返回444 | 日志中会记录444状态码 |

PS:注意测试 TRACE 和 CONNECT 方法时,状态码不是 444(原因:1.CONNECT 请求的目标不是代理服务器时,服务器必须返回400Bad Request,Nginx 核心层在请求解析阶段直接拦截,根本不进入后续的 location 处理流程 2.现代 Nginx默认禁用 TRACE 方法,在 ngx http core module 阶段直接返回 405 Not Allowed)

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

CC 攻击(Challenge Collapsar 攻击)是一种常见的网络攻击方式,通过大量合法或伪造的小流量请求来耗尽服务器资源,导致正常用户无法访问网站。要在 Nginx中有效防止CC攻击,可以采用多种策略和方法。

CC攻击,也称为连接数攻击或请求速率限制攻击,通过模拟大量用户访问来消耗服务器资源,从而使得正常用户无法正常访问网站。为了防止此类攻击,可以使用 Nginx 提供的模块来限制请求速率和并发连接数

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

参数 说明 示例值 作用
limit_req_zone 定义共享内存区 limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s 创建用于存储客户端请求状态的共享内存区
$binary_remote_addr 客户端IP地址的二进制格式 - 作为限流的key,比字符串IP更节省空间
zone=name:size 定义共享内存区名称和大小 zone=req_limit:10m 创建10MB大小的名为req_limit的共享内存区
rate=rate 请求速率限制 rate=10r/s 每个IP每秒允许10个请求
limit_req 实施速率限制的指令 limit_req zone=req_limit burst=20 nodelay 在server/location中应用限流规则
burst=number 突发请求缓冲区大小 burst=20 允许超过rate的20个请求进入排队
nodelay 立即处理突发请求 nodelay 不延迟处理突发请求,超过(burst+rate)的请求直接返回503

(2)压力测试验证

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

发起测试请求

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

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

-n 300

表示总请求数为 300次,即模拟客户端向服务器发送300次HTTP 请求。

-c 30

表示并发用户数为30,即同时有30个请求并行发送到服务器。

4.防盗链

防盗链概念 说明 技术原理 影响 防御手段
定义 防止外部网站未经授权直接链接使用本站资源(图片/文件等) HTTP请求头中的Referer字段标识来源页面 盗链者直接使用资源链接,消耗原站带宽 通过Nginx/Apache配置校验Referer
盗链原理 利用浏览器自动请求资源的特性 浏览器解析HTML时自动发送子资源(图片/JS/CSS)请求 原站承担流量成本,盗链站零成本获益 限制非本站域名的资源请求
危害 1. 版权侵犯 2. 原站带宽消耗 3. 服务器资源浪费 4. 正常用户访问变慢 一个页面可能触发数十次资源请求 盗链站流量可能远高于原站访问量 返回403或替换为警告图片
防御实现 校验HTTP请求头中的来源信息 主要依赖Referer头,但可伪造(需配合其他手段) - 典型Nginx配置: valid_referers none blocked *.example.com; if ($invalid_referer) { return 403; }
进阶防护 1. 签名URL 2. 动态Token 3. 时间戳验证 生成临时访问令牌或加密链接 增加盗链者获取资源的难度 需要程序配合生成临时资源链接
注意事项 1. 需允许空Referer(直接访问) 2. 考虑CDN兼容性 3. 避免影响SEO 部分合法爬虫可能无Referer 过度限制可能影响用户体验 可设置白名单或例外规则

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

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

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

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

(5)测试访问源网站

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

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

二.高级防护

1.动态黑名单

配置步骤 操作指令/内容 说明
1. 编辑黑名单配置文件 vim /usr/local/nginx/conf/blockips.conf 添加需要封禁的IP或网段,格式为:IP地址/网段 数字。数字含义: 0-允许;1-403封禁;2-444断开;3-503不可用。
示例封禁条目 192.168.1.0/24 1: 192.168.10.201 1: 封禁整个192.168.1.0/24网段和单个IP 192.168.10.201。
2. 编辑主配置文件 vim /usr/local/nginx/conf/nginx.conf http块中添加geo指令定义动态黑名单逻辑。
geo模块配置 geo $block_ip {<br> default 0;<br> include /usr/local/nginx/conf/blockips.conf;<br>} default 0表示默认允许访问;include加载黑名单文件。
封禁逻辑 if ($block_ip) {<br> return 403;<br>} $block_ip值为1时,返回403禁止访问。
3. 重载配置 nginx -t nginx -s reload 测试配置语法并重载Nginx服务使配置生效。
测试封禁效果 curl 192.168.10.202 被封禁的IP访问时会返回403 Forbidden页面。
关键指令说明 geo :基于IP生成变量值;$block_ip :自定义变量;default 0:默认允许访问。 动态黑名单通过变量和条件判断实现灵活拦截,无需重启服务。

2.nginx https配置

(1)https概念

分类 关键内容 说明
HTTPS 定义 HyperText Transfer Protocol over Secure Socket Layer 在HTTP基础上加入SSL/TLS加密层,确保数据传输安全。
推行背景 - 2016年起国内互联网巨头推广 - Google提升HTTPS网站搜索排名 - Chrome标记HTTP为"不安全" - 苹果App Store、微信小程序强制要求HTTPS HTTPS成为行业安全标准,主流平台强制支持。
HTTP vs HTTPS HTTP :明文传输 HTTPS:HTTP + SSL/TLS(加密传输) HTTPS在TCP与应用层之间加入SSL/TLS协议,实现数据加密。
SSL/TLS 协议栈 应用层(HTTP) ↓ SSL/TLS(加密层) ↓ 传输层(TCP) SSL/TLS位于传输层之上,对应用层数据加密。
SSL 发展 - SSL 1.0(未发布) - SSL 2.0(废弃) - SSL 3.0(2014年因POODLE漏洞淘汰) 由Netscape开发,后因安全漏洞逐步被TLS取代。
TLS 发展 - TLS 1.0(1999年,基于SSL 3.0) - TLS 1.1(2006年,防CBC攻击) - TLS 1.2(2008年,支持AES) - TLS 1.3(2018年,简化握手) TLS是SSL的继承者,1.0/1.1于2021年弃用,1.3为当前主流版本。
TLS 核心改进 - 更安全的加密算法(如AES) - 简化握手流程(TLS 1.3) - 禁用不安全的协议版本 性能与安全性逐步提升,淘汰旧版本以应对新型攻击。

(2)HTTP为什么不安全

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

篡改风险

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

冒充风险

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

HTTPS 显然是为了解决这三大风险而存在的

(3)安全通信的四大原则

原则 定义 作用 实际应用示例
机密性 对数据进行加密,确保只有授权方可以读取明文内容。 防止窃听风险,即使数据被截获也无法解密。 HTTPS使用SSL/TLS加密传输数据,如银行交易信息。
完整性 确保数据在传输过程中未被篡改或损坏。 防止数据被中间人篡改,保证接收到的数据与发送的一致。 数字签名或哈希校验(如SHA-256)验证文件完整性。
身份认证 验证通信双方的真实身份,确保对方是合法的实体。 防止冒充风险,避免与伪造的服务器或客户端通信。 SSL证书验证网站身份(如浏览器显示绿色锁标志),防止钓鱼网站。
不可否认性 确保行为或交易发生后,参与者无法否认其参与或执行的操作。 提供法律或审计依据,防止抵赖行为。 数字签名合同(如电子签章)、区块链交易记录。

(4)HTTPS通信原理简述

加密方式 核心机制 优点 缺点 在HTTPS中的应用
对称加密 通信双方使用同一把密钥加密/解密数据。 加密速度快,适合大数据量传输。 密钥传输不安全,易被中间人截获。 不直接用于密钥交换,仅用于后续通信加密(如AES)。
非对称加密 使用公钥(公开)私钥(私有) : - 公钥加密 → 私钥解密 - 私钥签名 → 公钥验签。 解决密钥传输安全问题。 计算复杂,速度慢,不适合大数据量。 用于密钥交换阶段(如RSA):客户端用服务器公钥加密对称密钥,确保密钥安全传输。
混合加密 结合两者: 1. 非对称加密协商对称密钥; 2. 对称加密加密实际通信数据。 兼顾安全性与性能。 需依赖证书体系(CA)验证公钥合法性。 HTTPS实际采用的方式:TLS握手阶段用非对称加密交换密钥,后续通信用对称加密。
  1. 服务器:生成公私钥对,公钥通过证书(CA签发)公开,私钥保密。

  2. 客户端 :获取服务器公钥(证书验证合法性),生成对称密钥,用公钥加密后发送给服务器。

  3. 服务器:用私钥解密获取对称密钥,双方开始用对称密钥加密通信。

关键问题解决

  • 密钥传输安全:非对称加密保护对称密钥的传输(避免"俄罗斯套娃"问题)。

  • 性能优化:对称加密处理实际数据(非对称加密仅用于初始握手)。

  • 身份认证:通过CA证书验证服务器公钥真实性,防止中间人攻击。

但是问题又来了,server 怎么把公钥安全地传 client 呢???????

如果直接传公钥,也会存在被中间人调包的风险,好没完没了了一样......

项目 说明 作用 关键流程
数字证书定义 由CA(证书颁发机构)签发的电子文件,包含服务器公钥及身份信息。 解决公钥传输的信任问题,防止中间人伪造公钥。 -
证书申请流程(CSR) 服务器提交CSR(证书签名请求),包含组织信息、公钥等,CA审核后签发证书。 确保证书中的公钥与服务器身份绑定,由权威机构验证。 1. 服务器生成CSR → 2. CA验证身份 → 3. CA签发证书。
证书内容 包含: - 公钥 - 持有者信息 - CA签名 - 有效期等。 提供公钥合法性证明,支持客户端验证服务器身份。 -
客户端验证流程 1. 客户端获取证书; 2. 用CA公钥验证签名; 3. 确认证书有效后信任公钥。 防止伪造证书,确保公钥来自合法服务器。 依赖系统预置的CA根证书(信任链)。
CA的角色 作为可信第三方,对服务器身份审核并签发证书。 建立公钥信任体系,避免公钥被篡改或冒用。 -
信任链机制 客户端通过预置的根证书验证中间CA和服务器证书的签名链。 确保即使证书由中间CA签发,仍可追溯至可信根CA。 根证书 → 中间CA证书 → 服务器证书。
HTTPS中的实际应用 服务器将CA签发的证书发送给客户端,客户端验证后使用证书中的公钥加密通信。 实现安全密钥交换(如TLS握手),后续通信用对称加密。 1. 证书验证 → 2. 非对称加密协商密钥 → 3. 对称加密传输数据。

关键问题与解决

  1. 公钥信任问题:通过CA签名的证书绑定公钥与身份,防止中间人攻击。

  2. 证书伪造风险:客户端用CA公钥验证证书签名,确保未被篡改。

  3. 性能优化:非对称加密仅用于验证和密钥交换,实际数据用对称加密传输。

3.nginx配置https证书

分类 操作/配置 说明 注意事项
证书类型 自签名证书 vs CA签名证书 - 自签名:自己签发,不受浏览器信任,适合测试。 - CA签名:由可信CA(如Let's Encrypt)签发,用于生产环境。 生产环境必须使用CA签名证书,否则浏览器会提示不安全。
生成自签名证书 openssl req -x509 -nodes -days 365 -newkey rsa:2048 \<br>-keyout nginx-selfsigned.key \<br>-out nginx-selfsigned.crt \<br>-subj "/CN=localhost" - -x509:生成自签名证书。 - -nodes:私钥不加密。 - -subj:设置证书信息(如域名)。 自签名证书仅限内部测试使用,需手动信任。
CA签名证书流程 1. 生成私钥和CSR。 2. 提交CSR给CA(如Let's Encrypt)。 3. CA验证后签发证书。 确保公钥受信任,需域名所有权验证(如DNS解析或文件验证)。 免费CA(如Let's Encrypt)有效期90天,需定期续签。
Nginx配置HTTPS nginx<br>server {<br> listen 443 ssl;<br> server_name localhost;<br> ssl_certificate /path/to/cert.crt;<br> ssl_certificate_key /path/to/key.key;<br> ssl_protocols TLSv1.2 TLSv1.3;<br> ssl_ciphers HIGH:!aNULL:!MD5;<br>}<br> - ssl_certificate:证书路径。 - ssl_certificate_key:私钥路径。 - ssl_protocols:禁用旧协议(如TLSv1.0)。 配置后需执行 nginx -t 测试语法,再 nginx -s reload 重载配置。
安全性增强配置 nginx<br>ssl_prefer_server_ciphers on;<br>ssl_session_cache shared:SSL:10m;<br>ssl_session_timeout 10m;<br> - 优先使用服务端加密套件。 - 启用会话缓存以提升性能。 使用现代加密算法(如AES-GCM),禁用弱算法(如RC4、SHA1)。
HTTP重定向到HTTPS nginx<br>server {<br> listen 80;<br> server_name localhost;<br> return 301 https://$host$request_uri;<br>}<br> 强制所有HTTP请求跳转到HTTPS,提升安全性。 确保用户始终通过加密连接访问。

(1)关键区别:自签名 vs CA签名证书

对比项 自签名证书 CA签名证书
信任度 不被浏览器/系统默认信任 由可信CA签发,自动信任
适用场景 测试、内部环境 生产环境、公开服务
成本 免费 免费(Let's Encrypt)或付费(DigiCert)
有效期 自定义(如-days 365 通常90天(免费CA)或1-2年(付费CA)
相关推荐
用户962377954481 天前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机1 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机1 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954481 天前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star1 天前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户962377954481 天前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
cipher3 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
一次旅行6 天前
网络安全总结
安全·web安全
red1giant_star6 天前
手把手教你用Vulhub复现ecshop collection_list-sqli漏洞(附完整POC)
安全
ZeroNews内网穿透6 天前
谷歌封杀OpenClaw背后:本地部署或是出路
运维·服务器·数据库·安全