什么是增强容器隔离?
笔记
增强型容器隔离仅适用于 Docker Business 客户。
增强的容器隔离提供了额外的安全层,以防止容器中运行的恶意工作负载损害 Docker Desktop 或主机。
它使用各种先进技术来强化容器隔离,但不会影响开发人员的工作效率。它适用于 Docker Desktop 4.13.0 及更高版本。
这些技术包括:
- 通过 Linux 用户命名空间运行所有非特权容器,即使是那些使用该
--privileged
标志启动的容器。这使得恶意容器工作负载更难逃离容器并感染 Docker Desktop VM 和主机。 - 确保Docker Desktop VM的不变性(例如,容器或用户无法修改其内部设置)。
- 审查一些关键系统调用以防止容器逃逸,并部分虚拟化容器的部分
/proc
和内部以进一步隔离。/sys
- 阻止用户控制台访问 Docker Desktop VM。
启用增强容器隔离后,这些机制会自动应用,并且对开发人员的功能或性能影响最小。开发人员继续像往常一样使用 Docker Desktop,但他们启动的容器隔离性更强。
增强的容器隔离可确保更强的容器隔离,并锁定 IT 管理员创建的任何安全配置,例如通过 注册表访问管理策略或设置管理。
笔记
增强容器隔离是对 Docker 使用的其他容器安全技术的补充。例如,减少Linux功能、Seccomp、AppArmor。
它是给谁用的?
- 适用于希望防止容器攻击并减少开发人员环境中的漏洞的组织和开发人员。
- 对于希望确保更强大的容器隔离的组织来说,这种隔离可以在开发人员的计算机上轻松直观地实现。
启用增强容器隔离后会发生什么?
启用增强容器隔离后,将启用以下功能:
- 所有用户容器都自动在 Linux 用户命名空间中运行,以确保更强的隔离。每个容器都在专用的 Linux 用户命名空间中运行。
- 容器中的 root 用户映射到 Docker Desktop Linux VM 内的非特权用户。
- 容器变得更难被破坏。例如,敏感的系统调用经过审查,并且部分
/proc
和/sys
被模拟。 - 用户可以像往常一样继续使用容器,包括绑定挂载主机目录、卷等。
- 开发人员运行容器的方式没有改变,也不需要特殊的容器镜像。
- 特权容器(例如
--privileged
flag)可以工作,但它们仅在容器的Linux 用户命名空间中具有特权,而不是在Docker Desktop VM 中。因此它们不能用于破坏 Docker Desktop VM。 - Docker-in-Docker 甚至 Kubernetes-in-Docker 都可以工作,但在 Docker Desktop Linux VM 中以非特权方式运行。
此外,还施加以下限制:
- 容器不能再与 Docker Desktop VM 共享命名空间(例如,
--network=host
不允许--pid=host
)。 - 容器无法再修改 Docker Desktop VM 内的配置文件(例如,不允许将任何 VM 目录挂载到容器中)。
- 容器无法再访问Docker引擎(例如,将Docker引擎的socket挂载到容器中受到限制);这可以防止恶意容器获得对 Docker 引擎的控制。管理员可以针对受信任的容器镜像放宽这一点 。
- 禁止所有用户通过控制台访问 Docker Desktop VM。
这些功能和限制可确保容器在运行时得到更好的保护,同时对开发人员体验和生产力的影响最小。
有关增强容器隔离如何工作的更多信息,请参阅 它是如何工作的。
重要的
增强容器隔离尚未完全保护 Docker 构建、Kubernetes Pod 和扩展容器。有关已知限制和解决方法的更多信息,请参阅 常见问题解答。
哪些主机操作系统/平台支持增强型容器隔离?
Docker Desktop 4.13 中引入了适用于所有平台(Windows、Mac 和 Linux)的增强型容器隔离 (ECI)。
对于 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 及更高版本)配合使用。
请参阅 ECI 对 WSL 的支持,了解更多信息以及在 WSL 2 上使用增强容器隔离时的安全注意事项。
如何启用增强容器隔离?
作为开发人员
要以开发人员身份启用增强容器隔离:
- 确保您的组织拥有 Docker Business 订阅。
- 在 Docker Desktop 中登录到您的组织。这将确保您可以在 Docker Desktop 的“设置”菜单中使用 ECI 功能。
- 停止并删除所有现有容器。
- 导航到Docker Desktop 中的“设置” >“常规” 。
- 选中“使用增强容器隔离”旁边的复选框。
- 选择应用并重新启动以保存您的设置。
重要的
增强容器隔离不会保护在启用 ECI 之前创建的容器。有关已知限制和解决方法的更多信息,请参阅 常见问题解答。
作为管理员
要以管理员身份启用增强容器隔离,您首先需要
配置一个registry.json
文件以强制登录。这是因为增强容器隔离功能需要 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 VM 中的非特权用户 (100000),并且该映射扩展到 64K 用户 ID 范围。如果容器进程要脱离容器,它会发现自己没有虚拟机级别的特权。用户 ID 映射因每个新容器而异,因为每个容器都会获得一个专有的主机用户 ID 范围以进行隔离。用户 ID 映射由 Docker Desktop 自动管理。有关更多详细信息,请参阅 增强型容器隔离的工作原理。
相反,如果没有 ECI,Linux 用户命名空间不用于容器,将显示以下内容:
0 0 4294967295
这意味着容器 (0) 中的 root 用户实际上是 Docker Desktop VM (0) 中的 root 用户,这降低了容器隔离性。
由于增强型容器隔离
使用嵌入在 Docker Desktop Linux VM 中的 Sysbox 容器运行时,因此确定容器是否正在使用增强型容器隔离运行的另一种方法是使用docker inspect
:
$ docker inspect --format='{{.HostConfig.Runtime}}' my_container
它输出:
sysbox-runc
如果没有增强容器隔离,docker inspect
输出runc
,这是标准 OCI 运行时。