当前位置: 首页 > article >正文

Nginx防御机制

文章目录

    • 1.访问控制
      • 1.1基于 IP 的访问限制
      • 1.2基于用户认证的访问控制
    • 2.防止 DDoS 攻击
      • 2.1连接数限制
      • 2.2请求速率限制
    • 3.缓存机制
      • 3.1内容缓存
    • 4.安全协议与加密
      • 4.1SSL/TLS 加密
      • 4.2HTTP/2 支持
    • 5.防 SQL 注入和 XSS 攻击
      • 5.1输入验证与过滤
    • 6.防盗链
      • 6.1基于 Nginx 的防盗链配置方法
      • 6.2防盗链的应用场景和局限性


1.访问控制

1.1基于 IP 的访问限制

  • 原理:通过限制特定 IP 地址或 IP 段的访问来防止恶意攻击。可以使用 Nginx的allow和deny指令来实现。例如,只允许来自特定 IP 地址192.168.1.100的访问,而拒绝其他所有 IP地址访问某个特定目录。

  • 配置示例:

location /admin {
    deny all;
    allow 192.168.1.100;
}
  • 应用场景:适用于保护敏感的管理后台区域,只允许授权的管理员 IP 访问,防止未经授权的用户尝试登录后台进行恶意操作。

1.2基于用户认证的访问控制

  • 原理:要求用户提供有效的用户名和密码才能访问特定的资源。Nginx 可以使用httpauth_basic模块与外部的密码文件或者认证后端(如 LDAP)配合来实现用户认证。
  • 配置示例(使用密码文件):
    首先,创建一个密码文件(例如使用htpasswd工具):
htpasswd -c /etc/nginx/.htpasswd user1

这会创建一个名为.htpasswd的密码文件,并添加一个名为user1的用户,然后会提示输入密码。

  • 在 Nginx 配置中使用密码文件:
location /private {
    auth_basic "Restricted Area";
    auth_basic_user_file /etc/nginx/.htpasswd;
}
  • 应用场景:对于一些包含敏感信息的区域,如用户个人资料修改页面、内部文档存储区域等,通过用户认证来确保只有合法用户能够访问。

2.防止 DDoS 攻击

2.1连接数限制

  • 原理:限制每个客户端 IP 的同时连接数,防止恶意攻击者通过大量建立连接来耗尽服务器资源。Nginx 可以使用limit_conn模块来实现连接数限制。
  • 配置示例:
    首先定义一个共享内存区域来存储连接数状态:
http {
    limit_conn_zone $binary_remote_addr zone=addr:10m;
}
  • 然后在服务器或特定位置块中设置连接数限制:
server {
    location / {
        limit_conn addr 10;
    }
}
  • 应用场景:当网站遭受 DDoS 攻击,攻击者尝试使用大量 IP 地址建立连接时,这种机制可以有效地减少连接数,保证服务器正常服务其他合法用户。

2.2请求速率限制

  • 原理:限制每个客户端 IP 在单位时间内的请求次数,避免单个 IP 过度频繁地请求服务器资源。通过limit_req模块来实现。
  • 配置示例:
    同样先定义一个共享内存区域来存储请求速率状态:
http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
}
  • 在服务器或位置块中设置请求速率限制:
server {
    location / {
        limit_req zone=one;
    }
}
  • 应用场景:如果攻击者使用自动化脚本频繁请求某个页面(如登录页面、搜索页面等),请求速率限制可以防止服务器被大量无效请求淹没。

3.缓存机制

3.1内容缓存

  • 原理:Nginx 可以缓存经常访问的静态资源(如 HTML 文件、图片、CSS 和 JavaScript 文件等),当客户端再次请求相同的资源时,Nginx 直接从缓存中提供数据,而不需要再次向后端服务器请求,从而减轻后端服务器的负载,提高响应速度,同时也能减少恶意请求对后端服务器的冲击。
  • 配置示例:
