Nginx安全防护
目录
Nginx安全防护
核心安全配置
1.编译安装 Nginx
(1)安装支持软件
(2)创建运行用户、组和日志目录
(3)编译安装 Nginx
(4)添加Nginx系统服务
2.隐藏版本号
3.限制危险请求方法
4.请求限制(CC攻击防御)
(1)使用 Nginx的 limit req 模块限制请求速率
(2)压力测试验证
5.防盗链
防盗链原理
Nginx 防盗链配置
配置示例
1. 基础防盗链配置
2. 允许空 Referer(直接访问)
3. 高级配置(安全链)
注意事项
Nginx安全防护
核心安全配置
1.编译安装 Nginx
(1)安装支持软件
Nginx 的配置及运行需要 pcre、zlib 等软件包的支持,因此应预先安装这些软件的开发包(devel),以便提供相应的库和头文件,确保 Nginx 的安装顺利完成。
[root@localhost “]# dnf install -y 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-1.26.3
[root@localhost nginx-l.26.3]#./configure--prefix=/usr/local/nginx
--pid-path=/var/run/nginx.pid
--user=nginx
--group=nginx
--with-http_ssl module
--with-http v2 module
--with-http realip module
--with-http_stub status module\
#状态统计模块
with-http_gzip static module
--with-pcre
--with-stream
[root@localhost nginx-l.26.3]# make && make install
为主程序 nginx 创建链接文件
[root@localhost nginx-1.26.3]# 1n-s /usr/local/nginx/sbin/nginx/usr/local/sbin/
(4)添加Nginx系统服务
[root@localhost]# vim /lib/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
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.隐藏版本号
在生产环境中,需要隐藏 Nginx 的版本号,以避免泄漏 Nginx 的版本,使攻击者不能针对特定版本进行攻击。在隐藏版本号之前,可以使用 Fiddler 工具抓取数据包,查看Nginx 版本,也可以在 0penEuler 中使用命令 curl -Ihttp://192.168.10.202/查看:
[root@localhost ~]# curl -l 192.168.10.202
HTTP/1.1 200 OK
Server:nginx/1.26.3//版本号
... ... //省略部分内容
#修改配置文件
[root@localhost ~]#vim /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.202
HTTP/1.1 200 OK
Server:nginx //版本号被隐藏
... ... //省略部分内容
3.限制危险请求方法
不安全的请求方式,是潜在的安全风险,TRACE(易引发XST攻击)、PUT/DELETE(文件修改风险)、CONNECT(代理滥用),通过正则表达式匹配请求方法,非白名单方法返回 444(无响应关闭连接)
1.修改配置文件
[root@localhost ~]#vim /usr/local/nginx/conf/nginx.conf
server {
... ...
if ($request_method !~"(GET HEAD|POST)$ ) {return 444;}
... ...
}
2.验证测试请求
测试 PUT/DELETE 请求
[root@localhost ~]#curl -XPUT -I 192.168.10.202
curl:(52)Empty reply from server
查看 access. log
192.168.10.202--[11/Mar/2025:18:30:46 +0800]"PUT / HTTP/1.1" 444 0 "-" "curl/8.4.0"
PS:注意测试 TRACE 和 CONNECT 方法时,状态码不是 444。原因如下:
- CONNECT 请求的目标不是代理服务器时,服务器必须返回400Bad Request,Nginx 核心层在请求解析阶段直接拦截,根本不进入后续的 location 处理流程
- 现代 Nginx默认禁用 TRACE 方法,在 ngx http core module 阶段直接返回 405 Not Allowed
4.请求限制(CC攻击防御)
CC 攻击(Challenge Collapsar 攻击)是一种常见的网络攻击方式,通过大量合法或伪造的小流量请求来耗尽服务器资源,导致正常用户无法访问网站。要在 Nginx 中有效防止 CC 攻击,可以采用多种策略和方法。
CC攻击,也称为连接数攻击或请求速率限制攻击,通过模拟大量用户访问来消耗服务器资源,从而使得正常用户无法正常访问网站。为了防止此类攻击,可以使用 Nginx 提供的模块来限制请求速率和并发连接数
(1)使用 Nginx的 limit req 模块限制请求速率
编辑配置文件
[root@localhost ~]#vim /usr/local/nginx/conf/nginx.conf
http {# 定义限制区(10MB 内存/每秒 10 请求)limit_req_zone $binary_remote_addr zone=req_limit:l0m rate-10r/s;# 其他全局配置...server {location / {root html;index index.html index.php;limit_reg_zone=req_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=req_limit:绑定到预定义的共享内存区
- burst=20:类似于等候区,超出并发数的请求会等候区,等候区占满后,多余的请求会立刻返回503
- nodelay:立即处理突发请求而不延迟,相当于立即处理等候区的请求,多余的请求会立刻返回503
(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.202/
查看 access.log 发现大量请求日志状态码 503
[root@localhost ~]#tail -300/usr/local/nginx/logs/access.log|grep -c 503
279
5.防盗链
防盗链(Hotlink Protection)是一种防止其他网站直接链接到你的服务器资源(如图片、视频、文件等)的技术。通过防盗链设置,可以避免他人盗用你的带宽和服务器资源,提升安全性和资源利用率。
防盗链原理
防盗链的核心是检查请求的 Referer
头(HTTP 请求头字段),判断请求来源是否合法:
Referer
头表示当前请求的来源页面 URL。- 如果请求来自非法域名(如其他网站),Nginx 可以拒绝访问或返回错误。
Nginx 防盗链配置
Nginx 通过 valid_referers
指令实现防盗链,语法如下:
valid_referers none | blocked | server_names | string ...;
-
none
:允许没有Referer
头的请求(如直接访问)。 -
blocked
:允许Referer
头被防火墙或代理删改的请求。 -
server_names
:允许指定的域名或服务器名。 -
string
:自定义允许的域名或正则表达式。
配置示例
以下是常见的防盗链配置场景:
1. 基础防盗链配置
location ~* \.(jpg|jpeg|png|gif|mp4)$ {valid_referers none blocked example.com *.example.net;if ($invalid_referer) {return 403;# 或重定向到警告图片# rewrite ^ /anti-hotlink.jpg;}
}
- 作用:保护图片和视频文件。
- 逻辑:仅允许来自
example.com
、*.example.net
的请求,或没有 Referer 的请求(如浏览器直接访问)。 - 阻止行为:非法请求返回 403 错误码。
2. 允许空 Referer(直接访问)
valid_referers none blocked example.com *.example.net;
none
:允许直接输入 URL 或本地文件打开的资源请求。blocked
:允许 Referer 被防火墙修改的请求。
3. 高级配置(安全链)
通过生成加密链接防止盗链(需配合程序生成临时 URL):
location /protected/ {secure_link $arg_md5,$arg_expires;secure_link_md5 "$secure_link_expires$uri$remote_addr secret";if ($secure_link = "") {return 403;}if ($secure_link = "0") {return 410; # 链接过期}
}
注意事项
-
Referer 的局限性
- Referer 可能被伪造(需结合其他方法如 Token 验证)。
- 部分浏览器或隐私设置可能不发送 Referer。
-
静态资源与动态资源
- 静态资源(如图片)通常通过
location
匹配文件扩展名。 - 动态资源(如 API)可通过校验 Token 或签名。
- 静态资源(如图片)通常通过
-
日志记录
可记录非法请求用于分析:log_format hotlink '$time_iso8601 $invalid_referer $http_referer'; access_log /var/log/nginx/hotlink.log hotlink;
案例
(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)把图片 1ogo.jpg 放到源主机(www.aaa.com)的工作目录下
[root@localhost ~]#ls /usr/local/nginx/html
index.html kgc.png
(4)编辑原网站首页文件
[root@localhost ~]#vim /usr/local/nginx/html/index.html
<html><body><hl>aaa It work!<img src="kgc.png”/〉 //网页中显示图片的代码</h1></body>
</htm1>
(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>
</htm1>
(7)测试访问盗链网站(盗链成功)
(8)配置Nginx防盗链
[root@localhost #vim /usr/local/nginx/conf/nginx.conf
location *.(gifljpg jpeg pnglbmp|swf|flv mp4 webplico)$ {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 页面。
(9)测试访问盗链网站(盗链失败)