配置 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 例外
- 登入 Docker Home 並選取您的組織。
- 前往管理控制台 (Admin Console) > 桌面設定管理 (Desktop Settings Management)。
- 建立或編輯設定原則.
- 找到增強型容器隔離 (Enhanced Container Isolation) 設定。
- 使用您信任的映像檔與指令限制來配置 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 透過以下方式驗證允許的映像檔:
- 從登錄庫 (registry) 下載已允許映像檔的摘要值
- 在容器啟動時比對容器映像檔摘要與允許清單
- 封鎖摘要值不符的容器
這能防止透過重新標記未經授權的映像檔來繞過限制
$ 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):在關鍵環境中,使用摘要參照以確保最高安全性
指令限制
- 預設拒絕:從拒絕清單開始,封鎖諸如
push和build等危險指令 - 最小權限原則:僅允許您的工具實際需要的指令
- 監控使用情況:追蹤哪些指令被封鎖,以優化您的配置
監控與維護
- 定期驗證:在 Docker Desktop 更新後測試您的配置,因為映像檔摘要值可能會變更。
- 處理摘要值不符:如果允許的映像檔意外被封鎖
$ docker image rm <image> $ docker pull <image>
這能解決上游映像檔更新後的摘要值不符問題。