5月27日 22:13

Nginx 如何进行安全配置?有哪些安全最佳实践?

Nginx 如何进行安全配置?有哪些安全最佳实践?

核心思路是:隐藏信息、限制访问、加密传输、防御攻击,四层递进。

一、隐藏服务器指纹

攻击者第一步是信息收集,版本号是最直接的突破口。

nginx
server_tokens off;

关掉之后,响应头和错误页不再暴露 Nginx 版本。面试追问:还能怎么隐藏? 可以用 more_set_headers 模块改掉 Server 字段本身,或者在前端反代层抹掉这个头。

二、访问控制与限流

IP 限制和速率限制是防暴力攻击的第一道门。

nginx
# IP 白名单 location /admin { allow 192.168.1.0/24; deny all; } # 限流 limit_req_zone $binary_remote_addr zone=req:10m rate=10r/s; limit_req zone=req burst=20 nodelay; limit_conn_zone $binary_remote_addr zone=conn:10m; limit_conn conn 10;

面试追问:burst 和 nodelay 区别是什么? burst 允许突发排队,nodelay 让排队的请求立即处理而不延时等待,否则超出的请求会被延迟处理。

三、SSL/TLS 与安全头

HTTPS 是底线配置,安全头加固浏览器端防护。

nginx
ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header Content-Security-Policy "default-src 'self'" always;

面试追问:为什么关 ssl_session_tickets? 默认的 session ticket key 是明文保存在 worker 共享内存中的,多台 Nginx 之间无法复用,且存在前向安全性问题。集群部署时应手动轮换 key 或直接关闭。

四、文件与目录防护

禁止访问隐藏文件和敏感后缀,堵住信息泄露的口子。

nginx
location ~ /\. { deny all; } location ~* \.(htaccess|ini|log|sql|bak|swp)$ { deny all; } autoindex off;

五、超时与缓冲区

防止慢速攻击和缓冲区溢出。

nginx
client_body_timeout 10; client_header_timeout 10; keepalive_timeout 5; send_timeout 10; client_max_body_size 10m; client_header_buffer_size 1k;

面试追问:如果只改一个配置,改哪个? 先关 server_tokens,零成本高风险。然后上 HTTPS,这是生产环境硬性要求。限流和访问控制按业务场景逐步加。

常见误区

if 正则匹配 SQL 注入或 XSS 关键词来拦截攻击,这是错误的。Nginx 的 if 在 location 中行为不稳定,且正则容易被编码绕过。防注入应交给 WAF(如 ModSecurity)或应用层参数校验,Nginx 只做流量层防护。

标签:Nginx