我知道默认情况下会在自己的网络堆栈中创建一个 docker 容器。
我想--net host
在运行 docker 容器时使用该标志以允许使用所有主机端口。
我知道的缺点:
- 在容器内运行的服务可能会与在同一端口上运行的其他容器中的其他服务发生冲突。
- 容器可以访问完整的网络堆栈。
我的问题是,当允许容器使用完整的网络堆栈时,安全影响是什么?
我知道默认情况下会在自己的网络堆栈中创建一个 docker 容器。
我想--net host
在运行 docker 容器时使用该标志以允许使用所有主机端口。
我知道的缺点:
我的问题是,当允许容器使用完整的网络堆栈时,安全影响是什么?
这有点矫枉过正,但通常最好对发生的威胁进行建模,而不是说“不要这样做,这是不安全的”。
我创建了一个 Web 控制面板,用于管理 Docker 容器中的游戏服务器。基本上每个容器都运行一个 FTP 服务器和游戏服务器。我每台主机运行大约 50 个容器。需要打开端口的客户端安装模块。
这听起来就像您托管同一个游戏的多个实例,例如 Minecraft。
但是,模组可能会引入 MySQL 或 MongoDB 等新软件,这意味着新的攻击面会打开。
我将假设启用进程控制组 (cgroups) 以防止一个容器在主机上使用完整的 CPU 或 GPU。
--net host
启用。作弊者知道他们可以访问数据库以更改存储在本地 MySQL 数据库中的硬币数量或将自己设置为其他实例的主持人。--net host
之前,只暴露了某些端口,使用带有 Mongo 的 mod 的其他游戏实例是安全的。您可能在公共防火墙中禁用了 Mongo 端口。
但是,现在所有容器都可以互相聊天,使用--net host
,并且没有启用防火墙来防止彼此恶意向彼此发送流量。
因此,当 mod 更新为不仅包括加密矿工而且还包括端口扫描器时,mod 会扫描 localhost 并找到打开的 MongoDB。然后它接管其他容器并使用主机的更多 CPU/GPU,假设容器应用了 cgroups。
如果没有应用 cgroups(进程利用率控制组),那么唯一的威胁就是额外的访问权限。
之前,只暴露了某些端口,使用带有 MySQL 的 mod 的游戏的其他实例是安全的。您可能在公共防火墙中禁用了 SQL 端口。
但是,现在所有容器都可以互相聊天,使用--net host
,并且没有启用防火墙来防止彼此恶意向彼此发送流量。
因此,当作弊者在他们的实例上安装他们的 mod 时,他们会直接访问 MySQL 服务器并增加存储的硬币数量,从而使他们变得富有。服务器版主很困惑,因为没有显示此访问权限的游戏日志,他们想知道他们的服务器是否已被黑客入侵。
总而言之,--net host
假设你有一个活动的防火墙,不会增加额外的外部访问,但它确实减少了主机上运行的容器之间的分离,这意味着如果你托管恶意容器,你正在为非恶意容器创造更大的可能性被利用。