增強容器隔離

訂閱: 商務版
適用對象: 管理員

增強型容器隔離 (ECI) 可防止惡意容器危害 Docker Desktop 或主機系統。它會自動應用進階安全技術,同時保持開發人員的完整生產力及工作流程相容性。

ECI 強化容器隔離,並鎖定由管理員建立的安全配置,例如註冊中心存取管理政策以及設定管理控制。

注意

ECI 與其他 Docker 安全功能協同運作,例如簡化的 Linux 權限、seccomp 和 AppArmor。

誰應該使用增強型容器隔離?

增強型容器隔離專為以下對象設計:

  • 希望防止基於容器的攻擊並減少開發環境中安全漏洞的組織
  • 需要更強容器隔離而不影響開發人員工作流程的資安團隊
  • 在執行不受信任或第三方容器映像檔時需要額外保護的企業

增強型容器隔離的運作方式

Docker 透過使用 Sysbox 容器執行時來實作 ECI,Sysbox 是標準 OCI runc 執行時的一個安全性增強分支。啟用 ECI 後,透過 docker rundocker create 建立的容器將自動使用 Sysbox 而非 runc,無需變更開發人員工作流程。

即使使用 --privileged 旗標的容器,也能透過增強型容器隔離安全地執行,防止它們入侵 Docker Desktop 虛擬機器或其他容器。

注意

啟用 ECI 後,Docker CLI 的 --runtime 旗標將被忽略。Docker 的預設執行時仍為 runc,但所有使用者容器都將隱含地使用 Sysbox 啟動。

主要安全功能

Linux 使用者命名空間隔離

透過增強型容器隔離,所有容器都利用 Linux 使用者命名空間來實現更強的隔離。容器的根使用者會映射到 Docker Desktop 虛擬機器中的非特權使用者

$ docker run -it --rm --name=first alpine
/ # cat /proc/self/uid_map
         0     100000      65536

此輸出顯示容器根使用者 (0) 映射到虛擬機器中的非特權使用者 100000,擁有 64K 個使用者 ID 範圍。每個容器都會取得專屬的映射

$ docker run -it --rm --name=second alpine
/ # cat /proc/self/uid_map
         0     165536      65536

若無增強型容器隔離,容器將以真正的根使用者身分執行

$ docker run -it --rm alpine
/ # cat /proc/self/uid_map
         0       0     4294967295

透過使用 Linux 使用者命名空間,ECI 確保容器程序絕不會在 Linux 虛擬機器中以有效的使用者 ID 執行,將其權限限制在容器內部的資源。

安全的特權容器

特權容器 (docker run --privileged) 通常會帶來嚴重的安全風險,因為它們提供對 Linux 核心的無限制存取。若無 ECI,特權容器可以做到以下幾點:

  • 以具有所有權限的真正根使用者身分執行
  • 繞過 seccomp 和 AppArmor 限制
  • 存取所有硬體裝置
  • 修改全域核心設定

保護開發環境的組織面臨特權容器的挑戰,因為特權容器可以控制 Docker Desktop 虛擬機器,並更改註冊中心存取管理和網路代理等安全性設定。

增強型容器隔離透過確保特權容器只能存取其容器邊界內的資源來改變特權容器的行為。例如,特權容器無法存取 Docker Desktop 的網路設定

$ docker run --privileged djs55/bpftool map show
Error: can't get next map: Operation not permitted

若無 ECI,特權容器可以輕鬆存取和修改這些設定

$ docker run --privileged djs55/bpftool map show
17: ringbuf  name blocked_packets  flags 0x0
        key 0B  value 0B  max_entries 16777216  memlock 0B
18: hash  name allowed_map  flags 0x0
        key 4B  value 4B  max_entries 10000  memlock 81920B

進階容器工作負載,例如 Docker-in-Docker 和 Kubernetes-in-Docker,仍可在 ECI 下運作,但執行起來更加安全。

注意

ECI 並不阻止使用者執行特權容器,但透過限制其存取來確保其安全性。修改全域核心設定 (載入核心模組、變更 Berkeley 封包過濾器設定) 的特權工作負載將收到「權限不足」錯誤。

命名空間隔離強制執行

增強型容器隔離可防止容器與 Docker Desktop 虛擬機器共用 Linux 命名空間,從而維護隔離邊界

PID 命名空間共用已阻擋

$ docker run -it --rm --pid=host alpine
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: error in the container spec: invalid or unsupported container spec: sysbox containers can't share namespaces [pid] with the host (because they use the linux user-namespace for isolation): unknown.

網路命名空間共用已阻擋

