配置 Docker Socket 例外與進階設定

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

本頁面將介紹如何針對增強型容器隔離(Enhanced Container Isolation, ECI)配置 Docker Socket 例外與其他進階設定。這些配置可在維持安全性的同時,讓 Testcontainers 等受信任工具能夠在 ECI 環境下運作。

Docker Socket 掛載權限

預設情況下,增強型容器隔離會封鎖容器掛載 Docker Socket,以防止惡意存取 Docker Engine。然而,某些工具仍需要存取 Docker Socket。

需要存取 Docker Socket 的常見場景包括:

  • 測試框架:例如管理測試容器的 Testcontainers
  • 建置工具:例如建立臨時建置容器的 Paketo buildpacks
  • CI/CD 工具:在部署管線中管理容器的工具
  • 開發工具:用於容器管理的 Docker CLI 容器

配置 Socket 例外

透過「設定管理 (Settings Management)」配置 Docker Socket 例外

  1. 登入 Docker Home 並選取您的組織。
  2. 前往管理控制台 (Admin Console) > 桌面設定管理 (Desktop Settings Management)
  3. 建立或編輯設定原則.
  4. 找到增強型容器隔離 (Enhanced Container Isolation) 設定。
  5. 使用您信任的映像檔與指令限制來配置 Docker Socket 存取控制

建立一個 admin-settings.json 檔案並加入:

{
  "configurationFileVersion": 2,
  "enhancedContainerIsolation": {
    "locked": true,
    "value": true,
    "dockerSocketMount": {
      "imageList": {
        "images": [
          "docker.io/localstack/localstack:*",
          "docker.io/testcontainers/ryuk:*",
          "docker:cli"
        ],
        "allowDerivedImages": true
      },
      "commandList": {
        "type": "deny",
        "commands": ["push", "build"]
      }
    }
  }
}

映像檔允許清單配置

imageList 定義了哪些容器映像檔可以掛載 Docker Socket。

映像檔參照格式

格式描述
<映像檔名稱>[:<標籤>]映像檔名稱,可選擇性加上標籤。若省略標籤,則使用 :latest。若標籤為萬用字元 *,則表示「該映像檔的所有標籤」。
<映像檔名稱>@<摘要值 (digest)>映像檔名稱,包含特定的儲存庫摘要值(例如透過 docker buildx imagetools inspect <映像檔> 取得)。這代表僅允許符合該名稱與摘要值的映像檔。

配置範例

測試工具的基礎允許清單

"imageList": {
  "images": [
    "docker.io/testcontainers/ryuk:*",
    "docker:cli",
    "alpine:latest"
  ]
}

萬用字元允許清單(Docker Desktop 4.36 及更高版本)

"imageList": {
  "images": ["*"]
}
警告

使用 "*" 會允許所有容器掛載 Docker Socket,這會降低安全性。請僅在無法明確列出允許的映像檔時才使用此項。

安全性驗證

Docker Desktop 透過以下方式驗證允許的映像檔:

  1. 從登錄庫 (registry) 下載已允許映像檔的摘要值
  2. 在容器啟動時比對容器映像檔摘要與允許清單
  3. 封鎖摘要值不符的容器

這能防止透過重新標記未經授權的映像檔來繞過限制

$ docker tag malicious-image docker:cli
$ docker run -v /var/run/docker.sock:/var/run/docker.sock docker:cli
# This fails because the digest doesn't match the real docker:cli image

衍生映像檔支援

針對建立臨時本機映像檔的工具(如 Paketo buildpacks),您可以允許從受信任的基礎映像檔衍生而來的映像檔。

啟用衍生映像檔

"imageList": {
  "images": [
    "paketobuildpacks/builder:base"
  ],
  "allowDerivedImages": true
}

allowDerivedImages 設定為 true 時,從允許的基礎映像檔所建置的本機映像檔(使用 Dockerfile 中的 FROM)也會獲得 Docker Socket 存取權。

衍生映像檔需求

  • 僅限本機映像檔:衍生映像檔不得存在於遠端登錄庫中
  • 需有基礎映像檔:父層映像檔必須先在本機下載完成
  • 效能影響:驗證過程會使容器啟動時間增加最多 1 秒
  • 版本相容性:完整的萬用字元支援需要 Docker Desktop 4.36+

指令限制

封鎖特定指令,同時允許所有其他指令

"commandList": {
  "type": "deny",
  "commands": ["push", "build", "image*"]
}

允許清單

僅允許特定指令,同時封鎖所有其他指令

"commandList": {
  "type": "allow",
  "commands": ["ps", "container*", "volume*"]
}

指令萬用字元

萬用字元封鎖/允許
"container\*"所有 "docker container ..." 指令
"image\*"所有 "docker image ..." 指令
"volume\*"所有 "docker volume ..." 指令
"network\*"所有 "docker network ..." 指令
"build\*"所有 "docker build ..." 指令
"system\*"所有 "docker system ..." 指令

指令阻擋範例

當執行被封鎖的指令時

/ # docker push myimage
Error response from daemon: enhanced container isolation: docker command "/v1.43/images/myimage/push?tag=latest" is blocked; if you wish to allow it, configure the docker socket command list in the Docker Desktop settings.

常見配置範例

Testcontainers 設定

用於使用 Testcontainers 進行 Java/Python 測試

"dockerSocketMount": {
  "imageList": {
    "images": [
      "docker.io/testcontainers/ryuk:*",
      "testcontainers/*:*"
    ]
  },
  "commandList": {
    "type": "deny",
    "commands": ["push", "build"]
  }
}

CI/CD 管線工具

用於受控的 CI/CD 容器管理

"dockerSocketMount": {
  "imageList": {
    "images": [
      "docker:cli",
      "your-registry.com/ci-tools/*:*"
    ]
  },
  "commandList": {
    "type": "allow",
    "commands": ["ps", "container*", "image*"]
  }
}

開發環境

用於使用 Docker-in-Docker 進行本機開發

"dockerSocketMount": {
  "imageList": {
    "images": [
      "docker:dind",
      "docker:cli"
    ]
  },
  "commandList": {
    "type": "deny",
    "commands": ["system*"]
  }
}

安全性建議

映像檔允許清單最佳實踐

  • 保持嚴格:僅允許您絕對信任且必要的映像檔
  • 謹慎使用萬用字元:標籤萬用字元 (*) 很方便,但安全性不如指定特定標籤
  • 定期審查:定期檢視並更新您的允許清單
  • 摘要值固定 (Digest pinning):在關鍵環境中,使用摘要參照以確保最高安全性

指令限制

  • 預設拒絕:從拒絕清單開始,封鎖諸如 pushbuild 等危險指令
  • 最小權限原則:僅允許您的工具實際需要的指令
  • 監控使用情況:追蹤哪些指令被封鎖,以優化您的配置

監控與維護

  • 定期驗證:在 Docker Desktop 更新後測試您的配置,因為映像檔摘要值可能會變更。
  • 處理摘要值不符:如果允許的映像檔意外被封鎖
    $ docker image rm <image>
    $ docker pull <image>
    

這能解決上游映像檔更新後的摘要值不符問題。

下一步

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