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中添加搜索引擎的域名来允许它们正常访问。