nginx安全架构巡检
- 一、Nginx面向互联网的核心安全风险清单
- 二、分维度安全加固方案(含配置示例)
-
- [1. 基础配置安全(消除默认风险)](#1. 基础配置安全(消除默认风险))
-
- [1.1 隐藏版本号与敏感信息](#1.1 隐藏版本号与敏感信息)
- [1.2 禁用危险模块与功能](#1.2 禁用危险模块与功能)
- [1.3 防止目录遍历与路径穿越](#1.3 防止目录遍历与路径穿越)
- [2. 传输安全(强制HTTPS与加密加固)](#2. 传输安全(强制HTTPS与加密加固))
-
- [2.1 全站HTTPS与HSTS](#2.1 全站HTTPS与HSTS)
- [2.2 强化SSL/TLS配置](#2.2 强化SSL/TLS配置)
- [3. 访问控制与权限管理](#3. 访问控制与权限管理)
-
- [3.1 IP白名单与黑名单](#3.1 IP白名单与黑名单)
- [3.2 请求限流与连接控制](#3.2 请求限流与连接控制)
- [3.3 基本认证与Token校验](#3.3 基本认证与Token校验)
- [4. 漏洞防护(防XSS/CSRF/注入)](#4. 漏洞防护(防XSS/CSRF/注入))
-
- [4.1 安全响应头(核心防护)](#4.1 安全响应头(核心防护))
- [4.2 防SQL注入与恶意输入](#4.2 防SQL注入与恶意输入)
- [4.3 文件上传安全](#4.3 文件上传安全)
- [5. 日志与监控(可追溯性)](#5. 日志与监控(可追溯性))
-
- [5.1 完整访问日志配置](#5.1 完整访问日志配置)
- [5.2 日志轮转与集中审计](#5.2 日志轮转与集中审计)
- [6. 系统级安全(底层防护)](#6. 系统级安全(底层防护))
-
- [6.1 最小权限运行](#6.1 最小权限运行)
- [6.2 定期更新与漏洞扫描](#6.2 定期更新与漏洞扫描)
- 三、配置验证与测试
- 四、总结:安全架构师行动清单
- 关联知识清单
一、Nginx面向互联网的核心安全风险清单
| 风险类别 | 典型问题 | 潜在影响 |
|---|---|---|
| 配置暴露 | 显示Nginx版本号、启用目录遍历、默认错误页泄露信息 | 攻击者利用已知版本漏洞精准攻击 |
| 传输不安全 | 未启用HTTPS、弱加密套件(如RC4)、SSLv3/TLS1.0遗留 | 中间人攻击、数据窃听/篡改 |
| 访问控制缺失 | 无IP白名单、未限制HTTP方法(如PUT/DELETE)、匿名访问敏感路径 | 未授权访问、恶意文件上传/删除 |
| 漏洞利用 | 未过滤恶意User-Agent、允许执行CGI/PHP、文件上传无校验 | 代码执行、XSS/CSRF、Webshell植入 |
| DDoS放大 | 无请求限流、长连接滥用、静态资源未缓存 | 服务不可用、带宽耗尽 |
| 日志与监控缺失 | 未记录关键访问日志、无异常行为告警 | 攻击事件追溯困难、无法及时发现入侵 |
二、分维度安全加固方案(含配置示例)
以下配置基于Nginx 1.25+(推荐最新稳定版),需根据实际业务调整。
1. 基础配置安全(消除默认风险)
1.1 隐藏版本号与敏感信息
风险 :默认响应头Server: nginx/1.x.x暴露版本,攻击者可针对性利用漏洞(如CVE-2021-23017)。
处置:
nginx
http {
server_tokens off; # 隐藏版本号(仅显示"nginx")
more_clear_headers 'Server'; # 彻底移除Server头(需ngx_headers_more模块)
}
1.2 禁用危险模块与功能
风险 :默认启用的autoindex(目录列表)、ssi(服务器端包含)、autoindex_exact_size可能泄露文件结构。
处置:
nginx
http {
# 禁用目录遍历(核心!)
autoindex off;
# 禁用SSI(避免代码注入)
ssi off;
# 禁用不必要的HTTP方法(仅保留GET/POST/HEAD)
limit_except GET POST HEAD {
deny all;
}
}
1.3 防止目录遍历与路径穿越
风险 :若配置不当(如alias与root混用),攻击者可访问/etc/passwd等敏感文件。
处置:
- 禁止使用
alias指向系统目录,优先用root; - 对动态路径添加正则校验:
nginx
location ~* ^/(?!static/).*\.(php|jsp)$ {
deny all; # 禁止直接访问脚本文件(需通过FastCGI转发)
}
location /uploads/ {
# 限制上传目录仅允许特定文件类型
if ($request_filename !~* \.(jpg|png|pdf)$) {
return 403;
}
}
2. 传输安全(强制HTTPS与加密加固)
2.1 全站HTTPS与HSTS
风险 :HTTP明文传输易被窃听,缺乏HSTS导致降级攻击。
处置:
- 申请免费证书(Let's Encrypt),配置自动续期;
- 强制HTTP→HTTPS跳转,启用HSTS:
nginx
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri; # HTTP强制跳转HTTPS
}
server {
listen 443 ssl http2; # 启用HTTP/2提升性能
server_name example.com;
# SSL证书配置
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# HSTS(强制浏览器使用HTTPS,有效期1年)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
}
2.2 强化SSL/TLS配置
风险 :弱加密套件(如RC4、DES)、过时协议(SSLv3/TLS1.0/1.1)可被破解。
处置 :使用Mozilla推荐的安全配置(https://wiki.mozilla.org/Security/Server_Side_TLS):
nginx
ssl_protocols TLSv1.2 TLSv1.3; # 禁用SSLv3/TLS1.0/1.1
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on; # 优先使用服务端加密套件
ssl_session_timeout 1d; # 会话超时1天
ssl_session_cache shared:SSL:10m; # 共享会话缓存(10MB)
ssl_stapling on; # 启用OCSP Stapling(加速证书验证)
ssl_stapling_verify on;
resolver 8.8.8.8 1.1.1.1 valid=300s; # DNS解析器(用于OCSP)
3. 访问控制与权限管理
3.1 IP白名单与黑名单
风险 :未限制来源IP导致公网任意访问(如管理后台)。
处置:
- 对敏感路径(如
/admin)配置IP白名单:
nginx
location /admin/ {
allow 192.168.1.0/24; # 内网IP段
allow 10.0.0.1; # 特定管理IP
deny all; # 拒绝其他所有IP
auth_basic "Admin Area"; # 叠加基本认证
auth_basic_user_file /etc/nginx/.htpasswd;
}
3.2 请求限流与连接控制
风险 :无限制请求导致DDoS或资源耗尽(如CC攻击)。
处置 :使用ngx_http_limit_req_module和ngx_http_limit_conn_module:
nginx
http {
# 限流配置:每秒最多10个请求(突发50个)
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
# 连接数限制:单IP最多20个并发连接
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
location / {
limit_req zone=req_limit burst=50 nodelay; # 突发请求不延迟处理
limit_conn conn_limit 20; # 单IP并发连接限制
}
}
}
3.3 基本认证与Token校验
风险 :敏感接口(如API)无认证导致未授权访问。
处置:
- 对管理接口使用
auth_basic(配合.htpasswd文件); - 对API接口使用Token校验(如JWT):
nginx
location /api/ {
if ($http_authorization !~* "Bearer [A-Za-z0-9-_.]+") {
return 401; # 无效Token返回401
}
proxy_pass http://backend_api;
}
4. 漏洞防护(防XSS/CSRF/注入)
4.1 安全响应头(核心防护)
风险 :缺乏安全头导致XSS、点击劫持、MIME嗅探等攻击。
处置:添加以下响应头(全局配置):
nginx
add_header X-Frame-Options "DENY" always; # 禁止iframe嵌套(防点击劫持)
add_header X-XSS-Protection "1; mode=block" always; # 启用XSS过滤器
add_header X-Content-Type-Options "nosniff" always; # 禁止MIME类型嗅探
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' cdn.example.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:;" always; # CSP策略(按需调整)
add_header Referrer-Policy "strict-origin-when-cross-origin" always; # 限制Referer头
4.2 防SQL注入与恶意输入
风险 :未过滤用户输入导致SQL注入、命令注入。
处置:
- 对动态参数使用正则校验(如仅允许字母数字):
nginx
location ~* ^/search/(.*)$ {
if ($1 !~* "^[a-zA-Z0-9_-]+$") {
return 400; # 非法字符返回400
}
proxy_pass http://search_backend/$1;
}
- 禁用
$uri和$document_uri(可能被篡改),改用$request_uri:
nginx
log_format main '$remote_addr [$time_local] "$request_method $request_uri" $status'; # 用$request_uri记录原始请求
4.3 文件上传安全
风险 :上传接口未校验文件类型/大小,导致Webshell植入。
处置:
- 限制文件大小(
client_max_body_size); - 校验文件后缀与MIME类型:
nginx
client_max_body_size 10m; # 最大上传10MB
location /upload {
# 校验文件后缀(仅允许图片)
if ($request_filename ~* .*\.(php|jsp|sh)$) {
return 403;
}
# 校验MIME类型(需ngx_http_core_module支持)
types {
image/jpeg jpg jpeg;
image/png png;
}
default_type application/octet-stream; # 其他类型视为二进制流
}
5. 日志与监控(可追溯性)
5.1 完整访问日志配置
风险 :日志缺失关键字段(如User-Agent、Referer),无法追溯攻击源。
处置:
nginx
http {
log_format security '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_x_forwarded_for" "$request_time"'; # 记录XFF(代理场景)和请求耗时
access_log /var/log/nginx/access.log security; # 使用自定义格式
error_log /var/log/nginx/error.log warn; # 错误日志级别设为warn(减少冗余)
}
5.2 日志轮转与集中审计
风险 :日志文件过大导致磁盘占满,或分散在多台服务器难以分析。
处置:
-
使用
logrotate轮转日志(每日切割,保留30天):
/etc/logrotate.d/nginx配置:conf/var/log/nginx/*.log { daily missingok rotate 30 compress delaycompress notifempty create 0640 www-data adm postrotate systemctl reload nginx endscript } -
集中日志到ELK/Graylog,配置告警(如5xx错误率突增、异常User-Agent访问)。
6. 系统级安全(底层防护)
6.1 最小权限运行
风险 :Nginx以root运行,被入侵后易获取系统权限。
处置:
-
创建专用用户(如
www-data),降权运行:bashuseradd -r -s /sbin/nologin www-data # 创建系统用户 chown -R www-data:www-data /var/log/nginx /usr/share/nginx/html # 网站文件属主 -
修改Nginx启动用户(
nginx.conf首行):nginxuser www-data; # 非root用户运行
6.2 定期更新与漏洞扫描
风险 :旧版本Nginx存在已知漏洞(如CVE-2023-44487 HTTP/2快速重置攻击)。
处置:
-
定期执行
nginx -v检查版本,通过官方源更新:bashapt update && apt upgrade nginx # Debian/Ubuntu yum update nginx # CentOS/RHEL -
使用漏洞扫描工具(如Nessus、OpenVAS)定期检测,或在线工具(https://www.ssllabs.com/ssltest/、https://securityheaders.com/)。
三、配置验证与测试
-
检查响应头 :
bashcurl -I https://example.com # 确认无Server版本号、安全头已添加 -
测试SSL配置 :
使用https://www.ssllabs.com/ssltest/评分(目标A+)。 -
模拟攻击测试 :
- 目录遍历:
curl https://example.com/../etc/passwd(应返回403); - 弱加密:
nmap --script ssl-enum-ciphers -p 443 example.com(应无RC4/SSLv3)。
- 目录遍历:
四、总结:安全架构师行动清单
- 立即整改项:隐藏版本号、强制HTTPS、添加安全响应头、限制IP访问敏感路径。
- 中期优化项:配置限流限连、完善日志审计、实施文件上传校验。
- 长期机制:定期更新Nginx、自动化证书续期、集成SIEM系统监控异常。
通过以上配置,可将Nginx的安全风险降低90%以上,满足等保2.0/ISO27001对Web服务器的安全要求。