Nginx安全

一、隐藏Nginx版本号

风险点:默认情况下,Nginx会在响应头(Server字段)和错误页面中暴露版本号,攻击者可根据版本号针对性利用已知漏洞。

配置方法(修改nginx.conf主配置文件):

配置代码:在http块中添加以下两行

http {

server_tokens off; # 关闭版本号显示(响应头和错误页均隐藏)

more_set_headers "Server: Unknown"; # 可选,将Server字段替换为自定义内容,需安装ngx_headers_more模块

}

验证:使用curl命令查看响应头,无版本号即生效:curl -I 服务器IP

二、限制危险请求方法

风险点:PUT、DELETE、TRACE、OPTIONS等请求方法,若未使用可能被攻击者利用,发起恶意请求(如修改服务器文件、探测服务器信息)。

配置方法(在server块或location块中添加):

配置代码:在server块或location块中添加

location / {

只允许GET、POST、HEAD三种常用请求方法,其余拒绝

if (request_method !\~ \^(GET\|POST\|HEAD)) {

return 403; # 拒绝访问,返回403状态码

}

}

说明:根据业务需求调整允许的请求方法,若有API接口需使用PUT/DELETE,需单独对接口路径配置允许规则。

三、请求限制(CC攻击防御)

风险点:CC攻击(恶意频繁请求)会消耗服务器CPU、内存资源,导致服务不可用,通过限制单位时间内的请求次数实现防御。

配置方法(需先开启ngx_http_limit_req_module模块,默认开启):

配置代码:需先开启ngx_http_limit_req_module模块(默认开启),在http块中添加

http {

定义请求限制规则:name=limit_req_zone,key=$binary_remote_addr(按客户端IP限制)

zone=req_limit:10m(内存区域大小,存储IP请求记录),rate=10r/s(限制每秒10次请求)

limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;

server {

location / {

应用上面定义的限制规则,burst=5(允许突发5次请求,超过则排队)

nodelay(不延迟突发请求,直接处理,超出后返回503)

limit_req zone=req_limit burst=5 nodelay;

}

}

}

参数说明:

  • rate:核心限制,如10r/s(每秒10次)、60r/m(每分钟60次),根据服务器性能调整。

  • burst:突发请求数,超出rate的请求会排队,超过burst则返回503。

  • nodelay:避免排队导致的延迟,适合对响应速度要求高的场景。

四、压力测试验证(验证请求限制效果)

目的:确认请求限制配置生效,避免配置过严影响正常访问,或过松无法抵御攻击。

工具:使用ab(Apache Bench)工具,需提前安装(yum install httpd-tools 或 apt install apache2-utils)。

测试命令(模拟高频请求):

测试命令(模拟高频请求):

ab -n 100 -c 10 http://服务器IP/

说明:-n 表示总请求数,-c 表示并发数,后面跟访问目标地址。

验证结果:查看测试输出,若出现"503 Service Unavailable",说明请求限制生效;同时查看Nginx日志(/var/log/nginx/error.log),会有"limiting requests, excess: X.XXXX by zone "req_limit""的记录。

注意:测试需在非生产环境进行,避免影响正常业务。

五、防盗链(防止资源被非法引用)

风险点:网站的图片、视频、文件等静态资源被其他网站非法引用,消耗自身带宽,增加服务器负载。

配置方法(在server块或location块中添加,针对静态资源):

配置代码:在server块或location块中添加,针对静态资源

针对图片、视频、音频等静态资源配置防盗链

location ~* \.(jpg|jpeg|png|gif|mp4|mp3|flv)$ {

valid_referers:允许引用的合法域名,*表示允许空引用(直接访问资源)

valid_referers none blocked 服务器域名 *.服务器域名;

若引用来源不合法,返回403或跳转至自定义图片

if ($invalid_referer) {

return 403;

rewrite ^/ https://服务器域名/403.jpg break; # 跳转至自定义防盗链提示图

}

}

说明:valid_referers后填写自身网站域名,*.服务器域名表示允许子域名引用;若需允许特定第三方域名引用,直接添加该域名即可。

六、动态黑名单(拦截恶意IP)

作用:针对频繁发起恶意请求、扫描服务器的IP,动态加入黑名单,禁止其访问,补充请求限制的防御效果。

