什么是增强的容器隔离?

注意

增强的容器隔离仅适用于 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 Engine。例如,将 Docker Engine 的套接字挂载到容器中受到限制,这可以防止恶意容器控制 Docker Engine。管理员可以为受信任的容器镜像放宽此限制。
  • 禁止所有用户访问 Docker Desktop 虚拟机的控制台。

这些功能和限制确保容器在运行时得到更好的保护,同时最大限度地减少对开发者体验和生产力的影响。开发者可以像往常一样继续使用 Docker Desktop,但他们启动的容器隔离性更强。

有关增强型容器隔离工作方式的更多信息,请参阅其工作原理

重要

增强型容器隔离尚未完全保护 Docker 构建、Kubernetes Pod 和扩展容器。有关已知限制和解决方法的更多信息,请参阅常见问题解答

如何启用增强的容器隔离?

作为开发者

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

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

重要

在启用 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

这表明容器的 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 运行时。

更多资源