配置 Docker socket 例外和高階設定

訂閱: 企業版
適用物件: 管理員

本頁向您展示如何配置 Docker socket 例外和增強容器隔離 (ECI) 的其他高階設定。這些配置使 Testcontainers 等受信任工具能夠與 ECI 配合使用,同時保持安全性。

Docker socket 掛載許可權

預設情況下,增強容器隔離會阻止容器掛載 Docker socket,以防止惡意訪問 Docker Engine。但是,某些工具需要 Docker socket 訪問許可權。

需要 Docker socket 訪問許可權的常見場景包括:

  • 測試框架:Testcontainers,用於管理測試容器
  • 構建工具:Paketo buildpacks,用於建立臨時構建容器
  • CI/CD 工具:作為部署流水線一部分管理容器的工具
  • 開發實用工具:用於容器管理的 Docker CLI 容器

配置 socket 例外

使用設定管理配置 Docker socket 例外

  1. 登入 Docker Home 並選擇您的組織。
  2. 前往 **管理員控制檯** > **桌面設定管理**。
  3. 建立或編輯設定策略.
  4. 找到 **增強容器隔離** 設定。
  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。

映象引用格式

格式描述
<image_name>[:<tag>]映象名稱,帶可選標籤。如果省略標籤,則使用 :latest 標籤。如果標籤是萬用字元 *,則表示“該映象的任何標籤”。
<image_name>@<digest>映象名稱,帶特定倉庫摘要(例如,由 docker buildx imagetools inspect <image> 報告)。這意味著只允許名稱和摘要匹配的映象。

配置示例

用於測試工具的基本允許列表

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

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

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

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

安全驗證

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

  1. 從登錄檔下載允許映象的映象摘要
  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 設定

用於 Java/Python 測試與 Testcontainers

"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*"]
  }
}

安全建議

映象允許列表最佳實踐

  • 保持限制性:只允許您絕對信任和需要的映象
  • 謹慎使用萬用字元:標籤萬用字元 (*) 方便但不如特定標籤安全
  • 定期審查:定期審查和更新您的允許列表
  • 摘要鎖定:在關鍵環境中,使用摘要引用以獲得最大安全性

命令限制

  • 預設拒絕:從拒絕列表開始,阻止 pushbuild 等危險命令
  • 最小許可權原則:只允許您的工具實際需要的命令
  • 監控使用情況:跟蹤哪些命令被阻止以最佳化您的配置

監控和維護

  • 定期驗證:在 Docker Desktop 更新後測試您的配置,因為映象摘要可能會更改。
  • 處理摘要不匹配:如果允許的映象意外被阻止
    $ docker image rm <image>
    $ docker pull <image>
    

這解決了上游映象更新時摘要不匹配的問題。

後續步驟