使用主机网络的 Docker 容器有哪些缺点?

Jam*_*mes 9 security containers application-security docker

据我了解,默认情况下将在其自己的网络堆栈中创建一个 docker 容器。

我想--net host在运行 docker 容器时使用该标志以允许使用所有主机端口。

我所知道的缺点:

  1. 容器内运行的服务可能会与同一端口上运行的其他容器中的其他服务发生冲突。
  2. 容器可以访问完整的网络堆栈。

我的问题是,允许容器使用完整的网络堆栈会对安全产生什么影响?

Lis*_*ays 3

威胁模型

这有点矫枉过正,但通常最好对发生的威胁进行建模,而不是说“不要这样做,因为这是不安全的”。

使用案例

我创建了一个 Web 控制面板,用于管理 Docker 容器中的游戏服务器。基本上每个容器都运行一个 FTP 服务器和游戏服务器。我每个主机运行大约 50 个容器。客户端安装 mods 需要打开端口。

这听起来像是您托管同一游戏的多个实例,例如《我的世界》。

然而,mod 可能会引入 MySQL 或 MongoDB 等新软件,这意味着新的攻击面会出现。

我假设启用进程控制组 (cgroup) 来防止一个容器使用主机上的完整 CPU 或 GPU。

恶意行为者

  1. 主机提供商。
    • 无关紧要,可以完全访问容器。如果主机是恶意的,我们就完蛋了。
  2. 游戏服务器。
    • 目前只能访问三个端口:FTP、游戏端口、1 个 mod 端口。
    • 作弊者想要访问托管的其他游戏上的 SQL,以便在其他游戏中作弊。使游戏成为主机。
    • 可能不是一个现实的威胁向量,因为您可能正在托管同一个游戏,因此此时所有用户都被开发人员搞砸了。
  3. 模组
    • 更新为包括加密矿工,需要更多的主机资源。
    • 黑客在 XYZ 游戏中听说 MongoDB 存在零日漏洞,并添加了对 Mongo 数据库的端口扫描
    • 最现实的情况是,模组有时会变成拉高和转储方案。
    • 场景1
  4. 假模组。
    • 与 #2 类似,有人知道游戏 xyz 已托管并已--net host启用。作弊者知道他们可以访问数据库来更改存储在本地 MySQL 数据库中的硬币数量,或者将自己设置为另一个实例的主持人。
    • 他们为游戏实例付费,并安装模组以有效地在另一个容器实例中后门。
    • 场景2

使用--net host

场景一:加密货币矿工

之前,只有某些端口暴露,使用 Mongo 的 mod 的游戏其他实例是安全的。您可能在公共防火墙中禁用了 Mongo 端口。

但是,现在所有容器都可以使用 彼此聊天--net host,并且没有启用防火墙来防止彼此恶意向彼此发送流量。

因此,当 mod 更新为不仅包含加密矿工还包含端口扫描器时,mod 会扫描 localhost 并找到打开的 MongoDB。然后,假设容器应用了 cgroup,它就会接管其他容器并使用主机的更多 CPU/GPU。

如果没有应用 cgroup(进程利用率控制组),那么唯一的威胁就是额外的访问。

场景2:Cheat mod后门

之前,只有某些端口暴露,使用带有 MySQL 的 mod 的游戏的其他实例是安全的。您可能在公共防火墙中禁用了 SQL 端口。

但是,现在所有容器都可以使用 彼此聊天--net host,并且没有启用防火墙来防止彼此恶意向彼此发送流量。

因此,当作弊者在其实例上安装他们的 mod 时,他们会直接访问 MySQL 服务器并增加存储的硬币数量,从而使他们变得富有。服务器版主很困惑,因为没有游戏日志显示此访问,他们想知道他们的服务器是否已被黑客入侵。

概括

总之,--net host假设您有活动防火墙,则不会添加额外的外部访问,但它确实减少了主机上运行的容器之间的隔离,这意味着如果您托管恶意容器,则会增加非恶意容器攻击的可能性。被利用。

也可以看看