我刚刚遇到了一个类似的问题,我的 mongo 实例被黑了(上面没有有价值的数据),而我认为端口安全地位于 ufw 防火墙后面。
事实证明,如果您正在运行 docker 并将 ufw 作为防火墙,docker 会插入绕过 ufw 的 iptables 规则。例如运行时:
docker run -p 27017:27017 ...
Docker 插入防火墙规则(https://docs.docker.com/network/iptables/):
$ sudo /sbin/iptables -L DOCKER
target prot opt source destination
ACCEPT tcp -- anywhere 172.17.0.2 tcp dpt:27017
27017 对外开放,所以虽然你认为 ufw 后面的一切都很好且安全,但事实并非如此。
如果所有使用 mongo 的东西都在一台机器上,那么将 docker 绑定到 127.0.0.1 而不是默认的 0.0.0.0 是防止外部连接的第一步。
例如而不是:
docker run -p 27017:27017 ...
用途:
docker run -p 127.0.0.1:27017:27017 ...
虽然这会阻止非本地连接,但它仍然不会阻止 docker 创建规则。因此端口 27017 在技术上仍然是开放的,如果您删除该规则,docker 将重新创建它。
您当然也应该考虑上述其他安全措施,但是当我意识到 docker 和 ufw 可能会发生这种情况时,这有点令人震惊,所以要注意这一点。
我也没有看到太多出色的解决方案:
https://www.techrepublic.com/article/how-to-fix-the-docker-and-ufw-security-flaw/
https://github.com/chaifeng/ufw-docker
(例如,如果您多年后将其移至不同的盒子并忘记将修复应用于 iptables 会发生什么)