一、隐藏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版本更新,修复已知漏洞,进一步提升安全性。