$ docker run -it --rm --network=host alpine
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: error in the container spec: invalid or unsupported container spec: sysbox containers can't share a network namespace with the host (because they use the linux user-namespace for isolation): unknown.

使用者命名空間覆寫已忽略

$ docker run -it --rm --userns=host alpine
/ # cat /proc/self/uid_map
         0     100000      65536

使用 --network-host 的 Docker 建置操作以及 Docker buildx 權限 (network.host, security.insecure) 也會被阻擋。

受保護的綁定掛載

增強型容器隔離支援標準檔案共用,同時防止存取敏感的虛擬機器目錄

主機目錄掛載繼續有效

$ docker run -it --rm -v $HOME:/mnt alpine
/ # ls /mnt
# Successfully lists home directory contents

虛擬機器配置掛載已阻擋

$ docker run -it --rm -v /etc/docker/daemon.json:/mnt/daemon.json alpine
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: error in the container spec: can't mount /etc/docker/daemon.json because it's configured as a restricted host mount: unknown

這可以防止容器讀取或修改 Docker Engine 配置、註冊中心存取管理設定、代理配置以及其他與安全性相關的虛擬機器檔案。

注意

預設情況下,ECI 會阻擋綁定掛載 Docker Engine 通訊端 (/var/run/docker.sock),因為這會授予容器控制 Docker Engine 的權限。管理員可以為受信任的容器映像檔建立例外。

進階系統呼叫保護

增強型容器隔離會攔截敏感的系統呼叫,以防止容器惡意利用合法權限

$ docker run -it --rm --cap-add SYS_ADMIN -v $HOME:/mnt:ro alpine
/ # mount -o remount,rw /mnt /mnt
mount: permission denied (are you root?)

即使擁有 CAP_SYS_ADMIN 權限,容器也無法將唯讀綁定掛載變更為讀寫模式,確保它們無法突破容器邊界。

容器仍可以在其檔案系統內建立內部掛載

/ # mkdir /root/tmpfs
/ # mount -t tmpfs tmpfs /root/tmpfs
/ # mount -o remount,ro /root/tmpfs /root/tmpfs
/ # findmnt | grep tmpfs
├─/root/tmpfs    tmpfs      tmpfs    ro,relatime,uid=100000,gid=100000

ECI 透過僅攔截控制路徑系統呼叫 (很少使用) 來高效執行系統呼叫過濾,同時不影響資料路徑系統呼叫,從而保持容器效能。

自動檔案系統使用者 ID 映射

增強型容器隔離透過自動檔案系統映射解決具有不同使用者 ID 範圍的容器之間的檔案共用挑戰。

每個容器都會取得專屬的使用者 ID 映射,但 Sysbox 透過 Linux 核心 ID 映射掛載 (於 2021 年新增) 或替代的 shiftsfs 模組來使用檔案系統使用者 ID 重新映射。這會將容器的實際使用者 ID 的檔案系統存取映射到標準範圍,從而實現

  • 在具有不同使用者 ID 範圍的容器之間共用磁碟區
  • 不論容器使用者 ID 映射為何,都保持一致的檔案擁有權
  • 無需使用者介入的透明檔案存取

透過檔案系統模擬隱藏資訊

ECI 會在容器內模擬 /proc/sys 檔案系統的部分內容,以隱藏敏感的主機資訊並提供每個容器的核心資源視圖

$ docker run -it --rm alpine
/ # cat /proc/uptime
5.86 5.86

這顯示的是容器的執行時間而非 Docker Desktop 虛擬機器的執行時間,防止系統資訊洩漏到容器中。

幾個未被 Linux 核心命名空間化的 /proc/sys 資源會根據每個容器進行模擬,Sysbox 在設定核心設定時會協調這些值。這使得通常需要特權存取的容器工作負載能夠安全地執行。

效能與相容性

增強型容器隔離保持最佳化效能和完全相容性

  • 無效能影響:系統呼叫過濾僅針對控制路徑呼叫,資料路徑操作不受影響
  • 完整工作流程相容性:現有的開發流程、工具和容器映像檔可照常運作
  • 進階工作負載支援:Docker-in-Docker、Kubernetes-in-Docker 和其他複雜情境都能安全運作
  • 自動管理:使用者 ID 映射、檔案系統存取和安全政策均自動處理
  • 標準映像檔支援:無需特殊的容器映像檔或修改
重要

ECI 保護功能會因 Docker Desktop 版本而異,目前尚未保護延伸容器。Docker Desktop 中的 Docker 建置和 Kubernetes 的保護層級會因版本而異。詳情請參閱增強型容器隔離限制

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