Nginx 作为全球占有率最高的 Web 服务器和反向代理,承载着大量核心业务流量。然而,默认配置下的 Nginx 并非为安全而生——它优先考虑的是通用性和性能。如果直接部署到生产环境,可能暴露版本信息、遭受 DDoS 攻击、被利用进行 SSRF 探测,甚至成为恶意流量的跳板。
本文整理了一份可落地的 Nginx 安全加固清单,涵盖信息隐藏、访问控制、传输安全、限流防刷等关键维度,并附上配置片段,帮助你在不牺牲性能的前提下显著提升 Web 安全基线。
一、隐藏敏感信息,减少攻击面
攻击者通常从信息收集开始。Nginx 默认会在响应头和错误页面中暴露版本号,这相当于告诉攻击者“我可能有哪些已知漏洞”。
关闭版本号显示:
http {
server_tokens off;
}
在 server 或 location 块中同样生效。关闭后,Server 头只显示 nginx,不再附带具体版本。对于更彻底的隐藏,可使用 more_set_headers 模块(需编译 headers-more-nginx-module)修改或删除 Server 头。
禁用不必要的 HTTP 方法:
if ($request_method !~ ^(GET|POST|HEAD)$) {
return 405;
}
大多数业务只需要 GET、POST 和 HEAD。禁用 PUT、DELETE、TRACE 等方法可以防止文件上传漏洞和跨站追踪攻击。
二、传输层安全:HTTPS 与 HSTS
明文 HTTP 传输意味着 Cookie、Token 和表单数据可被中间人窃取。全站 HTTPS 已是底线要求。
强制 HTTP 跳转 HTTPS:
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
配置强加密套件与 HSTS:
server {
listen 443 ssl http2;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
}
HSTS 头告诉浏览器在指定时间内强制使用 HTTPS 访问,防止 SSL 剥离攻击。includeSubDomains 和 preload 需谨慎启用,确保所有子域都支持 HTTPS。
三、安全响应头:构建纵深防御
除了 HSTS,还有多个响应头可以抵御 XSS、点击劫持和 MIME 嗅探攻击。
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; frame-ancestors 'self'" always;
其中 CSP(内容安全策略) 是防御 XSS 最有力的武器之一。它通过白名单机制限制脚本、样式和资源的加载来源。即使攻击者成功注入恶意脚本,CSP 也会阻止其执行。需要注意的是,CSP 配置需要与前端资源加载方式匹配,建议先以 Content-Security-Policy-Report-Only 模式观察,确认无遗漏后再正式启用。
关于 XSS 的常见注入方式和前端防御手段,可参考《XSS 的常见方式和前端如何防御》一文,其中详细介绍了反射型、存储型和 DOM 型 XSS 的差异,以及输入过滤、输出编码和 CSP 的协同策略。
四、访问控制与限流防刷
Nginx 天然适合作为第一道防线拦截恶意流量。
限制请求速率:
http {
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
server {
location /api/ {
limit_req zone=req_limit burst=20 nodelay;
limit_req_status 429;
}
}
}
以上配置限制单 IP 每秒 10 个请求,突发允许 20 个。对于登录接口等敏感路径,可设置更严格的速率。
限制并发连接数:
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
limit_conn conn_limit 20;
limit_conn_status 503;
}
封禁恶意 IP 与 User-Agent:
if ($http_user_agent ~* (sqlmap|nikto|nmap|masscan)) {
return 403;
}
对于已知的扫描器、注入工具,可直接拒绝。更灵活的方式是结合 geo 模块或 map 指令维护黑名单。
五、防止 SSRF 与路径穿越
Nginx 作为反向代理时,若配置不当,可能被利用进行 SSRF 攻击。例如,使用 proxy_pass 时如果 URL 中包含用户可控变量,攻击者可能构造 http://169.254.169.254/ 访问云元数据。
安全实践:
- 避免在
proxy_pass中直接拼接用户输入; - 使用
resolver指令并限制解析范围; - 对内部服务使用独立域名,并在 Nginx 层做白名单校验。
防止路径穿越:
location ~* \.\./ {
deny all;
}
同时确保 root 和 alias 指令指向的目录不包含敏感文件。
六、日志与监控
安全加固离不开可观测性。确保访问日志和错误日志开启,并记录关键字段。
log_format security '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'rt=$request_time';
access_log /var/log/nginx/access.log security;
error_log /var/log/nginx/error.log warn;
定期分析日志中的异常状态码(如大量 403、429、499)和可疑 User-Agent,可及时发现攻击行为。结合 Fail2ban 等工具,可实现自动封禁。
七、其他加固建议
- 禁用目录列表: 确保
autoindex off;(默认即为 off,但需确认未被误开)。 - 限制请求体大小:
client_max_body_size 10m;防止超大请求耗尽资源。 - 设置超时时间:
client_body_timeout 10s; client_header_timeout 10s; send_timeout 10s;减少慢速攻击影响。 - 关闭
server_name中的通配符: 避免成为任意域名的默认主机。 - 使用非 root 用户运行: Nginx master 进程通常以 root 启动,但 worker 进程应以
www-data或nginx用户运行。
结语
Nginx 安全加固不是一次性任务,而是持续迭代的过程。上述清单覆盖了从传输层到应用层的主要风险点,但具体配置需根据业务特点调整。例如,CSP 策略过严可能导致前端功能异常,限流阈值过低可能误伤正常用户。
建议在测试环境验证每项配置后再上线,并定期回顾日志和漏洞公告。安全的核心在于纵深防御——Nginx 只是其中一环,后端应用的输入验证、数据库的防注入措施同样不可或缺。关于 MySQL 防止 SQL 注入的几种写法,可参考相关专题文章,从参数化查询、存储过程到 ORM 框架,构建完整的数据访问安全体系。
未经允许不得转载:任鹏个人博客 » Nginx 安全加固配置清单:从传输层到应用层的全面防护


朋友圈点赞图在线生成源码