如何自定义Nginx提升网站安全?

话题来源: 为什么我不再用宝塔 Nginx 的默认规则?

最近我在优化一个电商网站的Nginx配置时,深刻感受到默认设置就像是敞开着大门——虽然方便出入,但风险实在太大了。你知道吗?根据Sucuri发布的2023年Web应用防火墙报告,超过60%的网站攻击都是通过利用基础配置漏洞实施的。就拿最常见的DDoS防护来说,很多网管可能都没注意到,默认的limit_req_zone设置对真实业务场景来说简直形同虚设。

Nginx安全加固的四个关键处

就从我最痛心的那次日志分析说起吧。当时客户网站莫名其妙地变慢,查看access.log才发现有人在疯狂扫描wp-login.php。你看,像这样的自动化攻击工具,每秒能发出几百次请求,而Nginx默认的10r/s根本拦不住。后来我把rate改成3r/s,burst设为20,这一招就过滤掉了80%的恶意请求。

除了限流设置,我发现常见的TPO3安全问题还有:不安全的HTTP方法、信息泄露、过时的加密协议。有一次我做渗透测试,居然通过响应头里的Nginx版本号就找到了对应的CVE漏洞,这让我彻底明白了server_tokens off这个参数的重要性。

SSL配置的艺术

TLS配置简直可以单独写本书!我用Mozilla SSL配置生成器做过对比测试,发现禁用TLS 1.0/1.1后,网站的安全性评分直接从B提升到了A+。特别提醒大家注意ssl_ciphers这个参数,我见过太多网站还在用那些已经被证明不安全的加密套件。我的做法是参考Cloudflare的最新技术文档,专门为现代浏览器调整密码套件顺序。

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384...';
ssl_prefer_server_ciphers on;

对了,说到安全,不得不提SQL注入防护。虽然主要靠应用层防护,但在Nginx里也可以通过限制特定字符来增加攻击难度。我在location块里加了一些正则过滤,效果出奇的好,直接拦截了所有包含”select|union|concat”的异常请求。

看到这里你可能觉得配置很麻烦?其实只要掌握方法,整个优化过程不会超过半小时。我的建议是从最危险的地方开始:先改请求限制,再调整SSL,然后处理信息泄露,最后做缓存优化。毕竟相比网站性能,安全才是最重要的底线,你说对吧?

评论