什么是增强的容器隔离?
注意
增强的容器隔离仅适用于 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 和扩展容器。有关已知限制和解决方法的更多信息,请参阅常见问题解答。
如何启用增强的容器隔离?
作为开发者
要作为开发者启用增强型容器隔离:
- 确保您的组织拥有 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
这表明容器的 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 运行时。