在使用Docker进行端口映射时,仅设置宿主机防火墙的白名单规则存在安全隐患。Docker默认通过其自定义的iptables规则链绕过了宿主机的INPUT链管理,导致非白名单IP也能访问映射端口。这是因为Docker的防火墙机制采用黑名单制,与普遍采用白名单制的防火墙安全理念相悖。为加强安全性,建议关闭Docker的自动防火墙管理功能,通过在`/etc/docker/daemon.json`中添加`"iptables": false`来实现,并手动管理Docker相关的iptables规则链。
🚀 **Docker端口映射的安全隐患**: Docker默认使用`-p`或`--publish`映射端口到宿主机,并依赖iptables进行访问控制。然而,Docker会自行管理iptables,插入名为`DOCKER`的Rule Chain,绕过了宿主机的INPUT链,使得即使在宿主机防火墙设置了白名单,非白名单IP也可能访问到映射的端口。
🚫 **Docker防火墙机制与安全理念冲突**: 与标准的软硬件防火墙(如iptables、Windows防火墙)普遍采用的白名单制不同,Docker的防火墙机制实际执行的是黑名单制,这与“默认拒绝,只允许已知安全连接”的安全核心理念存在冲突,可能导致潜在的安全漏洞。
💡 **关闭Docker自动防火墙管理**: 为解决上述安全问题,建议关闭Docker的自动防火墙管理功能。这可以通过修改Docker的配置文件`/etc/docker/daemon.json`,并添加`"iptables": false`来实现。
🛠️ **手动管理Docker防火墙规则**: 在关闭Docker自动管理功能后,需要手动清理Docker先前插入的iptables Rule Chain,并根据实际需求手动配置iptables规则,以实现更精细和安全的端口访问控制,确保只有授权的IP才能访问Docker服务。
我们在使用 docker 时,一般会使用 -p / --publish 来映射端口到宿主机,然后在 iptables 的 INPUT Chain 里开一条白名单规则,允许指定的 IP 或 IP 范围来访问这个端口。
问题是,很多朋友测试能访问后,很容易偷懒,不再测试别的 IP 是否能访问了。docker 的重磅安全漏洞也就在这里出现。如果你继续测试,你会发现,不在白名单的 IP 地址,也能访问这个端口。
原因在于 docker 自行管理 iptables ,它给 iptables 里插入一大堆 Rule Chain ,绕开了 INPUT Chain 的管理。
通过以下两条命令:
iptables --list --verbose --numeric
iptables --list --verbose --numeric --table nat
可以发现 docker 插入了一堆以 DOCKER 命名的 Rule Chain 。
本来标准的软硬件防火墙,包括 iptables 、Windows 防火墙,为了安全,都是默认使用白名单制,而 docker 的防火墙却是黑名单制的,这与安全理念冲突。
建议关闭 docker 的自行管理防火墙的功能,向 /etc/docker/daemon.json 添加 "iptables": false
然后手动清理 docker 向 iptables 里添加的各种 Rule Chain
最后手动管理 docker 的防火墙,来加强安全。