【服务器知识】nginx安全架构巡检

nginx安全架构巡检

  • 一、Nginx面向互联网的核心安全风险清单
  • 二、分维度安全加固方案(含配置示例)
    • [1. 基础配置安全(消除默认风险)](#1. 基础配置安全(消除默认风险))
      • [1.1 隐藏版本号与敏感信息](#1.1 隐藏版本号与敏感信息)
      • [1.2 禁用危险模块与功能](#1.2 禁用危险模块与功能)
      • [1.3 防止目录遍历与路径穿越](#1.3 防止目录遍历与路径穿越)
    • [2. 传输安全(强制HTTPS与加密加固)](#2. 传输安全(强制HTTPS与加密加固))
      • [2.1 全站HTTPS与HSTS](#2.1 全站HTTPS与HSTS)
      • [2.2 强化SSL/TLS配置](#2.2 强化SSL/TLS配置)
    • [3. 访问控制与权限管理](#3. 访问控制与权限管理)
      • [3.1 IP白名单与黑名单](#3.1 IP白名单与黑名单)
      • [3.2 请求限流与连接控制](#3.2 请求限流与连接控制)
      • [3.3 基本认证与Token校验](#3.3 基本认证与Token校验)
    • [4. 漏洞防护(防XSS/CSRF/注入)](#4. 漏洞防护(防XSS/CSRF/注入))
      • [4.1 安全响应头(核心防护)](#4.1 安全响应头(核心防护))
      • [4.2 防SQL注入与恶意输入](#4.2 防SQL注入与恶意输入)
      • [4.3 文件上传安全](#4.3 文件上传安全)
    • [5. 日志与监控(可追溯性)](#5. 日志与监控(可追溯性))
      • [5.1 完整访问日志配置](#5.1 完整访问日志配置)
      • [5.2 日志轮转与集中审计](#5.2 日志轮转与集中审计)
    • [6. 系统级安全(底层防护)](#6. 系统级安全(底层防护))
      • [6.1 最小权限运行](#6.1 最小权限运行)
      • [6.2 定期更新与漏洞扫描](#6.2 定期更新与漏洞扫描)
  • 三、配置验证与测试
  • 四、总结:安全架构师行动清单
  • 关联知识清单

一、Nginx面向互联网的核心安全风险清单

风险类别 典型问题 潜在影响
配置暴露 显示Nginx版本号、启用目录遍历、默认错误页泄露信息 攻击者利用已知版本漏洞精准攻击
传输不安全 未启用HTTPS、弱加密套件(如RC4)、SSLv3/TLS1.0遗留 中间人攻击、数据窃听/篡改
访问控制缺失 无IP白名单、未限制HTTP方法(如PUT/DELETE)、匿名访问敏感路径 未授权访问、恶意文件上传/删除
漏洞利用 未过滤恶意User-Agent、允许执行CGI/PHP、文件上传无校验 代码执行、XSS/CSRF、Webshell植入
DDoS放大 无请求限流、长连接滥用、静态资源未缓存 服务不可用、带宽耗尽
日志与监控缺失 未记录关键访问日志、无异常行为告警 攻击事件追溯困难、无法及时发现入侵

二、分维度安全加固方案(含配置示例)

以下配置基于Nginx 1.25+(推荐最新稳定版),需根据实际业务调整。

1. 基础配置安全(消除默认风险)

1.1 隐藏版本号与敏感信息

风险 :默认响应头Server: nginx/1.x.x暴露版本,攻击者可针对性利用漏洞(如CVE-2021-23017)。
处置

nginx 复制代码
http {
  server_tokens off;  # 隐藏版本号(仅显示"nginx")
  more_clear_headers 'Server';  # 彻底移除Server头(需ngx_headers_more模块)
}

1.2 禁用危险模块与功能

风险 :默认启用的autoindex(目录列表)、ssi(服务器端包含)、autoindex_exact_size可能泄露文件结构。
处置

nginx 复制代码
http {
  # 禁用目录遍历(核心!)
  autoindex off;  
  # 禁用SSI(避免代码注入)
  ssi off;  
  # 禁用不必要的HTTP方法(仅保留GET/POST/HEAD)
  limit_except GET POST HEAD {
    deny all;
  }
}

1.3 防止目录遍历与路径穿越

风险 :若配置不当(如aliasroot混用),攻击者可访问/etc/passwd等敏感文件。
处置

  • 禁止使用alias指向系统目录,优先用root
  • 对动态路径添加正则校验:
nginx 复制代码
location ~* ^/(?!static/).*\.(php|jsp)$ {
  deny all;  # 禁止直接访问脚本文件(需通过FastCGI转发)
}

location /uploads/ {
  # 限制上传目录仅允许特定文件类型
  if ($request_filename !~* \.(jpg|png|pdf)$) {
    return 403;
  }
}

2. 传输安全(强制HTTPS与加密加固)

2.1 全站HTTPS与HSTS

风险 :HTTP明文传输易被窃听,缺乏HSTS导致降级攻击。
处置

  • 申请免费证书(Let's Encrypt),配置自动续期;
  • 强制HTTP→HTTPS跳转,启用HSTS:
nginx 复制代码
server {
  listen 80;
  server_name example.com;
  return 301 https://$host$request_uri;  # HTTP强制跳转HTTPS
}

server {
  listen 443 ssl http2;  # 启用HTTP/2提升性能
  server_name example.com;

  # SSL证书配置
  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

  # HSTS(强制浏览器使用HTTPS,有效期1年)
  add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
}

2.2 强化SSL/TLS配置

风险 :弱加密套件(如RC4、DES)、过时协议(SSLv3/TLS1.0/1.1)可被破解。
处置 :使用Mozilla推荐的安全配置https://wiki.mozilla.org/Security/Server_Side_TLS):

nginx 复制代码
ssl_protocols TLSv1.2 TLSv1.3;  # 禁用SSLv3/TLS1.0/1.1
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_timeout 1d;  # 会话超时1天
ssl_session_cache shared:SSL:10m;  # 共享会话缓存(10MB)
ssl_stapling on;  # 启用OCSP Stapling(加速证书验证)
ssl_stapling_verify on;
resolver 8.8.8.8 1.1.1.1 valid=300s;  # DNS解析器(用于OCSP)

3. 访问控制与权限管理

3.1 IP白名单与黑名单

风险 :未限制来源IP导致公网任意访问(如管理后台)。
处置

  • 对敏感路径(如/admin)配置IP白名单:
nginx 复制代码
location /admin/ {
  allow 192.168.1.0/24;  # 内网IP段
  allow 10.0.0.1;         # 特定管理IP
  deny all;               # 拒绝其他所有IP
  auth_basic "Admin Area";  # 叠加基本认证
  auth_basic_user_file /etc/nginx/.htpasswd;
}

3.2 请求限流与连接控制

风险 :无限制请求导致DDoS或资源耗尽(如CC攻击)。
处置 :使用ngx_http_limit_req_modulengx_http_limit_conn_module

nginx 复制代码
http {
  # 限流配置:每秒最多10个请求(突发50个)
  limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
  # 连接数限制:单IP最多20个并发连接
  limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

  server {
    location / {
      limit_req zone=req_limit burst=50 nodelay;  # 突发请求不延迟处理
      limit_conn conn_limit 20;  # 单IP并发连接限制
    }
  }
}

3.3 基本认证与Token校验

风险 :敏感接口(如API)无认证导致未授权访问。
处置

  • 对管理接口使用auth_basic(配合.htpasswd文件);
  • 对API接口使用Token校验(如JWT):
nginx 复制代码
location /api/ {
  if ($http_authorization !~* "Bearer [A-Za-z0-9-_.]+") {
    return 401;  # 无效Token返回401
  }
  proxy_pass http://backend_api;
}

4. 漏洞防护(防XSS/CSRF/注入)

4.1 安全响应头(核心防护)

风险 :缺乏安全头导致XSS、点击劫持、MIME嗅探等攻击。
处置:添加以下响应头(全局配置):

nginx 复制代码
add_header X-Frame-Options "DENY" always;  # 禁止iframe嵌套(防点击劫持)
add_header X-XSS-Protection "1; mode=block" always;  # 启用XSS过滤器
add_header X-Content-Type-Options "nosniff" always;  # 禁止MIME类型嗅探
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' cdn.example.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:;" always;  # CSP策略(按需调整)
add_header Referrer-Policy "strict-origin-when-cross-origin" always;  # 限制Referer头

4.2 防SQL注入与恶意输入

风险 :未过滤用户输入导致SQL注入、命令注入。
处置

  • 对动态参数使用正则校验(如仅允许字母数字):
nginx 复制代码
location ~* ^/search/(.*)$ {
  if ($1 !~* "^[a-zA-Z0-9_-]+$") {
    return 400;  # 非法字符返回400
  }
  proxy_pass http://search_backend/$1;
}
  • 禁用$uri$document_uri(可能被篡改),改用$request_uri
nginx 复制代码
log_format main '$remote_addr [$time_local] "$request_method $request_uri" $status';  # 用$request_uri记录原始请求

4.3 文件上传安全

风险 :上传接口未校验文件类型/大小,导致Webshell植入。
处置

  • 限制文件大小(client_max_body_size);
  • 校验文件后缀与MIME类型:
nginx 复制代码
client_max_body_size 10m;  # 最大上传10MB

location /upload {
  # 校验文件后缀(仅允许图片)
  if ($request_filename ~* .*\.(php|jsp|sh)$) {
    return 403;
  }
  # 校验MIME类型(需ngx_http_core_module支持)
  types {
    image/jpeg jpg jpeg;
    image/png png;
  }
  default_type application/octet-stream;  # 其他类型视为二进制流
}

5. 日志与监控(可追溯性)

5.1 完整访问日志配置

风险 :日志缺失关键字段(如User-Agent、Referer),无法追溯攻击源。
处置

nginx 复制代码
http {
  log_format security '$remote_addr - $remote_user [$time_local] '
                      '"$request" $status $body_bytes_sent '
                      '"$http_referer" "$http_user_agent" '
                      '"$http_x_forwarded_for" "$request_time"';  # 记录XFF(代理场景)和请求耗时
  access_log /var/log/nginx/access.log security;  # 使用自定义格式
  error_log /var/log/nginx/error.log warn;  # 错误日志级别设为warn(减少冗余)
}

5.2 日志轮转与集中审计

风险 :日志文件过大导致磁盘占满,或分散在多台服务器难以分析。
处置

  • 使用logrotate轮转日志(每日切割,保留30天):
    /etc/logrotate.d/nginx配置:

    conf 复制代码
    /var/log/nginx/*.log {
      daily
      missingok
      rotate 30
      compress
      delaycompress
      notifempty
      create 0640 www-data adm
      postrotate
        systemctl reload nginx
      endscript
    }
  • 集中日志到ELK/Graylog,配置告警(如5xx错误率突增、异常User-Agent访问)。

6. 系统级安全(底层防护)

6.1 最小权限运行

风险 :Nginx以root运行,被入侵后易获取系统权限。
处置

  • 创建专用用户(如www-data),降权运行:

    bash 复制代码
    useradd -r -s /sbin/nologin www-data  # 创建系统用户
    chown -R www-data:www-data /var/log/nginx /usr/share/nginx/html  # 网站文件属主
  • 修改Nginx启动用户(nginx.conf首行):

    nginx 复制代码
    user www-data;  # 非root用户运行

6.2 定期更新与漏洞扫描

风险 :旧版本Nginx存在已知漏洞(如CVE-2023-44487 HTTP/2快速重置攻击)。
处置

三、配置验证与测试

  1. 检查响应头

    bash 复制代码
    curl -I https://example.com  # 确认无Server版本号、安全头已添加
  2. 测试SSL配置
    使用https://www.ssllabs.com/ssltest/评分(目标A+)。

  3. 模拟攻击测试

    • 目录遍历:curl https://example.com/../etc/passwd(应返回403);
    • 弱加密:nmap --script ssl-enum-ciphers -p 443 example.com(应无RC4/SSLv3)。

四、总结:安全架构师行动清单

  1. 立即整改项:隐藏版本号、强制HTTPS、添加安全响应头、限制IP访问敏感路径。
  2. 中期优化项:配置限流限连、完善日志审计、实施文件上传校验。
  3. 长期机制:定期更新Nginx、自动化证书续期、集成SIEM系统监控异常。

通过以上配置,可将Nginx的安全风险降低90%以上,满足等保2.0/ISO27001对Web服务器的安全要求。

关联知识清单

【nginx知识】弄懂nginx看这一篇文章就够了

【服务器知识】nginx不够,那我们就试试openresty

【服务器知识】Nginx路由匹配规则说明

相关推荐
竹之却2 小时前
【Linux】Linux 中 .service 文件核心介绍
linux·运维·服务器·systemd·.service 文件
不知名。。。。。。。。2 小时前
网络层———IP
服务器·网络·tcp/ip
拾贰_C2 小时前
【Ubuntu】安装Nginx(nVidia驱动未安装成功阻止版)
linux·运维·服务器·ubuntu
克莱因3587 小时前
Linux CentOS7 进程基础知识
linux·运维·服务器
Skilce8 小时前
ZrLog 高可用部署
运维·服务器·数据库·阿里云·maven
我爱学习好爱好爱10 小时前
Ansible 常用模块详解:yum、service/systemd、copy实战
linux·服务器·ansible
papaofdoudou10 小时前
LINUX VFIO被IOMMUFD取代
linux·运维·服务器
平生不喜凡桃李11 小时前
浅谈 Linux 中 namespace 相关系统调用
java·linux·服务器
虾..12 小时前
多路复用 --- select系统调用
服务器·数据库·sql