什么是增强型容器隔离?
注意
增强容器隔离仅适用于 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 支持。
如何启用增强容器隔离?
作为开发者
要作为开发者启用增强容器隔离
- 确保您的组织拥有 Docker Business 订阅。
- 在 Docker Desktop 中登录您的组织。这将确保 ECI 功能在 Docker Desktop 的“设置”菜单中对您可用。
- 停止并删除所有现有容器。
- 在 Docker Desktop 中导航到 **设置** > **常规**。
- 在 **使用增强容器隔离** 旁边,选中复选框。
- 选择 **应用并重启** 以保存您的设置。
重要
增强容器隔离不会保护在启用 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 运行时。