Skip to content

TLS 与安全

Nginx 可以终止 Client TLS,再以 HTTP 或 HTTPS 连接 Upstream。若 Proxy 到 Upstream 跨越不可信网络,仍应加密并验证 Upstream 身份。

HTTPS 最小结构

nginx
server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/nginx/tls/fullchain.pem;
    ssl_certificate_key /etc/nginx/tls/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_session_cache shared:TLS:10m;
    ssl_session_timeout 10m;

    location / {
        root /srv/www;
    }
}

Cipher、Curve、OCSP 和 Session Ticket 策略与 Nginx/OpenSSL Version 及 Client Compatibility 有关,应使用组织安全基线和自动化测试,不复制多年不变的 Cipher List。

Certificate Private Key 必须限制文件权限。ACME Client 更新证书后要测试并 Reload Nginx;只更新磁盘文件不会自动替换 Worker 已加载的证书。

Security Header

nginx
add_header X-Content-Type-Options nosniff always;
add_header Referrer-Policy strict-origin-when-cross-origin always;
add_header Content-Security-Policy "default-src 'self'" always;
  • CSP 必须根据实际 Frontend Resource 逐步收紧,盲目复制可能使页面不可用。
  • HSTS 只应在整个 Domain 已稳定支持 HTTPS 后启用,includeSubDomains 和 Preload 更难撤销。
  • X-XSS-Protection 已被现代浏览器弃用,不应作为核心防护。
  • X-Frame-Options 可用于旧 Client;现代策略可由 CSP frame-ancestors 表达。

Rate Limiting

nginx
limit_req_zone $binary_remote_addr zone=per_ip:10m rate=10r/s;

server {
    location /api/ {
        limit_req zone=per_ip burst=20 nodelay;
        limit_req_status 429;
        proxy_pass http://backend;
    }
}

若 Nginx 前还有可信 Load Balancer,应先正确恢复 Client Address,否则限流 Key 可能全部变成代理 IP。IP Rate Limit 只能缓解流量,不能代替 User、Tenant、API Key 和业务资源维度的限流。

访问控制

nginx
location /internal/ {
    allow 192.0.2.0/24;
    deny all;
    proxy_pass http://backend;
}

IP Allowlist 不是身份认证。动态 Cloud Network、IPv6、Proxy 和 NAT 都可能改变地址语义,敏感接口仍需应用层认证授权。