linux

如何通过Nginx配置实现安全防护

小樊
42
2025-12-12 21:19:25
栏目: 编程语言

Nginx 安全防护配置清单

一 基础加固

二 访问控制与请求限制

三 传输加密与协议安全

四 安全响应头与内容防护

五 快速可用的示例片段

# 1) 基础安全与错误页面
http {
  server_tokens off;
  autoindex off;
  ssi off;
  port_in_redirect off;

  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;

  # 2) 频率与并发限制
  limit_req_zone $binary_remote_addr zone=req:10m rate=10r/s;
  limit_conn_zone $binary_remote_addr zone=conn:10m;

  # 3) 黑名单示例(可单独文件引入)
  include /etc/nginx/blacklist_ip.conf;

  server {
    listen 80 default_server;
    server_name _;
    return 403;
  }

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

    ssl_certificate     /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;
    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;
    ssl_prefer_server_ciphers on;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;

    # 安全响应头
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    # 仅允许域名访问(已在默认 server 拦截)

    # 管理后台 IP 白名单
    location /admin {
      allow 192.168.1.0/24;
      allow 203.0.113.10;
      deny all;
      # proxy_pass http://backend_admin;
    }

    # 限制方法
    if ($request_method !~ ^(GET|POST|HEAD)$) {
      return 405;
    }

    # 频率限制(突发 5,超阈值立即拒绝)
    location / {
      limit_req zone=req burst=5 nodelay;
      limit_conn conn 20;
      # proxy_pass http://backend;
    }

    # 恶意参数拦截
    set $block 0;
    if ($args ~* "(union|select|insert|update|delete|drop|truncate|or|and|exec)") { set $block 1; }
    if ($request_uri ~* "<script>|<iframe>|javascript:|on\w+=") { set $block 1; }
    if ($request_uri ~* "\.\./|\.\.|/etc/passwd|/proc/self/environ") { set $block 1; }
    if ($http_user_agent ~* "(sqlmap|nmap|burp|scanner|crawler|bot)") { set $block 1; }
    if ($block = 1) { return 403; }

    # 自定义错误页
    error_page 404 /404.html;
    location = /404.html { root /usr/share/nginx/html; internal; }
  }
}

六 运维与验证

0
看了该问题的人还看了