http {
    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m;
}
server {
    location / {
        proxy_cache my_cache;
        proxy_cache_valid 200 302 60m;
        proxy_cache_valid 404 10m;
        proxy_pass http://backend_server;
    }
}
  • 应用场景:对于高流量的网站,缓存机制可以大大提高网站的性能和稳定性,特别是对于一些更新频率不高的页面,如产品展示页面、新闻列表页面等。

4.安全协议与加密

4.1SSL/TLS 加密

  • 原理:使用 SSL(Secure Sockets Layer)或 TLS(Transport Layer Security)协议对传输的数据进行加密,确保数据在客户端和服务器之间传输的安全性。Nginx 可以配置为终止 SSL 连接,然后与后端服务器通过普通的 HTTP 或者再次建立 SSL 连接进行通信。
  • 配置示例(简单的单域名 SSL 配置):
server {
    listen 443 ssl;
    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/key.pem;
    location / {
        proxy_pass http://backend_server;
    }
}
  • 应用场景:对于涉及用户登录、支付等敏感信息传输的网站,SSL/TLS 加密是必不可少的,可以防止中间人窃取用户的账号密码、信用卡信息等。

4.2HTTP/2 支持

  • 原理:HTTP/2 是新一代的 HTTP 协议,相比 HTTP/1.1,它具有更高的性能和安全性。Nginx 支持 HTTP/2,可以通过简单的配置启用。HTTP/2 采用二进制格式传输数据,并且支持多路复用、头部压缩等特性,能够有效提高网站的性能和安全性。
  • 配置示例:
server {
    listen 443 ssl http2;
    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/key.pem;
    location / {
        proxy_pass http://backend_server;
    }
}
  • 应用场景:适用于所有需要高性能和高安全性的现代网站,尤其是那些对页面加载速度和用户体验要求较高的网站。

5.防 SQL 注入和 XSS 攻击

5.1输入验证与过滤

  • 原理:在 Nginx 层面,可以对客户端提交的请求参数进行初步的过滤和验证。例如,通过设置ngx_http_real_ip_module模块来获取客户端真实 IP 地址,然后对请求中的参数进行检查,防止恶意用户通过 SQL 注入或 XSS(跨站脚本攻击)等方式攻击后端服务器。
  • 配置示例(简单的参数过滤):
server {
    location / {
        if ($arg_param1 ~* "union") {
            return 403;
        }
        proxy_pass http://backend_server;
    }
}
  • 应用场景:对于所有接受用户输入的网站应用,如表单提交页面、搜索功能页面等,通过在 Nginx 层面进行初步过滤可以减轻后端应用程序的安全负担。

6.防盗链

防盗链是一种防止其他网站非法引用本网站资源(如图片、视频、文件等)的机制。其原理是通过检查请求资源的来源(即引用页面的
URL),判断请求是否合法。如果请求来自未经授权的域名,就拒绝提供资源。

6.1基于 Nginx 的防盗链配置方法

  • 简单的基于 HTTP Referer 检查的防盗链配置
  • 配置示例:
location ~* \.(jpg|jpeg|png|gif|mp4)$ {
    valid_referers none blocked yourdomain.com;
    if ($invalid_referer) {
        return 403;
    }
}
  • 解释:

location ~* .(jpg|jpeg|png|gif|mp4)$:这个location块使用了正则表达式来匹配以.jpg、.jpeg、.png、.gif、.mp4结尾的请求,也就是针对常见的图片和视频文件类型进行防盗链设置。

valid_referers none blocked yourdomain.com;:定义了合法的引用来源。none表示允许直接访问(例如用户在浏览器地址栏直接输入资源的 URL),blocked表示允许空的Referer头(有些浏览器可能会出于隐私原因不发送Referer),yourdomain.com是允许引用这些资源的域名,你需要将其替换为自己的域名。

if ($invalid_referer) {return 403;}:如果Referer不符合上述合法的引用来源,就返回403 Forbidden状态码,拒绝提供资源。

  • 使用更复杂的防盗链配置(结合 IP 和 Referer)
  • 配置示例:
