温馨提示×

Nginx在Ubuntu中的安全设置指南

小樊
32
2025-11-17 10:23:42
栏目: 智能运维

Nginx 在 Ubuntu 的安全设置指南

一 基础加固与最小暴露面

  • 更新系统与组件:执行 sudo apt update && sudo apt upgrade -y,保持 Nginx 与依赖为最新安全版本。
  • 防火墙仅放行必要端口:使用 UFW 放行 SSH(22)HTTP(80)HTTPS(443),并启用防火墙。
    示例:sudo ufw allow 22/tcp;sudo ufw allow 80/tcp;sudo ufw allow 443/tcp;sudo ufw enable。
  • 隐藏版本与指纹:在 /etc/nginx/nginx.confhttp 块设置 server_tokens off;,减少信息泄露。
  • 限制可用 HTTP 方法:在需要的 server 块中仅允许 GET/HEAD/POST,其余返回 444 关闭连接。
  • 合理的超时与缓冲:设置 client_body_timeout 12; client_header_timeout 12; keepalive_timeout 15; send_timeout 10;,降低慢速攻击与资源占用。
  • 日志与监控:定义结构化日志格式,记录 $remote_addr、X-Forwarded-For 等关键字段,便于审计与溯源。
  • 资源与速率限制:在 http 定义共享内存区,在 server/location 应用 limit_req,抑制暴力扫描与突发流量。
  • 错误页面安全:统一错误页面并标记为 internal,避免泄露目录结构与内部路径。

二 传输加密与 HTTPS 部署

  • 获取证书:使用 Certbot 一键申请并自动配置 Let’s Encrypt 证书(同时支持自动续期)。
    示例:sudo apt install -y certbot python3-certbot-nginx;sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com。
  • 强制 HTTPS:新增 listen 80server 块,返回 301 跳转至 https://$host$request_uri
  • 现代 TLS 配置:启用 TLSv1.2/TLSv1.3,使用 ECDHEAEAD 套件,开启 HTTP/2,并开启 OCSP Stapling 提升握手与验证性能与安全。
  • 证书与密钥路径:将 ssl_certificate 指向 fullchain.pemssl_certificate_key 指向私钥 domain.key
  • 可选 WSS:如需 WebSocket Secure,在 location /wss/ 使用 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection “Upgrade”; 反向代理到后端 WebSocket 服务。

三 访问控制与速率限制

  • 速率限制:在 http 定义 limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;,在 location / 应用 limit_req zone=one burst=5 nodelay;,平滑突发并抑制滥用。
  • 方法限制:仅允许 GET/HEAD/POST,对 PUT/DELETE/TRACE 等危险或不必要的动词直接拒绝(返回 444)。
  • 连接与缓冲:结合 worker_processes auto; worker_connections 1024;client_max_body_size 8m; 等,防止资源耗尽与放大攻击。
  • 防火墙层面:仅开放 22/80/443,对管理口与数据库等后端端口不做公网暴露。

四 运行环境与持续运维

  • 进程与权限:以 www-data 运行 Nginx,使用最小权限原则;静态资源与日志目录设置合适的 ownershipmode
  • 自动安全更新:安装并启用 unattended-upgrades,仅勾选安全更新,减少暴露窗口。
  • 配置与证书备份:定期备份 /etc/nginx/var/log/nginx,并验证配置语法 sudo nginx -t 后再重载。
  • 监控与指标:部署 nginx-prometheus-exporter 暴露 /nginx_status,结合 Prometheus/Grafana 做可用性与攻击面观测。
  • 变更流程:遵循“编辑→语法检查→灰度/重载→回滚预案”的闭环,变更前先备份。

五 可直接使用的配置片段

# /etc/nginx/nginx.conf 关键片段
http {
  include       mime.types;
  default_type  application/octet-stream;

  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;

  server_tokens off;

  # 速率限制:每 IP 10 r/s,突发 5
  limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

  client_max_body_size 8m;
  client_body_buffer_size 10K;
  client_header_buffer_size 1k;
  large_client_header_buffers 2 1k;

  client_body_timeout 12;
  client_header_timeout 12;
  keepalive_timeout 15;
  send_timeout 10;

  # 现代 TLS 套件与 HTTP/2
  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:
           ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:
           DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
  ssl_prefer_server_ciphers on;
  ssl_session_cache shared:SSL:10m;
  ssl_session_timeout 1d;
  ssl_stapling on;
  ssl_stapling_verify on;
  resolver 8.8.8.8 8.8.4.4 valid=300s;
  resolver_timeout 5s;

  include /etc/nginx/conf.d/*.conf;
  include /etc/nginx/sites-enabled/*;
}
# /etc/nginx/sites-available/example.com 关键片段
server {
  listen 80;
  server_name example.com www.example.com;
  return 301 https://$host$request_uri;
}

server {
  listen 443 ssl http2;
  server_name example.com www.example.com;

  ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

  root /var/www/example.com/html;
  index index.html;

  # 仅允许 GET/HEAD/POST
  if ($request_method !~ ^(GET|HEAD|POST)$) {
    return 444;
  }

  # 速率限制
  limit_req zone=one burst=5 nodelay;

  # 安全错误页面
  error_page 404 500 502 503 504 /error.html;
  location = /error.html {
    internal;
    root /var/www/secure-errors;
  }

  location / {
    try_files $uri $uri/ =404;
  }

  # 可选:WebSocket Secure
  # location /wss/ {
  #   proxy_pass http://127.0.0.1:8080;
  #   proxy_http_version 1.1;
  #   proxy_set_header Upgrade $http_upgrade;
  #   proxy_set_header Connection "Upgrade";
  #   proxy_read_timeout 3600s;
  # }
}
  • 启用站点:sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
  • 检查与生效:sudo nginx -t && sudo systemctl reload nginx

0