Nginx安全防护与HTTPS部署

news2025/5/11 22:02:35

一、安全防护与HTTPS概念

一、安全防护与HTTPS概念
为什么要隐藏版本号?
    当访问网站时,能从响应标头查看到server的信息,这里面就包含了是什么web应用及其版本为你提供的服务。如果不隐藏server的版本,会导致别有用心的人知晓服务的版本号,从而针对该版本进行攻击。
    PS:浏览器中按F12,选择网络,在最上面点击你访问的网页(例如百度,会显示www.baidu.com)找到这个并点击它,选择标头-响应标头,这里面有一行为server,会跟上web应用程序及版本。
    
限制不安全的请求方式,能更好保护nginx服务器。常见的危险请求方法包括TRACE(易引发XST攻击)、PUT/DELETE(文件修改风险)、CONNECT(代理滥用)。通过在配置文件中添加正则表达式来匹配请求方法即可拒绝不安全的请求方式。

CC攻击介绍
    CC攻击(Challenge Collapsar攻击)是一种常见的网络攻击方式,通过大量合法或伪造的小流量请求来耗尽服务器资源,导致正常用户无法访问网站。也称为连接数攻击或请求速率限制攻击。

面对CC攻击的处理方式
    使用nginx的limit_req模块来限制请求速率

压力测试介绍
    压力测试是指通过快速大量的访问来评估服务器在并发访问下的性能表现,包括响应时间、吞吐量等关键指标。

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

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


https介绍
    HTTPS,全称HyperText Transfer Protocol over Secure Socket Layer,设计初衷是为了保证数据传输安全。
    http是客户端浏览器与web服务器之间的通信协议,而https协议可以认为是HTTP+SSL/TLS,在http之下tcp之上加了ssl一层,用于对应用层数据的加解密。

如图
    HTTP
    SSL/TSL
    TCP
    IP

SSL:由Netscape公司开发,专门用于保护web通讯。SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为SSL记录协议(SSL Record Protocol)和SSL握手协议(SSL Handshake Protocol)两层。
TLS:是IETF(Internet Engineering Task Force,互联网工程任务组)制定的一种新的协议,它建立在SSL3.0协议规范之上,是SSL3.0的后续版本。TLS是当前主流的网络安全协议。


http为什么不安全?
    http是明文传输,主要存在三大风险:窃听风险、篡改风险、冒充风险。
窃听风险:
    中间人可以获取到通信内容,由于内容是明文,所以获取明文后有安全风险。
    客户机 ->    中间人(窃听,不修改)  -> 服务器
篡改风险:
    中间人可以篡改报文内容后再发送给对方,风险极大。
    客户机 ->    中间人(窃听且修改)  -> 服务器
冒充风险:
    比如你以为是在和某宝通信,但实际上是在和一个钓鱼网站通信。
    客户机 ->    <- 中间人(直接冒充服务器,让客户机以为自己在和服务器通信)   服务器

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

HTTPS通信原理简述
    HTTPS使用对称加密和非对称加密以及数字证书。对称加密是指加解密的密钥相同,非对称加密是指有公钥和私钥,公钥加密的只有私钥能解开,私钥加密的只有公钥能验证。使用非对称加密来对对称加密的密钥进行加密,这时候传递非对称加密的密钥需要借助数字证书来传递。在数字证书中添加上公钥即可。到这里,公钥和对称加密的密钥都有了,就可以开始传输了。

    PS:非对称加密,公加私解用于信息加密 私加公解用于身份验证。

nginx配置文件解释
worker_processes  1;  # 工作进程数,与cpu内核数有关。进程拆分为线程供cpu的核>心来处理,一个内核一次处理一个线程。

events {
    worker_connections  1024;  # 每个工作进程能处理的最大连接数。
}
 

二、nginx配置演示

隐藏版本号

浏览器中按F12,选择网络,在最上面点击你访问的网页(例如百度,会显示www.baidu.com)找到这个并点击它,选择标头-响应标头,这里面有一行为server,会跟上web应用程序及版本。

vim nginx.conf
    server_tokens off;  # 表示关闭nginx的版本号,在http响应头中看不到nginx的版本。

此时查看server发现没有版本号了。
隐藏危险请求方法
        if ($request_method !~ ^(GET|HEAD|POST)$) {  # 如果请求方式不是GET|HEAD|POST,会返回666状态码。
              return 666;
        }

验证:
curl -XPUT -I 192.168.10.101
curl:(52) Empty reply from server

查看日志
192.168.10.102 - - [11/Mar/2025:11:30:11 +0800] "PUT /HTTP/1.1" 666 0 "-" "curl/8.4.0"
请求限制(CC攻击防御)

limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s; # $binray_remote_addr 获取二进制的客户端ip地址,remote_addr表示远程IP,在http里代表>
客户端地址。  req_limit:10m 表示10兆,用于存储客户端的ip和连接。 rate=10r/s 表示每个IP可以发起的请求次数。


limit_req zone=req_limit burst=20 nodelay;  # zone=req_limit 绑定到预
定义的共享内存区  burst=20 类似于等候区,超出并发数的请求会到等候区,等候区占
满后,多余的请求会立即返回503 nodelay表示立即处理突发请求而不延迟,相当于立即
处理等候区的请求,多余的请求会立刻返回503

客户机:
for i in $(seq 150);do curl 192.168.10.101; done

服务器:
cat access.log发现有大量503的回应。
防盗链
客户机(101):
cat  aaa.html
<html>
    <body>
	  <h1> aaa
	    <img src="http://192.168.10.101/kgc.png"/> 盗取192.168.10.101的图片,ip可换域名
          </h1>
    </body>
</html>

浏览器访问192.168.10.102会显示192.168.10.101的图片。

服务器(101):
  location ~* \.(jpg|jpeg|png|bmp|swf|flv|mp4|webp|ico)$ { # ~* \.(jpg|gif|swf)$ 表示匹配不区分大小写,以.jpg或.gif或.swf结尾的文件;
                root html;
                valid_referers   ooos.com *.ooos.com; # 访问网址为ooos.com的 
访问网址为*(所有的开头).ooos.com的

                if ($invalid_referer) {    # 如果链接的来源域名不在valid_refe
rers所列出的列表中,$invalid_referer为1,则执行后面的操作,即进行重写或返回99
9。
                        return 999;
                }

客户机:
vim /etc/hosts
192.168.10.101 www.ooos.com

浏览器访问192.168.10.102不显示图片,状态码为404。输入192.168.10.101也不显示图片,状态码为404。访问www.ooos.com会显示图片。(开头也可以是aaa、bbb、ccc等等)
动态黑名单

[root@localhost conf]# cat blockips.conf 
192.168.1.0/24 1;
192.168.10.102 1;

[root@localhost conf]# vim nginx.conf
geo $block_ip {     # Nginx内置模块指令,专门用于处理ip地址相关的逻辑,基
于客户端ip地址生成一个变量值,用于后续的访问控制判断。 $block_ip是自定义的变>量名,存储计算结果(通常为0或1) default 0 是默认值,表示不在黑名单中的ip允许
访问。 
            default 0;   # 默认允许访问
            include /usr/local/nginx/conf/blockips.conf;  # 包含黑名单
    }

    server {
        listen       80;
        server_name  localhost;

        if ($block_ip)  {  # 判断标记值,变量值为1时触发封禁逻辑
                return 666;  # 封禁动作
        }

客户端验证

[root@localhost html]# curl -I 192.168.10.101
HTTP/1.1 666 
Server: nginx/1.26.3
Date: Tue, 29 Apr 2025 02:41:35 GMT
Content-Length: 0
Connection: keep-alive

脚本实现动态黑名单
[root@localhost conf]# vim /root/a.sh # 将此脚本加入定时任务中,可实现定时防护。
#!/bin/bash
awk '{print $1}' /usr/local/nginx/logs/access.log | sort | uniq -c | sort -nr
 | awk '{if ($1 > 100) print $2 " 1;" }' > /usr/local/nginx/conf/blockips.con
f
# sort 用于排序 sort -nr n表示依照数值大小来排序,数值小的在上。 r表示以相反>的顺序来排序。 uniq -c用于在每列旁边显示该行重复出现的次数。
# 如果$1出现次数大于100,那么将它打印出来并加上1; 表示拒绝该ip,将结果重定向>覆盖输出到blockips.conf文件中

[root@localhost conf]# for i in $(seq 166); do curl 192.168.10.101;done # 大量访问以触发条件$1>100

这里就简单的运行一次来验证脚本。
[root@localhost ~]# bash a.sh 
[root@localhost ~]# cd /usr/local/nginx/conf/
[root@localhost conf]# cat blockips.conf 
192.168.10.101 1;
[root@localhost conf]# curl 192.168.10.101
<html>
	<body>
		<h1>ooos!
		  <img src="kgc.png"/>
		</h1>
	</body>
</html>
[root@localhost conf]# nginx - s reload # 可将此步加到脚本中。

[root@localhost conf]# curl  -I 192.168.10.101
HTTP/1.1 666 
Server: nginx/1.26.3
Date: Tue, 29 Apr 2025 03:17:37 GMT
Content-Length: 0
Connection: keep-alive
https配置
[root@localhost conf]# 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" # 生成证书

req表示请求。
-x509表示生成自签名证书(x509是证书类型)
-nodes表示不加密私钥(无密码保护)。
-days 365表示证书有效期一年。
-newkey rsa:2048 表示生成2048位的RSA密钥。
-keyout 表示将私钥输出到指定位置。
-out 表示将证书文件输出到指定位置
-subj 表示证书主题信息,C=CN是指国家为中国,ST=Beijing表示省份 L=Beijing表示市 O=Myorg表示证书机构(这里是自定义的名字) CN=localhost是主机名。

[root@localhost conf]# vim nginx.conf
 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;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

   # 将HTTP请求重定向到HTTPS
        server {
            listen 80;
            server_name localhost;
            return 301 https://$host$request_uri;
        }

[root@localhost conf]# firewall-cmd --add-service=https
success

浏览器访问https://192.168.10.101 提示证书不安全,选择高级-继续前往或信任该证书-访问成功。
访问http://192.168.10.101 会跳转到https://192.168.10.101,因为之前信任了证书,所以未提示证书不安全。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2373455.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OSPF综合实验实验报告

OSPF综合实验实验报告 一、实验拓扑 二、实验要求 1.R5为ISP&#xff0c;其上只能配置IP地址&#xff1b;R4作为企业边界路由器&#xff0c; 出口公网地址需要通过PPP协议获取&#xff0c;并进行chap认证 2&#xff0c;整个OSPF环境IP基于172.16.0.0/16划分&#xff1b; 3&…

vue3+ant design vue + Sortable实现多级表格列拖动

1、最近遇到个需求&#xff0c;需使用vue3ant design vue Sortable实现多级表格的表头允许用户拖拽移动。即当用户拖拽一级表头时&#xff0c;其对应的子级表头及数据应同步移动&#xff0c;并且只允许一级非固定表头允许拖拽。 2、代码 <a-table:data-source"rowDat…

基于开源链动2+1模式AI智能名片S2B2C商城小程序的分销价格管控机制研究

摘要&#xff1a;本文聚焦开源链动21模式AI智能名片S2B2C商城小程序在分销体系中的价格管控机制&#xff0c;通过解析其技术架构与商业模式&#xff0c;揭示平台如何通过"去中心化裂变中心化管控"双轨机制实现价格统一。研究显示&#xff0c;该模式通过区块链存证技术…

阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化

作者&#xff1a;裘文成&#xff08;翊韬&#xff09; 摘要 随着企业全球化业务的扩展&#xff0c;如何高效、经济且可靠地将分布在海外各地的应用与基础设施日志统一采集至阿里云日志服务 (SLS) 进行分析与监控&#xff0c;已成为关键挑战。 本文聚焦于阿里云高性能日志采集…

体育培训的实验室管理痛点 质检LIMS如何重构体育检测价值链

在竞技体育与全民健身并行的时代背景下&#xff0c;体育培训机构正面临双重挑战&#xff1a;既要通过科学训练提升学员竞技水平&#xff0c;又需严格把控运动安全风险。作为实验室数字化管理的核心工具&#xff0c;质检LIMS系统凭借其标准化流程管控与智能化数据分析能力&#…

设计模式【cpp实现版本】

文章目录 设计模式1.单例模式代码设计1.饿汉式单例模式2.懒汉式单例模式 2.简单工厂和工厂方法1.简单工厂2.工厂方法 3.抽象工厂模式4.代理模式5.装饰器模式6.适配器模式7.观察者模式 设计模式 1.单例模式代码设计 ​ 为什么需要单例模式&#xff0c;在我们的项目设计中&…

阿维塔汽车CAN总线数据适配技术解析与免破线数据采集实践

在智能电动汽车快速迭代的背景下&#xff0c;阿维塔凭借其高度集成的电子电气架构成为行业焦点。昨天我们经过实测&#xff0c;适配了该车型CAN总线数据适配的核心技术&#xff0c;从硬件接口定位、无损伤接线方案到关键动力系统数据解码进行系统性剖析&#xff0c;为智能诊断、…

用纯HTML和CSS仿写知乎登录页面

这是知乎的官方的登录页面 这是我的登录页面&#xff0c;使用 HTML CSS 进行编写。我觉得这是一个供前端新手练手的一个不错的小项目&#xff0c; 在这个系列&#xff0c;我将会用 HTML CSS 编写各大知名网站的登录界面&#xff0c;欢迎大家交流探讨。 源码展示: body{ba…

【Redis】C++如何使用redis

文章目录 1. redis客户端2. 使用通用命令3. 使用string命令3. 使用list命令4. 使用set命令5. 使用hash命令6. 使用zset命令 1. redis客户端 在前面的学习种&#xff0c;我们都是使用redis命令行客户端手动执行操作的&#xff1b;但是更多的时候&#xff0c;需要使用redis的api…

考研系列-408真题计算机组成原理篇(2010-2014)

写在前面 此文章是本人在备考过程中408真题计算机组成原理部分(2010年-2014年)的易错题及相应的知识点整理,后期复习也常常用到,对于知识提炼归纳理解起到了很大的作用,分享出来希望帮助到大家~ # 2010年 1.DRAM芯片的排列和编址方式 这个区别于多体交叉编址:这个可以理…

47.电压跌落与瞬时中断干扰的防护改善措施

电压跌落与瞬时中断干扰的防护改善措施 1. 电压跌落与瞬时中断的影响机理2. 解决措施 1. 电压跌落与瞬时中断的影响机理 跌落发生的常见场景如下&#xff1a; &#xff08;1&#xff09;电源插头接触不良&#xff0c;瞬态中断即刻恢复&#xff1b; &#xff08;2&#xff09;电…

极狐Gitlab 里程碑功能介绍

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 里程碑 (BASIC ALL) 极狐GitLab 中的里程碑是一种跟踪议题和合并请求的方法&#xff0c;这些请求是为了在特定时间段内实现更…

一次Android Fragment内存泄露的bug解决记录|Fragment not attach to an Activity

Bug描述 前些天出现了一个 bug。Activity 页面里放了一个 ViewPager2&#xff0c;其中的每一页是一个 Fragment。其中第一页的 Fragment 实现了一个监听器&#xff0c;当事件发生和首次添加到监听器管理者 listener manager 时&#xff0c;manager 会通知所有监听者&#xff0…

LVGL图像导入和解码

LVGL版本&#xff1a;8.1 概述 在LVGL中&#xff0c;可以导入多种不同类型的图像&#xff1a; 经转换器生成的C语言数组&#xff0c;适用于页面中不常改变的固定图像。存储系统中的外部图像&#xff0c;比较灵活&#xff0c;可以通过插卡或从网络中获取&#xff0c;但需要配置…

project从入门到精通(五)

目录 创建资源的基本信息 在project中创建资源工作表 ​编辑信息详解 最大单位 标准费率与加班费率 每次使用成本 成本累算 基准日历 三类资源工作表的总结——不同的资源必须要设置的属性 除了资源名称是必须设置的之外&#xff0c;剩余的资源的可设置选项如下图所…

第3.2.3节 Android动态调用链路的获取

3.2.3 Android App动态调用链路 在Android应用中&#xff0c;动态调用链路指的是应用在运行时的调用路径。这通常涉及到方法调用的顺序和调用关系&#xff0c;特别是在应用的复杂逻辑中&#xff0c;理解这些调用链路对于调试和性能优化非常重要。 1&#xff0c;动态调用链路获…

亿级流量系统架构设计与实战(六)

微服务架构与网络调用 当某个业务从单体服务架构转变为微服务架构后,多个服务之间会通过网络调用形式形成错综复杂的依赖关系。 在微服务架构中 , 一个微服务正常工作依赖它与其他微服务之间的多级网络调用。 网络是脆弱的 , RPC 请求有较大的概率会遇到超时 、 抖动 、 断…

浅聊find_package命令的搜索模式(Search Modes)

背景 find_package应该算是我们使用最多的cmake命令了。但是它是如何找到上游库的.cmake文件的&#xff1f; 根据官方文档&#xff0c;整理下find_package涉及到的搜索模式。 搜索模式 find_package涉及到的搜索模式有两种&#xff1a;模块模式(Module mode)和配置模式(Conf…

【LLaMA-Factory】使用LoRa微调训练DeepSeek-R1-Distill-Qwen-7B

【LLaMA-Factory】使用LoRa微调训练DeepSeek-R1-Distill-Qwen-7B 本地环境说明禁用开源驱动nouveau安装nvidia-smi安装Git环境安装Anaconda(conda)环境下载DeepSeek-R1-Distill-Qwen-7B模型安装LLaMA-Factory下载LLaMA-Factory安装LLaMA-Factory依赖修改环境变量安装deepspeedA…

使用lldb查看Rust不同类型的结构

目录 前言 正文 标量类型 复合类型——元组 复合类型——数组 函数 &str struct 可变数组vec Iter String Box Rc Arc RefCell Mutex RwLock Channel 总结 前言 笔者发现这个lldb挺好玩的&#xff0c;可以查看不同类型的结构&#xff0c;虽然这好像是C的东…