Nginx 使用 ssl_reject_handshake 特性来防止 SNI 信息泄露

由于不正确vhost的配置,443端口泄露的证书可被某些无良的爬虫或网站(censys.io)收集,用以将IP和SSL证书匹配,当源站IP泄露在公网是很危险的。这时不论是使用了CDN还是负载均衡都有可能被成本低廉的TCP/UDP放大攻击打到关机、黑洞。本篇文章就主要介绍使用Nginx(1.19+)ssl_reject_handshake模块和给443端口配置一个错误的证书来避免这种情况的发生。

1.给443端口配置一个错误的自签证书

谷歌关键字自签名证书 生成将证书放在服务器指定目录,新建一个服务器IP的vhost在ip.conf中引入证书即可,但这种方式既不优雅也在批量配置时费时费力。

2.使用ssl_reject_handshake 参数on|off 默认为off

通过名字就可知道该模块大概作用,没错,它的作用就是控制ssl握手,当传入sni不匹配时,nginx会直接返回400错误拒绝连接,只有当证书和sni匹配时,nginx才会允许连接,放行访问。如何使用?

在默认default.conf(如没有则新建)新增

server {
    listen 443 ssl default_server;
    #如果有IPv6地址需加入下面这行,否则不用下面这行
    listen [::]:443 ssl default_server;
    ssl_reject_handshake on;
}

我们来看下效果直接浏览器访问IP:443返回错误ERR_SSL_UNRECOGNIZED_NAME_ALERT,curl -v -k IP:443
可以看到Nginx拒绝了不争取的ssl握手,配置成功。

还没有结束!

对于阻止爬虫来说这样配置足够,但众所周知IPv4的IP池是有限的,攻击者如果携带sni指定hosts来扫描全网IP的话也不需要耗费太长时间,nginx这时就无法为我们提供防御,且访问方式与正常访问一样无法分辨,比如使用

#ip为你的源站IP
curl -k  https://anisland.net --resolve '*:443:ip'

nginx就会给出正确的响应,攻击者拿到源站IP我们依旧会面临Ddos攻击。解决方法:以debian为例目前我能想到的方式就是使用ufw防火墙对443防火墙做CDN IP白名单限制,CDN IP可向你的CDN提供商来索取。

注意事项

  • nginx无法启用tls1.3的握手失败解决办法,openssl 1.1.1h bug,详细见传送门

    • 升级至openssl ≥ 1.1.1j 修复此问题
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
CDNLinux网络

自建CDN并配置CC防护- cdnfly

2023-4-3 16:00:40

Nginx

Nginx中一些不常见但是有用的配置和windows下的特殊处理

2023-4-4 21:32:30

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
搜索