参考说明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;
# 重定向到 HTTPS
return 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-Agent
if ($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 请求到 HTTPS
return 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
指令限制对服务器的访问。 - 日志记录:启用详细的日志记录,便于监控和分析。
以上配置是一个基本的安全配置案例,实际应用中可能需要根据具体需求进行调整。