我们在某个 IP 上运行一个开发服务器,我们的 API 在端口 5000 上公开,nginx 在 80 上侦听。但是,当向端口 5000 发出 HTTPS 请求时,整个后端会崩溃。因此,我注意到一个漏洞,当一个访问https://SERVER_IP:5000,因为它无法处理 HTTPS 请求,请求挂起并且整个后端停止(因此 API 也会因任何其他请求而挂起)。我只希望该请求永远不会到达后端。
我为 UFW 设置了以下规则。
To Action From
-- ------ ----
8000 ALLOW Anywhere
22/tcp ALLOW Anywhere
80 ALLOW Anywhere
5000 ALLOW Anywhere
443/tcp DENY Anywhere
8000 (v6) ALLOW Anywhere (v6)
22/tcp (v6) ALLOW Anywhere (v6)
80 (v6) ALLOW Anywhere (v6)
5000 (v6) ALLOW Anywhere (v6)
443/tcp (v6) DENY Anywhere (v6)
但是,当导航到https://SERVER_IP:5000时,服务器仍然崩溃。我认为这是因为 https 流量不一定来自端口 443,而是 5000,并且它是公开的(它只需要用于 HTTP 流量)。那么有什么方法可以通过 UFW 禁止 5000 上的 HTTPS 流量,或者我是否必须使用 nginx 配置一些东西?
不,UFW 做不到。
确定 TCP 连接中的流量是否是有效的 HTTP 请求需要接受连接并查看客户端尝试发送的数据类型。换句话说,它是基于内容的过滤。
UFW 需要根据TCP 连接的初始SYN 包中的数据进行判断,该数据包中不包含任何数据。那时你无法判断客户的请求是什么。听起来您更愿意在您的 API 前面需要某种 HTTP 反向代理,以过滤掉所有不是适用于您的 API 的 URI 的格式良好的 HTTP 请求。
我是否还可以建议您改进 API 的输入验证,至少在将其投入生产之前,它不会再因随机发送废话而崩溃?否则,您的 API 看起来真的很可能容易受到微不足道的拒绝服务攻击,例如
nc your.API.server.example 5000 < /dev/urandom
,或者可能nc your.API.server.example 5000 < War_and_Peace.txt
,其中 War_and_Peace.txt 是绝对大于 API 服务的输入缓冲区的任何内容。