NGINX 安全配置参数总结
1. 基本安全配置:减少信息泄露和攻击面
这些参数主要用于隐藏服务器细节、限制不必要功能,并控制进程权限。
-
server_tokens
解释 :控制是否在 HTTP 响应头和错误页面中显示 NGINX 版本信息。默认开启,会泄露版本(如 "Server: nginx/1.18.0"),便于攻击者针对特定漏洞发起攻击。
配置示例 (在http块中):http { server_tokens off; }安全理由 :隐藏版本信息减少针对性攻击。结合第三方模块(如 headers-more)可进一步自定义或移除 Server 头。
最佳实践 :在生产环境中始终关闭。如果需要完全移除头,使用more_set_headers 'Server: ';(需安装 nginx-extras 模块)。 -
user
解释 :指定 NGINX worker 进程运行的用户和组。默认是 root,这很危险,因为进程被劫持时攻击者可获 root 权限。
配置示例(主配置文件顶部):user nginx nginx;安全理由 :遵循最小权限原则,运行在非 root 用户下限制潜在损害。创建专用用户如 "nginx" 并设置文件权限(
chown -R nginx:nginx /var/www和chmod -R 750 /var/www)。
最佳实践:结合 SELinux 或 AppArmor 进一步隔离进程。 -
worker_processes 和 worker_rlimit_nofile
解释 :worker_processes设置 worker 进程数(通常设为 CPU 核数);worker_rlimit_nofile限制每个进程打开的文件描述符数,防止资源耗尽攻击。
配置示例:worker_processes auto; worker_rlimit_nofile 10000;安全理由 :限制资源使用防 DoS。
auto根据 CPU 自动调整。
最佳实践:监控系统资源,避免过高设置导致内存溢出。 -
禁用不必要模块
解释 :NGINX 默认编译了许多模块(如 autoindex、userid),未使用时应禁用以缩小攻击面。需在编译时指定。
配置示例(编译命令):./configure --without-http_autoindex_module --without-http_userid_module --without-http_auth_basic_module make && make install安全理由 :移除未用模块减少潜在漏洞。使用
nginx -V检查已启用模块。
最佳实践 :仅启用必需模块,如http_ssl_module用于 HTTPS。
2. SSL/TLS 配置:加密通信并防范中间人攻击
HTTPS 是现代 Web 的标配,这些参数确保加密安全。
-
ssl_protocols
解释 :指定支持的 TLS 协议版本。默认 TLSv1.2 和 TLSv1.3,但需显式禁用旧版如 TLSv1.0/1.1。
配置示例 (在server块中):server { listen 443 ssl; ssl_protocols TLSv1.2 TLSv1.3; }安全理由 :旧协议有已知漏洞(如 POODLE 攻击)。TLSv1.3 提供更好性能和安全。
最佳实践:结合 Let's Encrypt 自动续期证书。 -
ssl_ciphers
解释 :定义允许的加密套件。优先使用支持前向保密(PFS)的强套件。
配置示例:ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';安全理由 :弱套件易被破解(如 RC4、MD5)。设置
ssl_prefer_server_ciphers on;让服务器优先选择安全套件。
最佳实践:使用 Mozilla 的 SSL 配置生成器测试。 -
ssl_certificate 和 ssl_certificate_key
解释 :指定服务器证书和私钥路径。证书链需完整以避免浏览器警告。
配置示例:ssl_certificate /etc/nginx/ssl/example.com.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key;安全理由 :加密数据传输,防窃听。使用链证书(cat server.crt intermediate.crt > chained.crt)。
最佳实践:权限设为 600,仅 root 可读。 -
ssl_session_cache 、ssl_session_timeout 和 ssl_session_tickets
解释 :缓存 SSL 会话以复用,减少握手开销;超时控制缓存时长;票据用于会话恢复。
配置示例:ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_session_tickets off;安全理由 :
off票据防会话劫持攻击。共享缓存优化多核系统。
最佳实践 :结合ssl_stapling on;和ssl_stapling_verify on;启用 OCSP Stapling,提升性能和隐私。 -
Strict-Transport-Security (HSTS)
解释 :通过响应头强制浏览器使用 HTTPS。
配置示例 (在server块中):add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;安全理由 :防协议降级和中间人攻击。
preload允许提交到浏览器预加载列表。
最佳实践:先从小 max-age 测试,避免锁定错误配置。
3. 访问控制和速率限制:防范滥用和 DoS
这些参数限制访问源和请求频率。
-
allow 和 deny
解释 :基于 IP 允许或拒绝访问。常用于保护管理路径。
配置示例 (在location块中):location /admin { allow 192.168.1.0/24; deny all; }安全理由 :白名单限制敏感区域访问,防未授权入侵。
最佳实践 :结合 GeoIP 模块实现地理限制(如deny 10.0.0.0/8;)。 -
limit_req_zone 和 limit_req
解释 :定义速率限制区和应用规则。基于 IP 限制请求速率。
配置示例 (http块):limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;(
location块):limit_req zone=one burst=5 nodelay;安全理由 :防暴力破解和 DDoS。
burst允许突发,nodelay立即响应。
最佳实践:为登录页设低速率(如 5r/m),一般页设高(如 10r/s)。 -
limit_conn_zone 和 limit_conn
解释 :限制每个 IP 的并发连接数。
配置示例:limit_conn_zone $binary_remote_addr zone=conn:10m; limit_conn conn 10;安全理由 :防资源耗尽攻击。
最佳实践:结合 Fail2Ban 自动封禁违规 IP。 -
client_max_body_size 、client_body_buffer_size 等
解释 :限制请求体大小和缓冲,防缓冲溢出和 DoS。
配置示例:client_max_body_size 1m; client_body_buffer_size 1k; client_header_buffer_size 1k; large_client_header_buffers 4 1k;安全理由 :小缓冲限制大请求攻击。如果需上传文件,针对性增大。
最佳实践:监控日志,调整以平衡安全和功能。
4. 安全响应头:浏览器侧防护
这些头通过 add_header 添加,增强客户端安全。
-
X-Frame-Options
解释 :防点击劫持,控制是否允许 iframe 嵌入。
配置示例:add_header X-Frame-Options "SAMEORIGIN" always;安全理由:防止页面被恶意站点嵌入。选项:DENY(完全禁)、SAMEORIGIN(同源允)。
-
X-XSS-Protection
解释 :启用浏览器内置 XSS 过滤(针对旧浏览器)。
配置示例:add_header X-XSS-Protection "1; mode=block" always;安全理由:阻塞检测到的反射 XSS 攻击。
-
X-Content-Type-Options
解释 :防止 MIME 类型嗅探攻击。
配置示例:add_header X-Content-Type-Options "nosniff" always;安全理由:确保浏览器严格遵守 Content-Type,避免执行恶意脚本。
-
Content-Security-Policy (CSP)
解释 :定义内容加载策略,限制资源源。
配置示例:add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://trusted.com;" always;安全理由 :防 XSS 和数据注入。逐步收紧策略。
最佳实践:使用报告模式(report-uri)监控违规。 -
Referrer-Policy
解释 :控制 referrer 头发送。
配置示例:add_header Referrer-Policy "strict-origin-when-cross-origin" always;安全理由:减少跨站信息泄露。
5. 日志和监控:检测与响应
-
access_log 和 error_log
解释 :记录访问和错误日志。自定义格式捕获更多细节。
配置示例:log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log warn;安全理由 :日志用于审计攻击(如 404 扫描)。设置 warn 级别过滤噪音。
最佳实践:使用 logrotate 轮换日志,集成 ELK Stack 或 Splunk 实时监控。 -
log_not_found 和 access_log off (针对敏感路径)
解释 :禁用某些路径的日志以减少开销。
配置示例:location ~ /\. { deny all; access_log off; log_not_found off; }安全理由:隐藏敏感文件(如 .git、.env),防目录遍历。
6. 高级安全:WAF、文件保护和更新
-
ModSecurity 集成
解释 :启用开源 WAF 模块过滤攻击。
配置示例:load_module modules/ngx_http_modsecurity_module.so; modsecurity on; modsecurity_rules_file /etc/nginx/modsec/main.conf;安全理由 :实时检测 SQL 注入、XSS 等。使用 OWASP Core Rule Set。
最佳实践:先学习模式监控,再切换阻塞模式。 -
保护敏感文件
解释 :拒绝访问备份文件、配置文件等。
配置示例:location ~* \.(bak|conf|sql|ini|log|sh|swp)$ { deny all; }安全理由:防信息泄露,如数据库凭证。
-
限制 HTTP 方法
解释 :仅允许必要方法。
配置示例:if ($request_method !~ ^(GET|HEAD|POST)$) { return 405; }安全理由:防 TRACE 等方法滥用。
-
定期更新和审计
始终保持 NGINX 最新版本,监控安全公告(nginx.org/security_advisories)。使用工具如 Gixy 扫描配置漏洞,或 SSL Labs 测试 TLS。