了解 Windows 的權限需求

本頁面包含有關在 Windows 上執行與安裝 Docker Desktop 的權限需求、特權輔助處理程序 com.docker.service 的功能,以及採用此方式背後考量的資訊。

頁面亦釐清了以 root 身分執行容器,與在主機上擁有 Administrator 存取權限的區別,以及 Windows Docker 引擎與 Windows 容器的權限。

Windows 版 Docker Desktop 的設計充分考慮了安全性,僅在絕對必要時才需要管理員權限。

權限需求

雖然 Windows 版 Docker Desktop 可以在沒有 Administrator 權限的情況下執行,但在安裝過程中仍需要管理員權限。安裝時會出現 UAC 提示,允許安裝特權輔助服務。完成後,Docker Desktop 即可在無管理員權限的情況下執行。

若要在不使用特權輔助程式的情況下執行 Docker Desktop,並不要求使用者必須成為 docker-users 群組成員。然而,某些需要特權操作的功能會有此要求。

若您親自執行安裝,將會自動被加入此群組,但其他使用者必須手動加入。這能讓管理員控制誰能存取需要較高權限的功能,例如建立和管理 Hyper-V VM,或使用 Windows 容器。

當 Docker Desktop 啟動時,所有非特權具名管道(named pipes)皆會被建立,僅限下列使用者存取:

  • 啟動 Docker Desktop 的使用者。
  • 本機 Administrators 群組的成員。
  • LOCALSYSTEM 帳戶。

特權輔助程式

Docker Desktop 需要執行有限的特權操作,這些操作由特權輔助處理程序 com.docker.service 負責。基於最小權限原則,此方式允許僅在絕對必要的操作中使用 Administrator 存取權,同時仍能以非特權使用者身分使用 Docker Desktop。

特權輔助程式 com.docker.service 是一個在背景以 SYSTEM 權限執行的 Windows 服務。它會監聽 //./pipe/dockerBackendV2 具名管道。開發者執行的 Docker Desktop 應用程式會連接至此管道並向服務發送指令。此具名管道受到保護,僅屬於 docker-users 群組的使用者才能存取。

該服務執行以下功能:

  • 確保 Win32 hosts 檔案中定義了 kubernetes.docker.internal。定義此 DNS 名稱允許 Docker 與容器共享 Kubernetes 環境設定。
  • 確保 Win32 hosts 檔案中定義了 host.docker.internalgateway.docker.internal。它們指向主機本機 IP 位址,允許應用程式從主機本身或容器內使用相同的名稱來解析主機 IP。
  • 安全地快取「登錄檔存取管理」(Registry Access Management)原則,開發者對此僅有唯讀權限。
  • 建立 Hyper-V VM "DockerDesktopVM" 並管理其生命週期——啟動、停止與銷毀。VM 名稱已寫死在服務程式碼中,因此該服務無法用於建立或操控任何其他 VM。
  • 移動 VHDX 檔案或資料夾。
  • 啟動與停止 Windows Docker 引擎,並查詢其是否正在執行。
  • 刪除所有 Windows 容器的資料檔。
  • 檢查 Hyper-V 是否已啟用。
  • 檢查開機載入器(bootloader)是否啟動了 Hyper-V。
  • 檢查所需的 Windows 功能是否皆已安裝並啟用。
  • 執行健康檢查並獲取服務本身的版本。

服務的啟動模式取決於所選擇的容器引擎,以及針對 WSL,是否需要維護 Win32 hosts 檔案中的 host.docker.internalgateway.docker.internal。這由設定頁面中 Use the WSL 2 based engine(使用基於 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 VM 中以 root 身分執行的容器

Linux Docker daemon 與容器執行於 Docker 管理的精簡型特殊用途 Linux VM 中。它是不可變的,因此您無法擴充或變更其中安裝的軟體。這意味著,儘管容器預設以 root 身分執行,但這並不允許更改該 VM,也不會授予對 Windows 主機的 Administrator 存取權。Linux VM 作為安全邊界,限制了可從主機存取的資源。檔案共享使用使用者空間構建的檔案伺服器,且任何從主機掛載到 Docker 容器中的目錄,仍會保留其原始權限。容器無法存取除明確共享檔案之外的任何主機檔案。

增強容器隔離

此外,Docker Desktop 支援 增強型容器隔離模式 (ECI),此功能僅供企業客戶使用,可在不影響開發者工作流程的情況下進一步保護容器。

ECI 會自動在 Linux 使用者命名空間(user-namespace)內執行所有容器,使得容器內的 root 會對應至 Docker Desktop VM 內的一個非特權使用者。ECI 利用此技術與其他進階技術,進一步強化 Docker Desktop Linux VM 內的容器安全性,使其與 Docker daemon 及 VM 內執行的其他服務進一步隔離。

Windows 容器

警告

啟用 Windows 容器會產生重要的安全影響。

與在 VM 中執行的 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.