了解 Windows 权限要求

本页包含关于在 Windows 上运行和安装 Docker Desktop 的权限要求、特权助手进程 com.docker.service 的功能以及此方法背后的原因的信息。

它还阐明了以 root 身份运行容器与在主机上拥有 Administrator 访问权限之间的区别,以及 Windows Docker 引擎和 Windows 容器的权限。

Windows 上的 Docker Desktop 在设计时考虑了安全性。仅在绝对必要时才需要管理权限。

权限要求

虽然 Windows 上的 Docker Desktop 可以在没有 Administrator 权限的情况下运行,但它在安装过程中需要这些权限。安装时会收到 UAC 提示,允许安装特权助手服务。之后,Docker Desktop 可以在没有管理员权限的情况下运行。

在 Windows 上运行没有特权助手的 Docker Desktop 不需要用户拥有 docker-users 组的成员资格。但是,某些需要特权操作的功能将有此要求。

如果您执行了安装,您将自动添加到此组,但其他用户必须手动添加。这允许管理员控制谁有权访问需要更高权限的功能,例如创建和管理 Hyper-V 虚拟机,或使用 Windows 容器。

当 Docker Desktop 启动时,所有非特权命名管道都将创建,以便只有以下用户可以访问它们:

  • 启动 Docker Desktop 的用户。
  • 本地 Administrators 组的成员。
  • LOCALSYSTEM 账户。

特权助手

Docker Desktop 需要执行一组有限的特权操作,这些操作由特权助手进程 com.docker.service 完成。这种方法允许,遵循最小特权原则,仅在绝对必要的操作中使用 Administrator 访问权限,同时仍能以非特权用户身份使用 Docker Desktop。

特权助手 com.docker.service 是一个在后台以 SYSTEM 权限运行的 Windows 服务。它侦听命名管道 //./pipe/dockerBackendV2。开发人员运行 Docker Desktop 应用程序,该应用程序连接到命名管道并向服务发送命令。此命名管道受到保护,只有 docker-users 组的成员才能访问它。

该服务执行以下功能:

  • 确保 kubernetes.docker.internal 在 Win32 主机文件中定义。定义 DNS 名称 kubernetes.docker.internal 允许 Docker 与容器共享 Kubernetes 上下文。
  • 确保 host.docker.internalgateway.docker.internal 在 Win32 主机文件中定义。它们指向主机的本地 IP 地址,并允许应用程序从主机本身或容器使用相同的名称解析主机 IP。
  • 安全地缓存注册表访问管理策略,该策略对开发人员是只读的。
  • 创建 Hyper-V 虚拟机 "DockerDesktopVM" 并管理其生命周期——启动、停止和销毁它。虚拟机名称在服务代码中是硬编码的,因此该服务不能用于创建或操作任何其他虚拟机。
  • 移动 VHDX 文件或文件夹。
  • 启动和停止 Windows Docker 引擎,并查询其是否正在运行。
  • 删除所有 Windows 容器数据文件。
  • 检查 Hyper-V 是否已启用。
  • 检查引导加载程序是否激活 Hyper-V。
  • 检查所需的 Windows 功能是否已安装并启用。
  • 进行健康检查并检索服务自身的版本。

服务启动模式取决于所选的容器引擎,对于 WSL,取决于是否需要在 Win32 hosts 文件中维护 host.docker.internalgateway.docker.internal。这由设置页面中“使用基于 WSL 2 的引擎”下的设置控制。当此设置启用时,WSL 引擎的行为与 Hyper-V 相同。因此:

  • 对于 Windows 容器或 Hyper-V Linux 容器,服务在系统启动时启动并一直运行,即使 Docker Desktop 未运行。这是必需的,以便您可以在没有管理员权限的情况下启动 Docker Desktop。
  • 对于 WSL2 Linux 容器,服务不是必需的,因此在系统启动时不会自动运行。当您切换到 Windows 容器或 Hyper-V Linux 容器,或选择在 Win32 hosts 文件中维护 host.docker.internalgateway.docker.internal 时,会出现 UAC 提示,要求您接受特权操作以启动服务。如果接受,服务将启动并设置为在下次 Windows 启动时自动启动。

Linux 虚拟机中以 root 身份运行的容器

Linux Docker 守护程序和容器在 Docker 管理的最小专用 Linux 虚拟机中运行。它是不可变的,因此您无法扩展它或更改已安装的软件。这意味着,虽然容器默认以 root 身份运行,但这不允许修改虚拟机,也不授予对 Windows 主机机器的 Administrator 访问权限。Linux 虚拟机充当安全边界,并限制可以访问哪些主机资源。文件共享使用用户空间创建的文件服务器,并且任何从主机绑定挂载到 Docker 容器的目录仍保留其原始权限。容器无权访问任何未明确共享的主机文件。

增强型容器隔离

此外,Docker Desktop 支持增强容器隔离模式 (ECI),该模式仅适用于企业客户,它在不影响开发人员工作流程的情况下进一步保护容器。

ECI 自动在 Linux 用户命名空间中运行所有容器,从而将容器中的 root 映射到 Docker Desktop VM 中的非特权用户。ECI 使用此技术和其他高级技术进一步保护 Docker Desktop Linux VM 中的容器,使其与 Docker 守护程序和 VM 内部运行的其他服务进一步隔离。

Windows 容器

警告

启用 Windows 容器具有重要的安全隐患。

与在虚拟机中运行的 Linux Docker Engine 和容器不同,Windows 容器是使用操作系统功能实现的,并直接在 Windows 主机上运行。如果在安装期间启用 Windows 容器,则用于容器内管理的 ContainerAdministrator 用户是主机上的本地管理员。在安装期间启用 Windows 容器会导致 docker-users 组成员能够在主机上提升为管理员。对于不希望开发人员运行 Windows 容器的组织,可以使用 -–no-windows-containers 安装程序标志来禁用其使用。

网络

对于网络连接,Docker Desktop 使用用户空间进程 (vpnkit),该进程继承了启动它的用户的防火墙规则、VPN、HTTP 代理属性等约束。

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.