从安装到上线:一份 Nginx 实战指南,让你的 Web 应用稳建安全(三)


引言


在之前的篇章中,我们探讨了 Nginx 的安装与基础配置,以及如何通过优化配置提升性能。现在,我们

将目光转向一个至关重要的领域——安全。在互联网环境中,Web 应用的安全如同坚固的城堡城墙,

抵御着各种潜在威胁。Nginx 作为 Web 服务器,在保障应用安全方面扮演着关键角色。本文将深入探讨

如何利用 Nginx 实现 Web 应用的安全加固,涵盖 HTTPS 配置、安全头部设置、防止恶意请求以及日志

监控与安全审计等多个方面。


HTTPS 配置

获取 SSL 证书


在互联网传输中,数据以明文形式传递如同将珍宝暴露在旷野,极易被窃取。HTTPS 协议通过 SSL/TLS 

加密为数据穿上“防护衣”。要开启 HTTPS,首先需获取 SSL 证书。你可以选择从权威的证书颁发机构

(CA)购买,如 Let's Encrypt,它提供免费的 SSL 证书。


以 Let's Encrypt 为例,使用 Certbot 工具获取证书。安装 Certbot 后,运行以下命令:


bash

Copy Code

sudo certbot certonly --webroot -w /var/www/html -d yourdomain.com


--webroot 指定 webroot 目录,Certbot 会在该目录放置验证文件。

-w 后接 webroot 目录路径。

-d 后接你的域名。

Nginx 配置 HTTPS


获取到证书后,在 Nginx 配置文件中添加 HTTPS 监听端口和证书信息。以下是一个示例配置:


nginx

Copy Code

server {

    listen 443 ssl;

    server_name yourdomain.com;


    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;

    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;


    # 其他 SSL 配置,如协议和加密套件

    ssl_protocols TLSv1.2 TLSv1.3;

    ssl_ciphers 'ECDHE - ECDSA - AES256 - GCM - SHA384:ECDHE - RSA - AES256 - GCM - SHA384';

    ssl_prefer_server_ciphers on;


    # 其他业务配置

    location / {

        root /usr/share/nginx/html;

        index index.html index.htm;

    }

}


HTTP 重定向到 HTTPS


为了确保用户始终通过 HTTPS 访问,配置 HTTP 到 HTTPS 的重定向:


nginx

Copy Code

server {

    listen 80;

    server_name yourdomain.com;

    return 301 https://$host$request_uri;

}


安全头部设置

添加安全头部


安全头部是浏览器接收到的指令,用于增强安全性。以下是一些重要的安全头部及其配置:


Content - Security - Policy (CSP)‌:防止跨站脚本攻击(XSS)。示例配置:

nginx

Copy Code

add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' https://trusted-cdn.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self';";


X - XSS - Protection‌:启用浏览器内置的 XSS 过滤器。

nginx

Copy Code

add_header X-XSS-Protection "1; mode=block";


X - Frame - Options‌:防止点击劫持攻击。

nginx

Copy Code

add_header X-Frame-Options "SAMEORIGIN";


Strict - Transport - Security (HSTS)‌:强制浏览器使用 HTTPS。

nginx

Copy Code

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";


防止恶意请求

限制请求速率


恶意用户可能发起大量请求,导致服务器过载。使用 Nginx 的 limit_req_zone 和 limit_req 模块限制请求速率:


nginx

Copy Code

http {

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


    server {

        location / {

            limit_req zone=req_limit burst=20;

            # 其他业务配置

        }

    }

}


limit_req_zone 定义了一个名为 req_limit 的共享内存区域,大小为 10MB,限制每个 IP 地址每秒 10 个请求。

limit_req 在 location 中使用该限制,允许突发 20 个请求。

防止 SQL 注入和 XSS


虽然 Nginx 不能直接阻止 SQL 注入和 XSS,但可以通过配置阻止含有恶意参数的请求:


nginx

Copy Code

location ~* \.php$ {

    if ($query_string ~* "union.*select|insert.*into|select.*from|drop.*table|delete.*from|update.*set|exec.*xp_cmdshell") {

        return 403;

    }

    # 其他 PHP 相关配置

}


日志监控与安全审计

配置访问日志


详细记录访问日志有助于分析异常行为:


nginx

Copy Code

http {

    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;

}


日志分析与监控


使用工具如 fail2ban 监控日志,自动封禁恶意 IP:


安装 fail2ban:

bash

Copy Code

sudo apt-get install fail2ban


配置 Nginx 的 jail 文件(/etc/fail2ban/jail.d/nginx.conf):

ini

Copy Code

[nginx-http-auth]

enabled = true

port = http

logpath = /var/log/nginx/access.log

maxretry = 3


启动 fail2ban:

bash

Copy Code

sudo systemctl start fail2ban


定期安全审计


定期检查 Nginx 配置和日志,使用工具如 OpenVAS 或 Nessus 进行漏洞扫描:


bash

Copy Code

sudo apt-get install openvas

sudo openvas-setup


结语


通过本文的探讨,我们深入了解了如何利用 Nginx 为 Web 应用构建坚固的安全防线。从 HTTPS 配置确保数据传输安全,到设置安全头部抵御常见攻击,再到防止恶意请求和进行日志监控与安全审计,每一个环节都至关重要。在互联网这片充满未知与挑战的天地中,只有不断强化安全措施,才能让我们的 Web 应用稳稳地扎根,为用户提供安全、可靠的服务。希望这份指南能成为你在 Web 应用安全建设道路上的得力助手,让你的应用在激烈的互联网竞争中脱颖而出,赢得用户的信任与青睐。