什么是增强型容器隔离?
注意
增强的容器隔离功能仅限 Docker Business 客户使用。
增强型容器隔离 (ECI) 提供了一层额外的安全防护,可防止在容器中运行的恶意工作负载危及 Docker Desktop 或主机。
它采用多种先进技术来强化容器隔离,同时不影响开发者的生产力。
增强的容器隔离性确保了更强大的容器隔离,并锁定了管理员创建的任何安全配置,例如通过 注册表访问管理策略或使用 设置管理。
注意
ECI 是对 Docker 使用的其他容器安全技术(例如减少 Linux 功能、seccomp 和 AppArmor)的补充。
它适用于谁?
- 适用于希望防止容器攻击并减少开发环境中漏洞的组织与开发者。
- 适用于希望确保更强大的容器隔离性,且易于在开发人员机器上直观实施的组织。
启用增强型容器隔离后会发生什么?
当启用增强型容器隔离时,将激活以下功能和安全技术:
- 所有用户容器均自动在 Linux 用户命名空间中运行,以确保更强的隔离性。每个容器都在专用的 Linux 用户命名空间中运行。
- 容器中的 root 用户映射到 Docker Desktop Linux 虚拟机内的非特权用户。
- 容器变得更难被攻破。例如,敏感的系统调用会经过审查,并且
/proc和/sys的部分功能会在容器内部进行模拟。 - 用户可以继续像往常一样使用容器,包括绑定挂载主机目录、数据卷等。
- 开发者运行容器的方式无需改变,也无需特殊的容器镜像。
- 特权容器(例如,
--privileged标志)可以正常工作,但它们仅在容器的 Linux 用户命名空间内具有特权,而在 Docker Desktop 虚拟机中并不具备。因此,它们无法用于突破 Docker Desktop 虚拟机。 - Docker-in-Docker 甚至 Kubernetes-in-Docker 都可以运行,但需在 Docker Desktop 的 Linux 虚拟机中以非特权模式运行。
此外,还施加了以下限制:
- 容器不再能与 Docker Desktop 虚拟机共享命名空间(例如,
--network=host、--pid=host已被禁止)。 - 容器不再能够修改 Docker Desktop 虚拟机内的配置文件(例如,禁止将任何虚拟机目录挂载到容器中)。
- 容器不再能够访问 Docker 引擎。例如,将 Docker 引擎的套接字挂载到容器中受到限制,这可防止恶意容器获得对 Docker 引擎的控制权。管理员可以为 受信任的容器镜像放宽此限制。
- 禁止所有用户通过控制台访问 Docker Desktop 虚拟机。
这些功能和限制确保了容器在运行时更加安全,同时对开发者的体验和生产力影响最小。开发者可以像往常一样继续使用 Docker Desktop,但他们启动的容器将具有更强的隔离性。
有关增强型容器隔离如何工作的更多信息,请参阅 它是如何工作的。
重要
增强的容器隔离功能尚未完全保护 Docker 构建、 Kubernetes Pod 和扩展容器。有关已知 限制和变通方法的更多信息,请参阅 常见问题解答。
如何启用增强型容器隔离?
作为开发者
要以开发人员身份启用增强型容器隔离:
- 确保您的组织拥有 Docker Business 订阅。
- 登录您的组织账户以在 Docker Desktop 中使用。这将确保您可以在 Docker Desktop 的设置菜单中使用 ECI 功能。
- 停止并移除所有现有的容器。
- 在 Docker Desktop 中导航至 设置 > 常规。
- 在使用增强型容器隔离旁边,选中复选框。
- 选择应用并重启以保存您的设置。
重要
增强型容器隔离(ECI)无法保护在启用该功能之前创建的容器。有关已知限制和变通方法的更多信息,请参阅 常见问题解答。
作为管理员
前提条件
您首先需要 强制登录,以确保所有 Docker Desktop 开发人员都通过您的组织进行身份验证。由于设置管理需要 Docker Business 订阅,强制登录可确保只有经过身份验证的用户才能访问,并且该功能在所有用户中持续生效,即使在没有强制登录的情况下它可能仍然有效。
设置
创建并配置 admin-settings.json 文件 并指定:
{
"configurationFileVersion": 2,
"enhancedContainerIsolation": {
"value": true,
"locked": true
}
}设置 "value": true 可确保默认启用 ECI。通过设置 "locked": true,开发人员将无法禁用 ECI。如果您希望赋予开发人员禁用该功能的能力,请设置为 "locked": false。
此外,您还可以 为容器配置 Docker 套接字挂载权限。
要使此设置生效:
- 在全新安装时,开发者需要启动 Docker Desktop 并通过其组织进行身份验证。
- 在现有安装中,开发人员需要通过 Docker 菜单退出 Docker Desktop,然后重新启动 Docker Desktop。如果他们已经登录,则无需再次登录即可使更改生效。
重要
仅从 Docker 菜单中选择 重启 是不够的,因为它仅重启 Docker Desktop 的部分组件。
当管理员强制实施此设置时,用户会看到什么?
提示
您现在也可以在 Docker 管理控制台中配置这些设置。
当启用增强型容器隔离时,用户会看到:
- 在“设置” > “常规”中启用“增强型容器隔离”。
- 容器在 Linux 用户命名空间中运行。
要检查,请运行:
$ docker run --rm alpine cat /proc/self/uid_map
以下输出显示:
0 100000 65536这表明容器的根用户 (0) 映射到 Docker Desktop 虚拟机中的非特权用户 (100000),且该映射覆盖了 64K 的用户 ID 范围。如果容器进程逃逸出容器,它将在虚拟机层面发现自身没有任何权限。用户 ID 映射会随着每个新容器而变化,因为每个容器都会获得一个独占的主机用户 ID 范围以实现隔离。用户 ID 映射由 Docker Desktop 自动管理。有关更多详情,请参阅 增强型容器隔离的工作原理。
相比之下,如果没有使用 ECI,则不会为容器启用 Linux 用户命名空间,此时会显示以下内容:
0 0 4294967295这意味着容器中的根用户 (0) 实际上是 Docker Desktop 虚拟机中的根用户 (0),从而降低了容器的隔离性。
由于增强型容器隔离
使用了嵌入在 Docker Desktop Linux 虚拟机中的 Sysbox 容器运行时,另一种确定容器是否以增强型容器隔离运行的方法是使用 docker inspect:
$ docker inspect --format='{{.HostConfig.Runtime}}' my_container
它输出:
sysbox-runc如果没有增强型容器隔离,docker inspect 会输出 runc,这是标准的 OCI 运行时。