Nginx安全防护与HTTPS部署实战

一:核心安全配置

1.编译安装Nginx

(1)安装支持软件

[root@localhost ~]# dnf instally gcc make pcre-devel zlib-developenssl-devel perl-ExtUtils-MakeMaker git wget tar

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

[root@localhost~] # useradd -M-s /sbin/nologin nginx

[root@localhost~]# mkdir -p /var/log/nginx

[root@localhost~]# chown-R nginx:nginx /var/log/nginx

(3)编译安装Nginx

[root@localhost~]# tar zxf nginx-l.26.3.tar.gz

[root@localhost~ ]# cd nginx-l.26.3

[root@localhost nginx-l.26.3]#./configure\

--prefix=/usr/local/nginx\
--user=nginx\
--group=nginx\
--with-http ssl module\
--with-http v2 module\
--with-http realip module\
--with-http stub status module  \              #状态统计模块

--withhttp gzip static module\
--with-pcre\
--with-stream
[root@localhost nginx-l.26.3]# make && make install

为主程序 nginx 创建链接文件

[root@localhost nginx-l.26.3]# In -s /usr/local/nginx/sbin/nginx/usr/local/sbin/

(4)添加Nginx系统服务

[root@localhost ~]# vi /lib/systemd/system/nginx.service

[Unit]
Description=The NGINX HTTP and reverse proxy server

After=network.target
[Service]
Type=forking
ExecStartPre=/usr/local/sbin/nginx -t
ExecStart=/usr/local/sbin/nginx
ExecReload=/usr/local/sbin/nginx  -s reload
ExecStop=/bin/ki11-S QUIT $MAINPID
TimeoutStopSec=5
KillMode=process

PrivateTmp=true

User=root
Group=root
[Install]
WantedBy=multi-user.target
[root@localhost~]#systemctl daemon-reload

[root@localhost~]# systemctl start nginx

[root@localhost~]# systemctl enable nginx

2.隐藏版本号

作用

避免攻击者通过版本号获取已知漏洞信息,减少攻击面。

配置方法
  1. 打开 Nginx 主配置文件(通常为 /etc/nginx/nginx.conf 或 /usr/local/nginx/conf/nginx.conf):
    sudo vi /etc/nginx/nginx.conf
    

  2. 在 http 块或 server 块中添加:
    server_tokens off;  # 关闭版本号显示
    

  3. 验证:访问 http://你的域名,查看响应头(如通过浏览器开发者工具或 curl -I http://你的域名),Server 字段会显示为 nginx 而非 nginx/1.23.4

3.限制危险请求方法

作用

禁用 Web 服务器中不必要的 HTTP 请求方法(如 PUTDELETEOPTIONS 等),防止恶意文件上传或资源删除。

配置方法
  1. 在 server 或 location 块中添加以下规则,禁止危险方法:
    location / {
        # 允许的方法(按需调整,通常保留 GET、HEAD、POST)
        if ($request_method !~ ^(GET|HEAD|POST)$) {
            return 405;  # 返回 Method Not Allowed 状态码
        }
        
        # 额外:限制 OPTIONS 方法(用于跨域预检),按需保留
        if ($request_method = 'OPTIONS') {
            add_header Access-Control-Allow-Origin *;
            add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
            add_header Access-Control-Allow-Headers 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
            add_header Access-Control-Max-Age 1728000;
            add_header Content-Type 'text/plain; charset=utf-8';
            add_header Content-Length 0;
            return 204;  # 允许 OPTIONS,但返回空内容
        }
    }
    

  2. 重启 Nginx 使配置生效:
    sudo nginx -s reload

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

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

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

编辑配置文件

[root@localhost ~]#vim /usr/local/nginx/conf/nginx. conf

http {
#定义限制区(10MB 内存/每秒 10 请求)
limit_req_zone $binary_remote_addr zone=reg limit:l0m rate=10r/s,
#其他全局配置...
server i
location /{
root html;

index index.html index. php;

limit reg zone=reg limit burst=20 nodelay;

}

......

    }

}

关键参数说明:

  • 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 服务器性能测试工具。它主要用于评估服务器在并发访问下的性能表现,包括响应时间、吞吐量等关键指标。

[root@localhost~]#dnf install httpd-tools -y

5.防盗链

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

资源清单

本实验需要两台主机

操作系统域名IP服务
opereulerwww.aaa.com192.168.10.202源主机
opereulerwww.bbb.com192.168.10.101盗链主机

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

192.168.10.202 www. aaa. com
192.168.10.201 www. bbb.com

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

192.168.10.202 www. aaa.com

192.168.10.201 www.bbb. com

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

[root@localhost ~]#ls /usr/local/nginx/htm1

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

