容器安全常见问题

Docker Desktop 中的容器是如何与主机隔离的?

Docker Desktop 将所有容器运行在一个定制的/最小化的 Linux 虚拟机中(原生 Windows 容器除外)。即使容器以 root 身份运行,这也在容器和主机之间增加了一层强大的隔离层。

但是请注意以下几点:

  • 容器可以通过“设置”->“资源”->“文件共享”配置的文件共享访问主机文件(有关更多信息,请参见下面的下一个常见问题解答)。

  • 默认情况下,容器以 root 身份运行,但在 Docker Desktop 虚拟机内具有有限的功能。以提升的权限运行的容器(例如,`--privileged`、`--pid=host`、`--cap-add` 等)在 Docker Desktop 虚拟机内以提升的权限以 root 身份运行,这使它们可以访问 Docker Desktop 虚拟机内部结构,包括 Docker Engine。因此,用户必须谨慎选择使用此类权限运行的容器,以避免恶意容器镜像造成安全漏洞。

  • 如果启用了增强的容器隔离 (ECI) 模式,则每个容器都将在 Docker Desktop 虚拟机内专用 Linux 用户命名空间中运行,这意味着容器在 Docker Desktop 虚拟机内没有任何权限。即使使用 `--privileged` 标志或类似标志,容器进程也只在其容器的逻辑边界内具有特权,否则将没有特权。此外,ECI 使用其他高级技术来确保它们无法轻易突破 Docker Desktop 虚拟机和 Docker Engine(有关更多信息,请参阅 ECI 部分)。无需更改容器或用户工作流程,因为额外的保护是在后台添加的。

容器可以读写主机的哪些文件系统部分?

容器只有在通过“设置”->“资源”->“文件共享”共享这些文件,并且仅当这些文件绑定安装到容器中时(例如,`docker run -v /path/to/host/file:/mnt ...`),才能访问主机文件。

以 root 身份运行的容器能否访问主机上管理员拥有的文件或目录?

不会;主机文件共享(来自主机文件系统的绑定挂载)使用用户空间制作的文件服务器(在 `com.docker.backend` 中以运行 Docker Desktop 的用户身份运行),因此容器无法获得主机用户尚未拥有的任何访问权限。