map $http_referer $valid_referer {
    default         0;
    "~^https?://yourdomain.com" 1;
}
map $remote_addr $valid_ip {
    default         0;
    "192.168.1.0/24" 1;
}
location ~* \.(jpg|jpeg|png|gif|mp4)$ {
    if ($valid_referer = 0) {
        if ($valid_ip = 0) {
            return 403;
        }
    }
}
  • 解释:
这里使用了两个map指令。第一个map指令map $http_referer $valid_referer根据Referer头的值来判断是否是合法的引用。default 0表示默认情况下是不合法的,"~^https?://yourdomain.com"是一个正则表达式,用于匹配以http://或https://开头且域名是yourdomain.com的Referer,如果匹配成功则$valid_referer的值为1,表示合法。
第二个map指令map $remote_addr $valid_ip根据客户端的 IP 地址来判断是否合法。这里default 0表示默认不合法,"192.168.1.0/24"是一个 IP 段示例,你可以将其替换为允许访问资源的 IP 范围,如果客户端 IP 在这个范围内,$valid_ip的值为1,表示合法。
在location块中,先检查$valid_referer的值,如果为0(即不合法的引用),再检查$valid_ip的值,如果也为0(即不合法的 IP),就返回403 Forbidden状态码,拒绝提供资源。

6.2防盗链的应用场景和局限性

  • 应用场景:

对于有版权的内容网站,如图片素材网站、在线视频网站等,防盗链可以有效防止其他网站未经授权使用自己的资源,保护版权所有者的利益。
对于提供付费资源的网站,防止未付费用户通过其他网站的链接访问资源,保证只有合法付费用户能够使用这些资源。

  • 局限性:

有些浏览器插件或者工具可以修改Referer头,使得基于Referer检查的防盗链机制可能被绕过。不过这种情况相对较少,并且可以结合其他安全机制(如用户认证、IP 限制等)来增强防盗链的效果。
对于合法的搜索引擎爬虫等工具,可能会因为防盗链机制而无法正常抓取资源。在这种情况下,可以通过配置将搜索引擎的爬虫 IP 添加到合法的 IP 范围或者在valid_referers中添加搜索引擎的域名来允许它们正常访问。


http://www.kler.cn/a/409785.html

相关文章:

  • mysql数据库双机互为主从设置与数据库断电无法启动处理
  • Vue进阶面试题(三)
  • C++特殊类设计(不能被拷贝的类、只能在堆上创建对象的类、不能被继承的类、单例模式)
  • 《生成式 AI》课程 作业6 大语言模型(LLM)的训练微调 Fine Tuning -- part1
  • 数仓工具—Hive语法之窗口函数中的 case when
  • 2024深育杯misc2
  • 数据结构——停车场管理问题
  • 致翔OA open_juese.aspx SQL注入致RCE漏洞复现
  • 算法分析 —— 《位运算基础》
  • JavaScript中的Observer模式:设计模式与最佳实践
  • 赛氪媒体支持“2024科普中国青年之星创作交流活动”医学专场落幕
  • BIO/NIO
  • 后端开发入门
  • 游卡,科锐国际,蓝禾,汤臣倍健,三七互娱,顺丰,快手,途游游戏25秋招内推
  • Oracle-索引的创建和优化
  • 学习prompt
  • GitLab|GitLab报错:Restoring PostgreSQL database gitlabhq_production...
  • HTML密码小眼睛
  • 区块链学习笔记(1)--区块、链和共识 区块链技术入门
  • 【分治】--- 快速选择算法
  • 【优选算法】前缀和
  • C++入门学习基础
  • C++ 编程指南06 - 不要泄漏任何资源
  • 蓝桥杯每日真题 - 第23天
  • 【C++】C++11新特性详解:可变参数模板与emplace系列的应用
  • World of Warcraft /script SetRaidTarget(“target“, n, ““) n=8,7,6,5,4,3,2,1,0