Nginx 配置需要注意的安全问题及完整案例

参考说明1

1. Nginx 配置需要注意的安全问题

在配置 Nginx 时,有几个常见的安全问题需要注意:

1.1 CRLF 注入漏洞

CRLF 注入漏洞是由于在配置文件中错误地使用了 $uri 变量,导致换行符(CRLF)被注入到 HTTP 头中,从而可能引发会话固定漏洞、CSRF 漏洞或 XSS 漏洞。

修复方法

  • 使用 $request_uri 代替 $uri,因为 $request_uri 是完整的 URI,不会进行解码,从而避免了 CRLF 注入。

1.2 目录穿越漏洞

目录穿越漏洞通常出现在 Nginx 做反向代理时,如果 alias 路径配置不当,可能导致攻击者访问到服务器上的任意文件。

修复方法

  • 确保 location 和 alias 的路径配置一致,避免路径穿越。

1.3 HTTP 头被覆盖的问题

在 Nginx 配置中,子块中的 add_header 会覆盖父块中的 add_header,这可能导致一些重要的安全头被意外移除。

修复方法

  • 在每个需要添加安全头的位置单独配置,或者在父块中配置后,在子块中再次添加,确保不会被覆盖。

1.4 其他安全问题

  • 弱密码套件:确保 ssl_ciphers 配置中不包含不安全的加密套件。

  • CORS 配置不当:过度允许的 CORS 访问可能导致跨站请求伪造(CSRF)攻击。

  • TLS 版本过低:禁用 TLS 1.0 及以下版本,使用更安全的 TLS 1.2 或 TLS 1.3。

2. Nginx 安全配置案例

以下是一个包含上述安全修复措施的 Nginx 配置案例:

nginx

http {
    # 全局配置
    client_max_body_size 300M;
    keepalive_timeout 55;
    client_body_timeout 10;
    client_header_timeout 10;
    send_timeout 10;
    limit_conn ops 20;
    limit_conn_zone $binary_remote_addr zone=ops:10m;
    autoindex off;
    dav_methods off;
    server_tokens off;
    client_body_buffer_size 1K;
    client_header_buffer_size 1k;
    large_client_header_buffers 2 1k;

    # 添加安全头
    add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:; connect-src 'self'; frame-ancestors 'self';";
    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
    add_header X-Permitted-Cross-Domain-Policies "master-only";
    add_header Referrer-Policy "origin";
    add_header X-Download-Options "noopen" always;
    add_header Clear-Site-Data "storage";
    add_header Cross-Origin-Embedder-Policy require-corp;
    add_header Cross-Origin-Opener-Policy same-site;
    add_header Cross-Origin-Resource-Policy same-site;
    add_header Permissions-Policy "interest-cohort=()";
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    # 服务器配置
    server {
        listen 80;
        server_name example.com;

        # 重定向到 HTTPS
        return 301 https://$host$request_uri;
    }

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

        # SSL 证书配置
        ssl_certificate /path/to/certificate.crt;
        ssl_certificate_key /path/to/private.key;

        # 启用更强的 SSL/TLS 配置
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5;

        # 禁止不安全的 HTTP 方法
        if ($request_method !~ ^(GET|HEAD|POST)$ ) {
            return 405;
        }

        # 禁止特定 User-Agent
        if ($http_user_agent ~* "java|python|perl|ruby|curl|bash|echo|uname|base64|decode|md5sum|select|concat|httprequest|httpclient|nmap|scan|nessus|wvs") {
            return 403;
        }

        # 禁止访问特定文件或目录
        location ~* \.(bak|swp|save|sh|sql|mdb|svn|git|old)$ {
            deny all;
        }
        location /(admin|phpadmin|status) {
            deny all;
        }

        # 静态文件处理
        location / {
            root /path/to/website;
            try_files $uri $uri/ =404;
        }

        # 反向代理配置
        location /api/ {
            proxy_pass http://backend_server;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

说明

  1. 全局配置:设置了一些通用的安全参数,如限制请求体大小、连接超时、限制并发连接数等。

  2. 安全头:添加了一系列的安全响应头,以增强网站的安全性。

  3. 服务器配置

    • 配置了 HTTP 到 HTTPS 的重定向。
    • 启用了 SSL/TLS,并配置了更强的加密套件和协议版本。
    • 禁止了不安全的 HTTP 方法和特定的 User-Agent。
    • 禁止了访问特定文件或目录。
    • 设置了静态文件的根目录和反向代理配置。

通过以上配置,可以大大提高 Nginx 服务器的安全性。

参考说明2

  1. 更新 Nginx 版本:确保使用最新版本的 Nginx,以获得最新的安全补丁。
  2. 限制访问:使用 allow 和 deny 指令来限制对服务器的访问,只允许特定的 IP 地址访问。
  3. 隐藏敏感信息:通过修改 server_tokens 设置为 off,可以防止 Nginx 在错误页面上暴露其版本号。
  4. 启用 SSL/TLS:使用 HTTPS 来加密数据传输,防止中间人攻击。
  5. 配置防火墙:使用防火墙(如 iptables 或 ufw)来限制对 Nginx 端口的访问。
  6. 限制请求大小:通过设置 client_max_body_size 来限制客户端可以发送的请求体大小,防止大文件上传导致的拒绝服务攻击。
  7. 使用安全的缓存策略:合理配置缓存策略,避免缓存敏感信息。
  8. 日志记录:启用详细的日志记录,以便监控和分析潜在的攻击行为。

下面是一个完整的 Nginx 安全配置案例:

# 定义一个 upstream 服务器组
upstream backend {
    server 127.0.0.1:8080;
}

# HTTP 服务器块
server {
    listen 80;
    server_name example.com;

    # 重定向所有 HTTP 请求到 HTTPS
    return 301 https://$host$request_uri;
}

# HTTPS 服务器块
server {
    listen 443 ssl;
    server_name example.com;

    # SSL 配置
    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
    ssl_prefer_server_ciphers on;

    # 隐藏 Nginx 版本号
    server_tokens off;

    # 限制请求体大小
    client_max_body_size 10M;

    # 访问控制
    allow 192.168.1.0/24; # 允许的 IP 范围
    deny all; # 拒绝其他所有 IP

    # 日志记录
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    # 反向代理配置
    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

说明:

  • SSL/TLS 配置:使用了强加密套件和协议版本,确保传输的安全性。
  • 隐藏敏感信息:通过 server_tokens off 隐藏 Nginx 的版本号。
  • 限制请求大小:通过 client_max_body_size 限制上传文件的大小。
  • 访问控制:通过 allow 和 deny 指令限制对服务器的访问。
  • 日志记录:启用详细的日志记录,便于监控和分析。

以上配置是一个基本的安全配置案例,实际应用中可能需要根据具体需求进行调整。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慧香一格

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值