什么是增强型容器隔离?

注意

增强容器隔离仅适用于 Docker Business 客户。

增强容器隔离提供额外的安全层,以防止容器中运行的恶意工作负载破坏 Docker Desktop 或主机。

它使用各种高级技术来加固容器隔离,但不会影响开发者的工作效率。它适用于 Docker Desktop 4.13.0 及更高版本

这些技术包括

  • 通过 Linux 用户命名空间运行所有容器(即使是使用 --privileged 标志启动的容器)的非特权模式。这使得恶意容器工作负载更难逃逸容器并感染 Docker Desktop 虚拟机和主机。
  • 确保 Docker Desktop 虚拟机的不可变性(例如,容器或用户无法修改其内部设置)。
  • 审查一些关键系统调用以防止容器逃逸,并在容器内部部分虚拟化 /proc/sys 部分以实现进一步隔离。
  • 阻止用户访问 Docker Desktop 虚拟机的控制台。

启用增强容器隔离后,这些机制会自动应用,对开发人员的功能或性能影响最小。开发人员可以像往常一样使用 Docker Desktop,但他们启动的容器隔离性更强。

增强容器隔离确保更强的容器隔离,并锁定 IT 管理员创建的所有安全配置,例如通过 注册表访问管理策略设置管理 创建的配置。

注意

增强容器隔离是 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 构建、Kubernetes Pod 和扩展容器。有关已知限制和解决方法的更多信息,请参阅 常见问题解答

哪些主机操作系统/平台支持增强容器隔离?

增强容器隔离 (ECI) 在 Docker Desktop 4.13 中推出,适用于所有平台(Windows、Mac 和 Linux)。

对于 Windows 主机,ECI 与 Docker Desktop Hyper-V 和 WSL 2 后端一起工作,如下所示

  • Docker Desktop 4.19 或更早版本:ECI 仅适用于 Hyper-V。
  • Docker Desktop 4.20 或更高版本:ECI 适用于 Hyper-V 和 WSL 2(WSL 版本 1.1.3.0 及更高版本)。

有关更多信息以及在 WSL 2 上使用增强容器隔离时的安全注意事项,请参阅 WSL 的 ECI 支持

如何启用增强容器隔离?

作为开发者

要作为开发者启用增强容器隔离

  1. 确保您的组织拥有 Docker Business 订阅。
  2. 在 Docker Desktop 中登录您的组织。这将确保 ECI 功能在 Docker Desktop 的“设置”菜单中对您可用。
  3. 停止并删除所有现有容器。
  4. 在 Docker Desktop 中导航到 **设置** > **常规**。
  5. 在 **使用增强容器隔离** 旁边,选中复选框。
  6. 选择 **应用并重启** 以保存您的设置。

重要

增强容器隔离不会保护在启用 ECI 之前创建的容器。有关已知限制和解决方法的更多信息,请参阅 常见问题解答

作为管理员

要作为管理员启用增强容器隔离,您首先需要 强制登录。这是因为增强容器隔离功能需要 Docker Business 订阅,因此您的 Docker Desktop 用户必须对其组织进行身份验证,才能使此配置生效。

接下来,您必须 创建和配置 admin-settings.json 文件 并指定

{
  "configurationFileVersion": 2,
  "enhancedContainerIsolation": {
    "value": true,
    "locked": true
  }
}

通过设置 "value": true,管理员确保默认启用 ECI。通过设置 "locked": true,管理员确保开发者无法禁用 ECI。如果您希望开发者能够禁用此功能,请设置 "locked": false

此外,从 Docker Desktop 4.27 开始,管理员还可以配置容器的 Docker 套接字挂载权限,如 此处 所述。

要使此生效

  • 在全新安装时,开发人员需要启动 Docker Desktop 并对其组织进行身份验证。
  • 在现有安装中,开发人员需要通过 Docker 菜单退出 Docker Desktop,然后重新启动 Docker Desktop。如果他们已经登录,则无需再次登录即可使更改生效。

重要

从 Docker 菜单中选择 **重启** 并不足够,因为它只重启了 Docker Desktop 的某些组件。

管理员强制执行此设置时,用户会看到什么?

启用增强容器隔离后,用户会看到

  • **设置** > **常规** 中的 **使用增强容器隔离** 处于启用状态。
  • 容器在 Linux 用户命名空间中运行。

要检查,请运行

$ docker run --rm alpine cat /proc/self/uid_map

将显示以下输出

         0     100000      65536

这表明容器的 root 用户 (0) 在 Docker Desktop 虚拟机中映射到非特权用户 (100000),并且该映射扩展到 64K 用户 ID 的范围。如果容器进程逃逸出容器,它会在虚拟机级别发现自己没有权限。用户 ID 映射在每个新的容器中都会有所不同,因为每个容器都会获得一个独占的宿主用户 ID 范围以实现隔离。用户 ID 映射由 Docker Desktop 自动管理。有关更多详细信息,请参阅 增强型容器隔离的工作原理

相反,在没有 ECI 的情况下,Linux 用户命名空间不会用于容器,以下显示

         0          0 4294967295

这意味着容器中的 root 用户 (0) 实际上是 Docker Desktop 虚拟机中的 root 用户 (0),这会降低容器隔离性。

由于增强型容器隔离 使用嵌入在 Docker Desktop Linux 虚拟机中的 Sysbox 容器运行时,因此另一种确定容器是否正在使用增强型容器隔离的方法是使用 `docker inspect`

$ docker inspect --format='{{.HostConfig.Runtime}}' my_container

它输出

sysbox-runc

在没有增强型容器隔离的情况下,`docker inspect` 输出 `runc`,它是标准的 OCI 运行时。

更多资源