参考说明1
1. Nginx 配置需要注意的安全问题
在配置 Nginx 时,有几个常见的安全问题需要注意:
1.1 CRLF 注入漏洞
CRLF 注入漏洞是由于在配置文件中错误地使用了 $uri 变量,导致换行符(CRLF)被注入到 HTTP 头中,从而可能引发会话固定漏洞、CSRF 漏洞或 XSS 漏洞。
修复方法:
- 使用
$request_uri代替$uri,因为$request_uri是完整的 URI,不会进行解码,从而避免了 CRLF 注入。
1.2 目录穿越漏洞
目录穿越漏洞通常出现在 Nginx 做反向代理时,如果 alias 路径配置不当,可能导致攻击者访问到服务器上的任意文件。
修复方法:
- 确保
location和alias的路径配置一致,避免路径穿越。
1.3 HTTP 头被覆盖的问题
在 Nginx 配置中,子块中的 add_header 会覆盖父块中的 add_header,这可能导致一些重要的安全头被意外移除。
修复方法:
- 在每个需要添加安全头的位置单独配置,或者在父块中配置后,在子块中再次添加,确保不会被覆盖。
1.4 其他安全问题
-
弱密码套件:确保
ssl_ciphers配置中不包含不安全的加密套件。 -
CORS 配置不当:过度允许的 CORS 访问可能导致跨站请求伪造(CSRF)攻击。
-
TLS 版本过低:禁用 TLS 1.0 及以下版本,使用更安全的 TLS 1.2 或 TLS 1.3。
2. Nginx 安全配置案例
以下是一个包含上述安全修复措施的 Nginx 配置案例:
nginx
http {# 全局配置client_max_body_size 300M;keepalive_timeout 55;client_body_timeout 10;client_header_timeout 10;send_timeout 10;limit_conn ops 20;limit_conn_zone $binary_remote_addr zone=ops:10m;autoindex off;dav_methods off;server_tokens off;client_body_buffer_size 1K;client_header_buffer_size 1k;large_client_header_buffers 2 1k;# 添加安全头add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:; connect-src 'self'; frame-ancestors 'self';";add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";add_header X-Permitted-Cross-Domain-Policies "master-only";add_header Referrer-Policy "origin";add_header X-Download-Options "noopen" always;add_header Clear-Site-Data "storage";add_header Cross-Origin-Embedder-Policy require-corp;add_header Cross-Origin-Opener-Policy same-site;add_header Cross-Origin-Resource-Policy same-site;add_header Permissions-Policy "interest-cohort=()";add_header X-Frame-Options "SAMEORIGIN";add_header X-XSS-Protection "1; mode=block";add_header X-Content-Type-Options "nosniff";# 服务器配置server {listen 80;server_name example.com;# 重定向到 HTTPSreturn 301 https://$host$request_uri;}server {listen 443 ssl http2;server_name example.com;# SSL 证书配置ssl_certificate /path/to/certificate.crt;ssl_certificate_key /path/to/private.key;# 启用更强的 SSL/TLS 配置ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers HIGH:!aNULL:!MD5;# 禁止不安全的 HTTP 方法if ($request_method !~ ^(GET|HEAD|POST)$ ) {return 405;}# 禁止特定 User-Agentif ($http_user_agent ~* "java|python|perl|ruby|curl|bash|echo|uname|base64|decode|md5sum|select|concat|httprequest|httpclient|nmap|scan|nessus|wvs") {return 403;}# 禁止访问特定文件或目录location ~* \.(bak|swp|save|sh|sql|mdb|svn|git|old)$ {deny all;}location /(admin|phpadmin|status) {deny all;}# 静态文件处理location / {root /path/to/website;try_files $uri $uri/ =404;}# 反向代理配置location /api/ {proxy_pass http://backend_server;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}
}
说明:
-
全局配置:设置了一些通用的安全参数,如限制请求体大小、连接超时、限制并发连接数等。
-
安全头:添加了一系列的安全响应头,以增强网站的安全性。
-
服务器配置:
- 配置了 HTTP 到 HTTPS 的重定向。
- 启用了 SSL/TLS,并配置了更强的加密套件和协议版本。
- 禁止了不安全的 HTTP 方法和特定的 User-Agent。
- 禁止了访问特定文件或目录。
- 设置了静态文件的根目录和反向代理配置。
通过以上配置,可以大大提高 Nginx 服务器的安全性。
参考说明2
- 更新 Nginx 版本:确保使用最新版本的 Nginx,以获得最新的安全补丁。
- 限制访问:使用
allow和deny指令来限制对服务器的访问,只允许特定的 IP 地址访问。 - 隐藏敏感信息:通过修改
server_tokens设置为off,可以防止 Nginx 在错误页面上暴露其版本号。 - 启用 SSL/TLS:使用 HTTPS 来加密数据传输,防止中间人攻击。
- 配置防火墙:使用防火墙(如 iptables 或 ufw)来限制对 Nginx 端口的访问。
- 限制请求大小:通过设置
client_max_body_size来限制客户端可以发送的请求体大小,防止大文件上传导致的拒绝服务攻击。 - 使用安全的缓存策略:合理配置缓存策略,避免缓存敏感信息。
- 日志记录:启用详细的日志记录,以便监控和分析潜在的攻击行为。
下面是一个完整的 Nginx 安全配置案例:
# 定义一个 upstream 服务器组
upstream backend {server 127.0.0.1:8080;
}# HTTP 服务器块
server {listen 80;server_name example.com;# 重定向所有 HTTP 请求到 HTTPSreturn 301 https://$host$request_uri;
}# HTTPS 服务器块
server {listen 443 ssl;server_name example.com;# SSL 配置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-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';ssl_prefer_server_ciphers on;# 隐藏 Nginx 版本号server_tokens off;# 限制请求体大小client_max_body_size 10M;# 访问控制allow 192.168.1.0/24; # 允许的 IP 范围deny all; # 拒绝其他所有 IP# 日志记录access_log /var/log/nginx/access.log;error_log /var/log/nginx/error.log;# 反向代理配置location / {proxy_pass http://backend;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}
}
说明:
- SSL/TLS 配置:使用了强加密套件和协议版本,确保传输的安全性。
- 隐藏敏感信息:通过
server_tokens off隐藏 Nginx 的版本号。 - 限制请求大小:通过
client_max_body_size限制上传文件的大小。 - 访问控制:通过
allow和deny指令限制对服务器的访问。 - 日志记录:启用详细的日志记录,便于监控和分析。
以上配置是一个基本的安全配置案例,实际应用中可能需要根据具体需求进行调整。
