什麼是強化容器隔離?

注意

強化容器隔離功能僅適用於 Docker Business 客戶。

強化容器隔離 (ECI) 提供額外的安全層,可防止在容器中執行的惡意工作負載危害 Docker Desktop 或主機。

它使用各種先進技術來強化容器隔離,但不會影響開發人員的生產力。

強化容器隔離可確保更強的容器隔離,同時鎖定管理員建立的任何安全設定,例如透過 登錄檔存取管理策略設定管理 建立的設定。

注意

ECI 是 Docker 使用的其他容器安全技術的補充。例如,減少的 Linux 功能、seccomp 和 AppArmor。

適用對象?

  • 適用於想要防止容器攻擊並減少開發人員環境中弱點的組織和開發人員。
  • 適用於想要確保更強的容器隔離,且易於在開發人員的機器上實作的組織。

開啟強化容器隔離後會發生什麼事?

開啟強化容器隔離後,將啟用以下功能和安全技術

  • 所有使用者容器都會自動在 Linux 使用者命名空間中執行,以確保更強的隔離。每個容器都在專用的 Linux 使用者命名空間中執行。
  • 容器中的 root 使用者會映射到 Docker Desktop Linux 虛擬機器內部的非特權使用者。
  • 容器變得更難以入侵。例如,會審查敏感的系統呼叫,並在容器內模擬 /proc/sys 的部分內容。
  • 使用者可以繼續照常使用容器,包括繫結掛載主機目錄、磁碟區等。
  • 開發人員執行容器的方式沒有變化,也不需要特殊的容器映像檔。
  • 特權容器(例如,--privileged 旗標)可以運作,但它們僅在容器的 Linux 使用者命名空間內具有特權,而不是在 Docker Desktop 虛擬機器中。因此,它們不能用於入侵 Docker Desktop 虛擬機器。
  • Docker-in-Docker 甚至 Kubernetes-in-Docker 都可以運作,但在 Docker Desktop Linux 虛擬機器內部以非特權方式執行。

此外,還會施加以下限制

  • 容器不能再與 Docker Desktop 虛擬機器共用命名空間(例如,不允許 --network=host--pid=host)。
  • 容器不能再修改 Docker Desktop 虛擬機器內的設定檔(例如,不允許將任何虛擬機器目錄掛載到容器中)。
  • 容器不能再存取 Docker 引擎。例如,限制將 Docker 引擎的通訊端掛載到容器中,以防止惡意容器取得 Docker 引擎的控制權。管理員可以針對信任的容器映像檔放鬆此限制。
  • 所有使用者都禁止使用 Docker Desktop 虛擬機器的控制台存取權。

這些功能和限制可確保在執行階段更好地保護容器,並將對開發人員體驗和生產力的影響降至最低。開發人員可以繼續照常使用 Docker Desktop,但他們啟動的容器具有更強的隔離性。

如需強化容器隔離運作方式的詳細資訊,請參閱 運作方式

重要

強化容器隔離尚未完全保護 Docker 建置、Kubernetes Pod 和擴充容器。如需已知限制和因應措施的詳細資訊,請參閱 常見問題

如何啟用強化容器隔離?

身為開發人員

以開發人員身分啟用強化容器隔離

  1. 確保您的組織擁有 Docker Business 訂閱。
  2. 在 Docker Desktop 中登入您的組織。這將確保 ECI 功能在 Docker Desktop 的「設定」選單中可用。
  3. 停止並移除所有現有的容器。
  4. 在 Docker Desktop 中,瀏覽至 **設定** > **一般**。
  5. 在 **使用強化容器隔離** 旁邊,選取核取方塊。
  6. 選取 **套用並重新啟動** 以儲存您的設定。

重要

強化容器隔離無法保護在啟用 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 管理主控台中設定這些設定。

啟用強化容器隔離後,使用者會看到

  • 在**設定** > **一般**中,**使用強化容器隔離**已開啟。
  • 容器在 Linux 使用者命名空間內執行。

要檢查,請執行

$ docker run --rm alpine cat /proc/self/uid_map

將顯示以下輸出

         0     100000      65536

這表示容器的 root 使用者 (0) 對應到 Docker Desktop 虛擬機器中沒有權限的使用者 (100000),並且該對應範圍擴展到 64K 個使用者 ID。如果容器行程逸出容器,它會發現自己在虛擬機器層級沒有權限。使用者 ID 對應會隨著每個新容器而變化,因為每個容器都會獲得一個專屬的主機使用者 ID 範圍以進行隔離。使用者 ID 對應由 Docker Desktop 自動管理。如需更多詳細資訊,請參閱強化容器隔離的工作原理

相反,如果沒有 ECI,則不會將 Linux 使用者命名空間用於容器,將顯示以下內容

         0          0 4294967295

這表示容器中的 root 使用者 (0) 實際上是 Docker Desktop 虛擬機器中的 root 使用者 (0),這會降低容器隔離。

由於強化容器隔離使用嵌入在 Docker Desktop Linux 虛擬機器中的 Sysbox 容器執行階段,因此確定容器是否正在使用強化容器隔離執行的另一種方法是使用 docker inspect

$ docker inspect --format='{{.HostConfig.Runtime}}' my_container

它會輸出

sysbox-runc

如果沒有強化容器隔離,docker inspect 會輸出 runc,這是標準的 OCI 執行階段。

更多資源