nginx安全防护与https部署实战

发布于:2025-05-28 ⋅ 阅读:(19) ⋅ 点赞:(0)

目录

一:核心安全配置

1.隐藏版本号

2.限制危险请求方式:

3:请求限制

3.1使用Nginx的limit_req模块限制请求速率

3.2压力测试

4防盗链


一:核心安全配置

1.隐藏版本号

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

 root@localhost ~]# curl -I 192.168.10.101
 ​
 HTTP/1.1 200 OK
 ​
 Server: nginx/1.26.3  //版本号
 ​
 ......    //省略部分内容

修改配置文件

 root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
 http {
     include       mime.types;
     default_type  application/octet-stream;
 server_tokens off;     //隐藏版本号
 ......   //省略部分内容
 ​
 [root@localhost ~]#nginx -t
 [root@localhost ~]#nginx -s reload
 [root@localhost ~]# curl -I 192.168.10.101
 HTTP/1.1 200 OK
 Server: nginx    //版本号被隐藏
 ......          //省略部分内容
 ​

2.限制危险请求方式:

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

 [root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
 server {
 ......
 if ($request_method !~ ^(GET|HEAD|POST)$ ) {
         return 444;
    }
 ......
 }
 ​

验证

 #测试PUT/DELETE请求
 [root@localhost ~]# curl -XPUT -I 192.168.10.101
 curl: (52) Empty reply from server
 ​
 #查看access.log
 192.168.10.101 - - [11/Mar/2025:18:30:46 +0800] "PUT / HTTP/1.1" 444 0 "-" "curl/8.4.0"
 ​

3:请求限制

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

3.1使用Nginx的limit_req模块限制请求速率

编辑配置文件

 
http {
     # 定义限制区(10MB内存/每秒10请求)
     limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
     
 # 其他全局配置...
 ​
 ​
 server {
         location / {
             root html;
             index index.html index.php;
             limit_req zone=req_limit burst=20 nodelay;
             }
 ......
 }
 }
 ​
3.2压力测试

安装ab测试工具

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

 root@localhost ~]# dnf install httpd-tools -y
 #发起测试请求
 ​
 #共发起300个请求,每次发起30个请求
 root@localhost ~]# ab -n 300 -c 30 http://192.168.10.101/
 ​
 #查看access.log发现大量请求日志状态码503
 [root@localhost ~]# tail -300 /usr/local/nginx/logs/access.log | grep -c 503
 279
 ​

4防盗链

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

 
(1)修改 Windows 的 C:\Windows\System32\drivers\etc\hosts 文件,设置域名和 IP 映射关系
 ​
 192.168.10.101 www.aaa.com
 ​
 192.168.10.102 www.bbb.com
 ​
  (2)修改两台 OpenEuler 的 hosts 文件,设置域名和 IP 映射关系。
 ​
  192.168.10.101 www.aaa.com
 ​
 192.168.10.102 www.bbb.com
 ​
 #(2)把图片 kgc.png 放到源主机(www.aaa.com)的工作目录下
 ​
 [root@localhost ~]# ls /usr/local/nginx/html
 ​
 index.html kgc.png
 ​
  
 #(3)编辑原网站首页文件
 ​
 [root@localhost ~]# vi /usr/local/nginx/html/index.html
 ​
 <html>
 ​
 <body>
      <h1>aaa It work! </h1>
 ​
       <img src="kgc.png"/>     
 ​
 </body>
 ​
 </html>
 ​
  

测试访问源网站

编辑盗链网站首页文件

 [root@localhost ~]# dnf -y install httpd
 ​
 [root@localhost ~]# vi /usr/local/nginx/html/index.html
 ​
 <html>
 ​
 <body>
 ​
   <h1>bbb It work! </h1>
 ​
 •    <img src="http://www.aaa.com/kgc.png"/>                          
 ​
 </body>
 ​
 </html>
 ​
  
 ​
 [root@localhost ~]# systemctl stop firewalld
 ​
 [root@localhost ~]# systemctl start httpd

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

配置 Nginx 防盗链

 [root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
 ​
 location ~* \.(gif|jpg|jpeg|png|bmp|swf|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

  1. ~* .(jpg|gif|swf)$:这段正则表达式表示匹配不区分大小写,以.jpg 或.gif 或.swf 结尾的文件;

  2. Valid_referers:设置信任的网站,可以正常使用图片;

  3. 后面的网址或者域名:referer 中包含相关字符串的网址;

  4. If 语句:如果链接的来源域名不在 valid_referers 所列出的列表中,$invalid_referer 为 1,则执行后面的操作,即进行重写或返回 403 页面。

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

二:高级防护

1.动态黑名单

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

 #(1)编辑黑名单配置文件
 [root@localhost ~]# vi /usr/local/nginx/conf/blockips.conf
 192.168.1.0/24 1; #封禁整个网段
 192.168.10.102 1; #封禁ip
 ​
 #IP地址后的数字含义:
 #0       "";     # 允许
   #  1       403;    # 完全封禁
  #   2       444;    # 静默断开
 #    3       503;    # 服务不可用
 ​
 #(2)编辑主配置文件
 [root@localhost ~]# vi /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;     # 封禁动作
     }
 ​
 #重启服务,使策略生效
 [root@localhost ~]# nginx -t
 #(3)使用封禁ip测试访问
 [root@localhost ~]# curl 192.168.10.101
 <html>
 <head><title>403 Forbidden</title></head>
 <body>
 <center><h1>403 Forbidden</h1></center>
 <hr><center>nginx</center>
 </body>
 </html>
 ​
 #(4)自动添加黑名单
 自动封禁访问超过100次的IP
 #!/bin/bash
 # 自动封禁访问超过100次的IP
 awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | awk '{if($1>100) print $2" 1;"}' > /usr/local/nginx/conf/blockips.conf
 ​
 ​
 uniq -c:统计连续出现的次数,并在行首显示次数
 sort -nr:按数值排序
 [root@localhost ~]# nginx -s reload

2.nginx https配置

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

2.1nginx 配置https 证书

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

2.2 使用 openssl 生成证书和私钥生成证书和私钥

 #创建证书存储目录
 [root@localhost ~]# mkdir -p /etc/nginx/ssl
 #生成自签名证书
 [root@localhost ~]# 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"
 ​

2.3nginx启用https

 root@localhost ~]#vi /usr/local/nginx/conf/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;
 ​
     # 其他配置(如根目录)
     location / {
         root /usr/local/nginx/html;
         index index.html;
     }
 }
 ​
 # 可选:将 HTTP 请求重定向到 HTTPS
 server {
     listen 80;
     server_name localhost;
     return 301 https://$host$request_uri;
 }
 [root@localhost ~]#nginx -t
 [root@localhost ~]#nginx -s reload
 ​

2.4验证

访问https://你的服务器ip

浏览器会提示证书不安全(因自签名),选择“高级”--继续前往或信任此证书(测试环境可忽略警告)。


网站公告

今日签到

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