什么是增强容器隔离?
增强容器隔离 (ECI) 提供额外的安全层,以防止在容器中运行的恶意工作负载危及 Docker Desktop 或主机。
它采用多种先进技术来加固容器隔离,同时不影响开发人员的生产力。
增强容器隔离确保更强的容器隔离,并且锁定管理员创建的任何安全配置,例如通过镜像仓库访问管理策略或使用设置管理创建的配置。
注意
ECI 是 Docker 使用的其他容器安全技术的补充。例如,精简的 Linux Capabilities、seccomp 和 AppArmor。
面向哪些用户?
- 适用于希望防止容器攻击并减少开发者环境中的漏洞的组织和开发者。
- 适用于希望在开发者机器上轻松直观地实现更强容器隔离的组织。
启用增强容器隔离后会发生什么?
启用增强容器隔离后,将启用以下功能和安全技术
- 所有用户容器都自动在 Linux 用户命名空间中运行,这确保了更强的隔离。每个容器都在专用的 Linux 用户命名空间中运行。
- 容器中的 root 用户映射到 Docker Desktop Linux VM 中的一个非特权用户。
- 容器更难被攻破。例如,敏感系统调用会经过审查,并且
/proc
和/sys
的部分内容会在容器内部进行模拟。 - 用户可以像往常一样继续使用容器,包括绑定挂载主机目录、卷等。
- 开发者运行容器的方式没有变化,也不需要特殊的容器镜像。
- 特权容器(例如,
--privileged
标志)可以工作,但它们仅在容器的 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 Engine。例如,将 Docker Engine 的 socket 挂载到容器中是受限的,这可以防止恶意容器控制 Docker Engine。管理员可以为受信任的容器镜像放宽此限制。
- 禁止所有用户对 Docker Desktop VM 进行控制台访问。
这些功能和限制确保容器在运行时具有更好的安全性,同时对开发者体验和生产力的影响最小。开发者可以像往常一样继续使用 Docker Desktop,但他们启动的容器具有更强的隔离性。
有关增强容器隔离如何工作的更多信息,请参阅工作原理。
重要
Docker 构建和 Docker Desktop 中的 Kubernetes 的 ECI 保护因 Docker Desktop 版本而异。后续版本包含比早期版本更多的保护。此外,ECI 尚不保护扩展容器。有关已知限制和解决方法,请参阅常见问题解答。
如何启用增强容器隔离?
作为开发者
作为开发者启用增强容器隔离
- 确保您的组织拥有 Docker Business 订阅。
- 在 Docker Desktop 中登录您的组织。这将确保 ECI 功能在 Docker Desktop 的“设置”菜单中可用。
- 停止并移除所有现有容器。
- 在 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 socket 挂载权限。
要使其生效
- 对于新安装,开发者需要启动 Docker Desktop 并对其组织进行身份验证。
- 对于现有安装,开发者需要通过 Docker 菜单退出 Docker Desktop,然后重新启动 Docker Desktop。如果他们已登录,则无需再次登录即可使更改生效。
重要
仅从 Docker 菜单选择重启是不够的,因为它只重启 Docker Desktop 的部分组件。
当管理员强制执行此设置时,用户会看到什么?
提示
您现在也可以在Docker Admin Console 中配置这些设置。
启用增强容器隔离后,用户会看到
- 在设置 > 通用中,使用增强容器隔离已启用。
- 容器在 Linux 用户命名空间中运行。
要检查,请运行
$ docker run --rm alpine cat /proc/self/uid_map
显示以下输出
0 100000 65536
这表明容器的 root 用户 (0) 映射到 Docker Desktop VM 中的非特权用户 (100000),并且该映射扩展了 64K 用户 ID 的范围。如果容器进程逃逸出容器,它将在 VM 级别发现自己没有权限。用户 ID 映射随每个新容器而变化,因为每个容器都获得一个独占的主机用户 ID 范围用于隔离。用户 ID 映射由 Docker Desktop 自动管理。有关更多详细信息,请参阅增强容器隔离的工作原理。
相比之下,没有 ECI 时,Linux 用户命名空间不用于容器,显示以下内容
0 0 4294967295
这意味着容器中的 root 用户 (0) 实际上是 Docker Desktop VM 中的 root 用户 (0),这降低了容器隔离性。
由于增强容器隔离使用嵌入在 Docker Desktop Linux VM 中的 Sysbox 容器运行时,确定容器是否使用增强容器隔离运行的另一种方法是使用 docker inspect
$ docker inspect --format='{{.HostConfig.Runtime}}' my_container
它输出
sysbox-runc
如果没有增强容器隔离,docker inspect
将输出 runc
,它是标准的 OCI 运行时。