Nginx安全防护与HTTPS部署

目录

 一:隐藏版本号

1,修改配置文件

 1,验证

二,限制危险请求方法

1,修改配置文件

 2,进行验证

 三,请求限制(CC攻击防御)

1,通过nginx的模块限制请求速率

2,进行测试

四,防盗链

1,防盗链如何使用

2,如何避免防盗链

五,高级防护

1,动态黑名单

2,自动添加黑名单

六:nginx https的作用及配置

1,在nginx https的作用

 一:隐藏版本号

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

1,修改配置文件

[root@localhost ~]# curl -I 192.168.10.102
HTTP/1.1 200 OK
Server: nginx/1.26.3                        ##查看nginx的版本号为1.26.3
...... //省略部分内容


[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf        ##修改nginx的配置文件
http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens off;                                  ##添加此行内容


 1,验证

[root@localhost ~]# nginx -t         ##验证配置文件是否有错
[root@localhost ~]# nginx -s reload   ##重载nginx



[root@localhost html]# curl -I 192.168.10.102        ##进行测试
HTTP/1.1 200 OK
Server: nginx
.....//省略部分内容

二,限制危险请求方法

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

Nginx 作为 Web 服务器和反向代理服务器,支持处理多种 HTTP 请求方法:

  • GET - 请求获取资源
  • POST - 提交数据到服务器
  • PUT - 上传或替换资源
  • DELETE - 删除资源
  • HEAD - 类似 GET 但只返回头部
  • OPTIONS - 查询服务器支持的请求方法
  • PATCH - 对资源进行部分修改
  • TRACE - 回显服务器收到的请求(用于测试)

1,修改配置文件

    server {
        listen       80;
        server_name  localhost;

        if ($request_method !~ ^(GET|HEAD|POST)$ ) {              ##在server中添加部分内容
                return 444;
        }

$request_method   ##Nginx 内置变量,表示客户端发起的 HTTP 请求方法(如 GET、POST 等)
! ##表示取反
~  ##表示不区分大小写
^  ##表示匹配开头
return 444 ##不匹配(GET|HEAD|POST)则输出444状态码

 2,进行验证

[root@localhost ~]# nginx -s  reload      ##验证之前先重载nginx服务

[root@localhost html]# curl -XPUT -I 192.168.10.102     ##在101客户金进行验证
curl: (52) Empty reply from server


[root@localhost ~]# cat /usr/local/nginx/logs/access.log   ##在nginx服务器查看日志文件
192.168.10.101 - - [29/Apr/2025:09:06:23 +0800] "PUT / HTTP/1.1" 444 0 "-" "curl/8.4.0"

 三,请求限制(CC攻击防御)

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

1,通过nginx的模块限制请求速率

http {    
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;       ##在http部分添加此行


   server {
        listen       80;
        server_name  localhost;
        limit_req zone=req_limit burst=20 nodelay;  ##在server部分添加此行
}

limit_req_zone ##定义共享内存区

$binary_remote_addr ##是一个内置变量,用于表示客户端 IP 地址的二进制格式

zone=req_limit:10m ##创建名为 req limit 的共享内存区,大小 10M,用来存储客户端的IP

rate=10r/s ##限制并发数,每个 IP 每秒可以发起的请求次数

1imit req ##实施速率限制

zone=req_limit ##绑定到预定义的共享内存区

burst=20 ##类似与等候区,超出并发数的请求会到等候区,等候区占满后,多余的请求会立刻返回 503

nodelay ##立即处理突发请求而不延迟,相当于立即处理等候区的请求,多余的请求会立刻返回 503

2,进行测试

##在101客户机进程测试 
[root@localhost /]# dnf -y install httpd-tools         ##测试前先安装此工具

[root@localhost /]# ab -n 300 -c 30 http://192.168.10.102/
-n 300  ##发起300个请求
-c 30   ##发起30个连接


##在nignx服务端进行查看
[root@localhost conf]# cat /usr/local/nginx/logs/access.log | grep 503 | wc -l
279
##因为我们在nginx的配置文件中设置了burst=20等候区为20

四,防盗链

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

1,防盗链如何使用

  • 准备两台centos的服务器
IP地址域名服务
192.168.10.102www.aaa.com源主机
192.168.10.101www.bbb.com盗链主机
  • 准备win10客户机

修改win10的hosts文件

192.168.10.102 www.aaa.com

192.168.10.101 www.bbb.com

##在101,102分别添加
[root@localhost src]# vim /etc/hosts
192.168.10.102 www.aaa.com
192.168.10.101 www.bbb.com

 
##在102nignx服务器进行配置                
[root@localhost html]# ls                    ##准备好后缀为jpg的图片
111.jpg  50x.html  index.html


[root@localhost src]# vim /usr/local/nginx/html/index.html       ##编辑nginx的网页文件
<html>
	<body>
		<h1>111 It work!
                   <img src="111.png"/>
		</h1>
	</body>
</html>


##在101进行操作
[root@localhost html]# dnf -y install httpd

[root@localhost html]# vim /var/www/html/index.
<html>
        <body>
                <h1> wo shi dao tu zhe
                        <img src="http://www.aaa.com/kgc.png"/>
                </h1>
        </body>
</html>

分别测试102和101

2,如何避免防盗链

##在nginx的服务器配置文件进行添加 添加到server块中
  location ~* \.(gif|jpg|jpeg|png)$ {
            root html;
            valid_referers aaa.cpm *.aaa.com;
    if ($invalid_referer) {
            return 403;
    }
}


~* \.(gif|jpg|jpeg|png)$    ##表示正则表达式匹配不区分大小写,以gif jpg jpeg png结尾的文件

valid_referers              ##设置信任的网站,可以正常使用图片

aaa.cpm *.aaa.com;          ##后面的网站或者域名:包含相关字符串的网址

if语句:如果链接的来源域名不在valid_referers列出的表中,$invalid_referer为1,则执行后面的操作,返回403错误码

验证

五,高级防护

1,动态黑名单

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

[root@localhost conf]# vim blockips.conf 
192.168.1.0/24 1;   ##封禁整个网段
192.168.10.101 1;   ##封禁单个IP


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


[root@localhost conf]# vim /usr/local/nginx/conf/nginx.conf  ##此配置文件进行添加
http {
  geo $block_ip  {
            default 0;
            include /usr/local/nginx/conf/blockips.conf;
    }

server {
   if ($block_ip) {
                return 403;
        }



geo   ##Nginx内置模块指令,专门用于处理P地址相关的逻辑。基于客户端IP 地址生成一个变量值,用于后续的访问控制判断,

$block ip    ##自定义的变量名,存储计算结果(通常为0或1)

default 0    ##默认值,表示不在黑名单中的 IP 允许访问

if($block ip)    ##当变量值为1时触发封禁逻辑

使用被禁止访问的主机101进行访问

[root@localhost html]# curl 192.168.10.102
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.26.3</center>
</body>
</html>

2,自动添加黑名单

##自动添加到黑名单的命令
[root@localhost conf]# 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.conf 

[root@localhost conf]# cat /usr/local/nginx/conf/blockips.conf  ##查看黑名单的文件
192.168.10.101 1;




[root@localhost conf]# vi /aaa.sh        ##将自动添加黑名单的命令添加到aaa.sh脚本中
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.conf 

[root@localhost conf]# chmod +x /aaa.sh    ##授予可执行的权限


##使用本机进行访问
[root@localhost conf]# for i in $(seq 101);do curl 192.168.10.102;done

##使用aaa.sh脚本
[root@localhost conf]# bash /aaa.sh 

##发现102也被加了进去
[root@localhost conf]# cat /usr/local/nginx/conf/blockips.conf 
192.168.10.101 1;
192.168.10.102 1;


六:nginx https的作用及配置

HTTP为什么不安全

  • 窃听风险:中间人可以获取到通信内容,由于内容是明文,所以获取明文后有安全风险
  • 篡改风险:中间人可以篡改报文内容后再发送给对方,风险极大。
  • 冒充风险:比如你以为是在和某宝通信,但实际上是在和一个钓鱼网站通信。

安全通信的四大原则

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

HTTPS的几种加密方式

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

非对称加密:使用一对密钥,即公钥和私钥。公钥可以公开,任何人都可以使用公钥对数据进行加密;私钥由所有者保密,只有使用对应的私钥才能对加密数据进行解密。

数字证书:数字证书是一种由证书颁发机构(CA)签发的电子文件,它将用户的身份信息(如姓名、组织、域名等)与公钥进行绑定。其主要作用是验证公钥的真实性和持有者的身份,防止中间人攻击,确保通信双方能够安全地交换信息。

1,在nginx https的作用

  • 加密传输数据:HTTPS 使用 SSL/TLS 协议对数据进行加密,确保数据在客户端(如浏览器)和服务器(如 Nginx 服务器)之间传输时不被窃取或篡改。例如,用户在电商网站上输入的用户名、密码、信用卡信息等敏感数据,通过 HTTPS 加密后,即使数据在传输过程中被拦截,攻击者也无法获取其真实内容。
  • 验证服务器身份:HTTPS 通过数字证书来验证服务器的身份,确保客户端连接到的是真实可靠的服务器,而不是假冒的服务器。用户访问银行网站时,浏览器会验证银行服务器的数字证书,如果证书有效且与银行域名匹配,用户就可以确认自己连接到了正确的银行服务器,防止遭受钓鱼攻击。
  • 数据完整性保护:HTTPS 使用消息认证码(MAC)等技术来确保数据在传输过程中的完整性,防止数据被意外或恶意篡改。如果数据在传输过程中被篡改,接收方可以通过验证 MAC 发现数据的变化,从而拒绝接受被篡改的数据。

2,在nginx上配置https

[root@localhost /]# mkdir -p /etc/nginx/ssl
[root@localhost ~]# openssl req -x509 -nodes  -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt -subj "/C=CN/ST=beijing/L=beijing/O=MyOrg/CN=localhost"


  server {
        listen       443 ssl;           ##修改监听的端口号
        ssl_certificate /etc/nginx/ssl/nginx.crt; ##指定证书和私钥路径
        ssl_certificate_key /etc/nginx/ssl/nginx.key;

    server {                            ##启用配置文件最下面的server
        listen       80;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;
return 301 https://$host$request_uri;            ##添加此行



-x509    ##生成自签名证书(而非 CSR) 

-nodes    ##不加密私钥(无密码保护)

-days 365   ##证书有效期1年。

-newkey ##rsa:2048:生成2048 位的 RSA 私钥。

-subj   ##证书主题信息(按需修改字段)

验证:选择高级——接收风险并继续 即可访问到

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值