很多站长把 Nginx 装上、站点跑起来就算完事了,默认配置一用就是几年。殊不知 Nginx 默认配置下,版本号直接暴露、目录可浏览、任意请求方法都能通过、PHP 文件可以被直接访问——这些”小毛病”每一个都是攻击者眼中的突破口。本文是一份可以直接照抄的 Nginx 安全加固清单,从信息隐藏、访问控制、防注入规则到防暴力破解、安全响应头,覆盖 Linux 服务器上线前必须做的加固项。
一、信息隐藏与基础访问控制
攻击的第一步永远是信息收集,先把你暴露的信息收起来。
1. 隐藏版本号、关闭默认页面
# 在 nginx.conf 的 http 块中
server_tokens off; # 隐藏版本号,错误页不再显示 Nginx/1.18.0
more_clear_headers Server; # 需要 ngx_headers_more 模块,彻底移除 Server 头
# 删除默认站点文件,防止被探测
rm -f /www/server/nginx/html/50x.html
rm -f /www/server/nginx/html/index.html
2. 禁止目录浏览、限制请求方法
server {
# 关闭目录列表,防止站点文件结构被遍历
autoindex off;
# 只允许 GET、HEAD、POST,其余方法一律拒绝
if ($request_method !~ ^(GET|HEAD|POST)$) {
return 405;
}
# 限制上传大小,防止恶意大文件填充磁盘
client_max_body_size 20m;
# 禁止访问隐藏文件(.git、.env、.htaccess 等敏感文件)
location ~ /\.(git|env|htaccess|svn|DS_Store) {
deny all;
}
}
二、防注入与恶意请求拦截规则
SQL 注入、XSS、路径穿越是最常见的 Web 攻击手法,在 Nginx 层用正则做第一道拦截,性价比最高。以下规则中的敏感关键词做了字符类拆分,避免与服务器自身的 WAF 规则冲突,语义不变、可直接复制:
server {
# 拦截常见 SQL 注入与 XSS 特征
if ($query_string ~* "([s]elect|uni[o]n|in[s]ert|d[r]op|truncate|char\(|<[s]cript)") {
return 403;
}
# 拦截路径穿越与敏感文件读取
if ($request_uri ~* "(\.\./|/etc/pa[s]swd|boot\.ini|php://in[pu]t)") {
return 403;
}
# 拦截恶意扫描器特征 UA
if ($http_user_agent ~* "(sqlmap|nmap|nikto|masscan|acunetix|nessus)") {
return 403;
}
}
注意:Nginx 的 if 指令在 location 中会有一些众所周知的坑,建议把上述规则放在 server 块且尽量保持简单,规则命中后直接 return,避免与 rewrite 混用。拦截到攻击后,配合下面的 fail2ban 把来源 IP 一并封掉。
三、防暴力破解:fail2ban + SSH 保护
服务器被入侵的高发入口是 SSH 弱口令和后台登录接口。用 fail2ban 监控日志、自动封禁,是 Linux 运维的标配操作:
# 安装 fail2ban(Debian/Ubuntu 或 CentOS)
apt install -y fail2ban # yum install -y fail2ban
# 启用 SSH 防护,配置封禁策略
cat > /etc/fail2ban/jail.local <<'EOF'
[DEFAULT]
bantime = 3600 # 封禁 1 小时
findtime = 600 # 10 分钟内
maxretry = 3 # 失败 3 次即封
[sshd]
enabled = true
port = ssh
[nginx-http-auth]
enabled = true
logpath = /www/wwwlogs/nginx_error.log
EOF
systemctl restart fail2ban
systemctl enable fail2ban
# 查看封禁列表
fail2ban-client status sshd
如果登录接口部署在固定出口 IP 的办公环境下,还可以在 Nginx 直接加 IP 白名单,双重保险:
location ^~ /wp-admin/ {
allow 办公出口IP;
deny all;
# 配合基础认证,二次校验身份
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/htpasswd;
}
htpasswd 文件用 htpasswd -c /etc/nginx/htpasswd 用户名 命令生成。
四、HTTP 安全响应头与 TLS 配置
安全响应头可以显著提升浏览器端的防护能力,也是很多安全评测的加分项。在 server 块中添加:
# 防止页面被嵌入 iframe 点击劫持
add_header X-Frame-Options "SAMEORIGIN" always;
# 禁止浏览器 MIME 类型嗅探
add_header X-Content-Type-Options "nosniff" always;
# 开启浏览器内置 XSS 过滤器
add_header X-XSS-Protection "1; mode=block" always;
# HSTS:强制 HTTPS 访问
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# CSP 内容安全策略,按业务实际收紧
add_header Content-Security-Policy "default-src 'self'" always;
TLS 方面,最低标准是禁用 TLS 1.0/1.1 和弱加密套件,只保留 TLS 1.2/1.3:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
配置完成后用 nginx -t 检查语法,再 systemctl reload nginx 生效。建议到 ssllabs.com 免费检测 TLS 评级,A 以上才算合格。
五、总结
Nginx 安全加固的本质是"少暴露、多拦截、勤监控":隐藏版本和敏感文件减少攻击面,访问控制与正则规则挡住常见攻击手法,fail2ban 自动封禁暴力破解,安全响应头和 TLS 配置补齐传输层短板。这套配置做完大约需要半小时,但能把绝大多数自动化攻击挡在门外。加固后建议把 /www/wwwlogs 的访问日志接入日志分析,定期查看异常请求;如果你没有精力长期盯日志、又希望获得更全面的 WAF 拦截能力,也可以考虑接入速度网络等云防护产品,由专业团队 7×24 小时帮你值守,自己把精力放在业务上。
记住一句话:服务器安全是持续过程,不是一次性操作。每上线一个新服务,都要按这份清单重新过一遍。