配置方法(结合ngx_http_access_module和shell脚本,实现动态添加):

1. 定义黑名单文件

配置代码:在http块中添加

http {

引入黑名单文件,blacklist.conf中存放被禁止的IP(每行一个IP)

include /etc/nginx/blacklist.conf;

server {

location / {

禁止黑名单中的IP访问

deny $blacklist;

allow all; # 允许其他所有IP访问

}

}

}

2. 编写shell脚本(自动提取恶意IP并加入黑名单)

脚本内容(脚本路径:/root/nginx_blacklist.sh):

#!/bin/bash

提取近10分钟内请求次数超过50次的IP(可调整阈值)

awk '{print 1}' /var/log/nginx/access.log \| grep -E '\^\[0-9\]+\\.\[0-9\]+\\.\[0-9\]+\\.\[0-9\]+' | sort | uniq -c | awk '1\>50 {print "deny "2";"}' > /etc/nginx/blacklist.conf

重启Nginx生效

systemctl reload nginx

3. 设置定时任务(每10分钟执行一次脚本)

定时任务配置:执行crontab -e,添加以下内容

*/10 * * * * /bin/bash /root/nginx_blacklist.sh

说明:表示每10分钟执行一次该脚本。

注意:定期清理黑名单文件,避免IP过多导致配置文件过大;可根据实际攻击情况调整请求次数阈值。

七、配置HTTPS证书(加密传输)

风险点:HTTP协议传输数据明文可见,易被窃听、篡改,配置HTTPS可实现数据加密,保障传输安全,同时提升网站可信度。

前提:获取SSL证书(可通过Let's Encrypt免费申请,或购买商业证书),证书文件通常包含.pem(公钥)和.key(私钥)。

配置方法(在server块中添加,监听443端口):

配置代码:在server块中添加,监听443端口,同时关闭80端口并强制跳转

关闭HTTP端口(80),强制跳转至HTTPS

server {

listen 80;

server_name 服务器域名;

return 301 https://hostrequest_uri; # 永久跳转至HTTPS

}

HTTPS配置

server {

listen 443 ssl;

server_name 服务器域名;

证书路径(根据实际证书存放路径修改)

ssl_certificate /etc/nginx/ssl/xxx.pem; # 公钥文件

ssl_certificate_key /etc/nginx/ssl/xxx.key; # 私钥文件

优化SSL配置(提升安全性和性能)

ssl_protocols TLSv1.2 TLSv1.3; # 只允许安全的TLS协议版本

ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384;

ssl_prefer_server_ciphers on; # 优先使用服务器端指定的加密套件

ssl_session_cache shared:SSL:10m; # 启用SSL会话缓存

ssl_session_timeout 10m; # 会话超时时间

}

验证:访问https://服务器域名,浏览器地址栏显示小锁图标,且无安全提示,即配置生效。

补充:Let's Encrypt证书有效期为90天,可配置自动续期脚本,避免证书过期导致网站无法访问。

总结

以上7个配置覆盖了Nginx的核心安全场景,实际部署时需结合服务器性能、业务需求调整参数;同时需定期查看Nginx日志,监控异常请求,及时优化配置;此外,需保持Nginx版本更新,修复已知漏洞,进一步提升安全性。

相关推荐
wanhengidc2 小时前
服务器被攻击该怎么办
运维·服务器·网络·安全·游戏·智能手机
繁华如雪亦如歌2 小时前
Linux常用指令简介与速查
linux
掘根2 小时前
【即时通讯项目】环境搭建8——RabbitMQ,AMQP-CPP
linux·分布式·rabbitmq
白狐_7983 小时前
硬核实战:从零构建飞书 × OpenClaw 自动化情报站(五)
运维·自动化·飞书
幸福指北12 小时前
我用 Tauri + Vue 3 + Rust 开发了这款跨平台网络连接查看工具PortView,性能炸裂!
运维·网络·监控
V__KING__13 小时前
systemd-remount-fs,fstab之间的渊源
linux·服务器·网络
酿情师13 小时前
Windows Subsystem for Linux (WSL, Ubuntu)安装教程(详细)
linux·windows·ubuntu
Titan202414 小时前
Linux环境变量个人笔记
linux·服务器·c++
青柠代码录14 小时前
【Linux】路径区分:testdir、testdir/、testdir/*
linux·运维·服务器