[root@localhost~]#vim /usr/local/nginx/html/index.html
<html>
    <body>
       <hl>aaa It work!
          <img src="kgc.png"/> //网页中显示图片的代码
       </h1>
    </body>
</html>

(5)测试访问源网站

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

[root@localhost~]#vim /usr/local/nginx/html/index.html
<html>
    <body>
      <hl>bbb It work!
        <img src="http://www.aaa.com/kgc.png”/> //网页中显示图片
      </h1>
    </body>
</html>

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

(8)配置 Nginx 防盗链

[root@localhost ~]#vim /usr/local/nginx/conf/nginx.conf
location~ *\.(gif jpgljpeg pnglbmplswf|flv|mp4 webp ico)${
           root html;
           valid referers aaa.com *.aaa.com;

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

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

二:高级防护

1.动态黑名单

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

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

[root@localhost ~]# vim /usr/local/nginx/conf/blockips.conf
192.168.1.0/24 1;#封禁整个网段
192.168.10.201 1;#封禁 ip

IP 地址后的数字含义:

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

(2)编辑主配置文件

在 Nginx 的主配置文件(通常是 nginx.conf 或者在 sites - available 目录下的站点配置文件)里引入黑名单配置文件,示例如下:

server {
    listen 80;
    server_name example.com;

    # 引入黑名单配置文件
    include /path/to/blacklist.conf;

    location / {
        # 其他配置
        root /var/www/html;
        index index.html;
    }
}

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

配置完成后,重新加载 Nginx 配置:

sudo nginx -s reload

使用被封禁的 IP 地址尝试访问网站,若看到 “403 Forbidden” 页面,就表明封禁配置生效了。

(4)自动添加黑名单

可以借助脚本实现自动添加 IP 到黑名单。以下是一个简单的 Python 脚本示例,它会将访问失败次数过多的 IP 添加到黑名单:

import subprocess

# 假设这里有一个函数可以获取需要封禁的IP列表
def get_ips_to_block():
    # 这里可以实现获取IP列表的逻辑,例如从日志文件中统计
    return ['192.168.1.102', '192.168.1.103']

ips = get_ips_to_block()
for ip in ips:
    # 将IP添加到黑名单配置文件
    with open('blacklist.conf', 'a') as f:
        f.write(f'deny {ip};\n')

# 重新加载Nginx配置
subprocess.run(['sudo', 'nginx', '-s', 'reload'])

2.nginx https 配置

(1)https 概念

1-HTTP为什么不安全

      HTTP 是明文传输协议,数据在传输过程中容易被窃听、篡改和伪造。例如,攻击者可以在网络中截获 HTTP 请求和响应,获取用户的敏感信息,像用户名、密码、信用卡号等。

2-安全通信的四大原则
  • 机密性:确保数据在传输过程中不被第三方获取,通常采用加密算法对数据进行加密。
  • 完整性:保证数据在传输过程中不被篡改,接收方可以验证数据是否与发送方发送时一致。
  • 身份验证:确认通信双方的身份,防止中间人攻击。
  • 不可否认性:确保发送方不能否认发送过的消息。
3-HTTPS通信原理简述

HTTPS 是在 HTTP 的基础上加入了 SSL/TLS 协议,其通信过程如下:

  1. 客户端发起请求:客户端向服务器发送 HTTP 请求,同时携带客户端支持的 SSL/TLS 版本和加密算法列表。
  2. 服务器响应:服务器选择一个 SSL/TLS 版本和加密算法,并返回证书和会话密钥。
  3. 客户端验证证书:客户端验证服务器证书的有效性,若证书有效,生成会话密钥。
  4. 密钥交换:客户端和服务器使用会话密钥进行加密通信。

(2)nginx 配置https证书

1-使用openssl生成证书和私钥生成证书和私钥

可以使用以下命令生成自签名的 SSL 证书和私钥:

# 生成私钥
sudo openssl genrsa -out /etc/ssl/private/nginx-selfsigned.key 2048

# 生成证书签名请求(CSR)
sudo openssl req -new -key /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.csr

# 生成自签名证书
sudo openssl x509 -req -days 365 -in /etc/ssl/certs/nginx-selfsigned.csr -signkey /etc/ssl/private
2-nginx 启用https

在 Nginx 主配置文件中添加 HTTPS 配置,示例如下:

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
    ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;

    location / {
        root /var/www/html;
        index index.html;
    }
}

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

配置完成后,重新加载 Nginx 配置:

sudo nginx -s reload
3-通过浏览器验证

       这样,Nginx 就开启了 HTTPS 服务。需要注意的是,自签名证书在浏览器中会显示不安全提示,若要在生产环境使用,建议从权威的证书颁发机构(CA)获取 SSL 证书

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值