瞭解 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 代理屬性等約束。