温馨提示×

Ubuntu Nginx SSL安全最佳实践

小樊
35
2025-11-09 09:16:17
栏目: 云计算

1. 获取并自动续订免费SSL证书(Let’s Encrypt)
使用Certbot工具获取Let’s Encrypt免费证书,支持自动续订,避免证书过期导致的服务中断。安装Certbot及Nginx插件后,通过一条命令即可完成证书申请与Nginx配置集成:

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

证书有效期为90天,需设置定时任务自动续订(如每天凌晨3点检查并续订):

sudo crontab -e
# 添加以下内容
0 3 * * * certbot renew --quiet --post-hook "systemctl reload nginx"

此操作确保SSL证书始终有效,无需手动干预。

2. 强制HTTP跳转HTTPS
通过Nginx配置将所有HTTP请求(端口80)重定向至HTTPS(端口443),彻底杜绝明文传输风险。推荐使用301永久重定向(更利于SEO),配置示例如下:

server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;
    return 301 https://$server_name$request_uri;
}

此配置简洁高效,避免了rewrite规则可能带来的性能损耗。

3. 优化SSL协议与加密套件
禁用不安全的SSLv2、SSLv3及旧版TLS协议(如TLSv1.0、TLSv1.1),仅启用TLSv1.2及以上版本;选择强加密套件(优先使用ECDHE密钥交换算法,支持前向保密),配置如下:

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;

此设置确保仅使用安全的加密方式,抵御中间人攻击与降级攻击。

4. 启用HTTP/2协议
HTTP/2支持多路复用、头部压缩等功能,可显著提升网站加载速度(尤其对于图片、CSS等静态资源)。在SSL监听端口后添加http2参数即可启用:

server {
    listen 443 ssl http2;
    server_name yourdomain.com www.yourdomain.com;
    # 其他SSL配置...
}

HTTP/2兼容现代浏览器,无需用户额外操作即可享受性能提升。

5. 配置HSTS(HTTP Strict Transport Security)
通过HSTS头强制浏览器在指定时间内(如1年)仅通过HTTPS访问网站,防止SSL剥离攻击(攻击者将HTTPS请求降级为HTTP)。配置示例如下:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
  • max-age=31536000:有效期1年(单位:秒);
  • includeSubDomains:覆盖所有子域名;
  • preload:允许浏览器预加载HSTS列表(需提交至HSTS预加载列表)。
    注意:启用后需确保网站无HTTP服务,否则会导致用户无法访问。

6. 启用OCSP Stapling
OCSP Stapling(在线证书状态协议封套)由服务器主动获取证书状态并发送给客户端,减少客户端验证证书的时间(避免客户端向证书颁发机构查询),同时降低隐私泄露风险。配置如下:

ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
  • ssl_stapling on:启用OCSP Stapling;
  • ssl_stapling_verify on:验证OCSP响应的有效性;
  • resolver:指定DNS服务器(用于解析证书颁发机构的OCSP URL)。

7. 隐藏Nginx版本信息
Nginx默认在响应头中暴露版本号(如Server: nginx/1.25.3),攻击者可利用版本信息查找已知漏洞。通过以下配置隐藏版本号:

http {
    server_tokens off;
    # 可选:自定义服务器标识(进一步混淆)
    more_set_headers 'Server: Custom Web Server';
}

此操作降低针对性攻击的成功率。

8. 限制请求方法与路径访问
仅允许必要的HTTP方法(如GET、POST),拒绝DELETE、PUT等危险方法;禁止访问敏感目录(如.htaccess.git),防止信息泄露:

location / {
    limit_except GET POST {
        deny all;
    }
}

location ~ /\.ht {
    deny all;
}

此配置减少攻击面,防范未授权的操作与信息获取。

9. 优化SSL会话缓存与性能
启用SSL会话缓存,减少重复握手的开销(握手过程消耗较多CPU资源),提升并发性能:

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
  • ssl_session_cache:共享内存缓存(10MB),存储会话信息;
  • ssl_session_timeout:会话有效期10分钟;
  • ssl_session_tickets off:禁用会话票证(更安全,但可能略微影响性能)。

10. 定期监控与日志审计
通过Nginx的访问日志(access_log)与错误日志(error_log)监控异常行为(如大量404请求、非法方法访问),及时发现潜在攻击:

server {
    access_log /var/log/nginx/yourdomain_access.log;
    error_log /var/log/nginx/yourdomain_error.log warn;
}

定期检查日志(如使用grepawk工具),分析异常请求模式,调整安全策略。

0