AI百科网 AI教程
工具库

别把 Docker socket 直接交给 Claude

挂载加了只读标记不等于只读权限。讲清这个 socket 等于宿主机 root、agent 会用容器 ID 绕过名字检查,以及给它做一层受控包装的六个步骤。

本文目录 · 6 节

那位工程师在服务里读到了这行配置:把宿主机的 Docker socket 挂进容器,末尾加了个只读标记。他以为这就够了。

一、发生了什么

HackerNoon 在 10 月 22 日发了一篇实践文章,作者是干了约十五年平台工程的 Siva Sai Krishna Suryadevara,思路是给 AI 编程 agent 做一个 MCP 服务,只暴露四个 Docker 能力,而不是把 socket 直接递过去。

先把最关键的一句放前面:只读标记约束的是 socket 这个文件本身,不是从它流过的字节。进程一旦连上,就是在用 HTTP 跟 Docker 引擎对话,引擎会接受创建、重启、删除容器这些请求。用作者的原话说,任何能打开它的东西,对宿主机都有与 root 等价的权限。

二、跟你有什么关系

想让 agent 帮忙排查容器的人。 你要接受一个事实:允许它看日志和允许它重启生产库,用的是同一条通道。中间唯一的墙,是你写在工具层的那几十行判断。

给团队搭 MCP 服务的人。 这篇文章的价值不是代码,是三个顺序问题:先收窄工具面,再关掉写操作,最后才谈判断规则。顺序错了,后面全白做。

在共享主机上跑 agent 的人。 软件层包装不是安全边界。它防模型犯错,不防服务本身被攻破。

三、怎么做一层受控包装

读到这儿,可以顺路看 Claude Max 改名 Ultra,五小时限制取消了 Anthropic 把 200 美元的 Max 20x 改名 Ultra,并给通过验证的账户去掉五小时会话上限,100 美元档简化为 Max。这篇讲清改了什么、谁真正受益、以及"取消限制"要打几折。
  1. 先决定它能看到几个动作。 例子里只留四个:列容器、看详情、读日志、重启指定容器。前三个只读,第四个是唯一写操作。
  2. 写操作默认关闭,靠显式开关打开。 开关没设置、拼错、或者容器镜像里默认关着,都等同于不允许重启。这一层要在连接 socket 之前判断,不能等发请求时再拦。
  3. 检查对象必须是引擎解析后的名字。 这是全文最容易漏的一点:agent 上一分钟列过容器,上下文里存着 ID,而 Docker 接受 ID、短 ID、任意唯一前缀。你写「不以 prod 开头就放行」,它传一个十六进制 ID,规则不匹配,生产库照样被重启。正确顺序是先用引用取到容器对象,再拿引擎返回的名字比对黑名单。
  4. 黑名单优先于白名单。 固定检查顺序:写开关、黑名单、可选白名单。即使白名单写成全放行,命中黑名单的容器仍被拦。
  5. 读接口按「会泄密」来设计。 容器详情里的环境变量是明文,连接串、key 常在里面。返回键名就够,值一律不给。日志接口则返回行号和命中位置,让模型能指着说第几行。
  6. 协议层别踩坑。 走标准输入输出时,标准输出属于协议本身,一行调试打印就能毁掉整个会话——日志一律走错误流,失败也当成正常返回值告诉模型。
  7. 把依赖主版本锁死。 作者踩过一次:依赖只写了下限,某天解析到新主版本,包名改了,构建直接挂。
  8. 生产环境再加一层硬边界。 在服务和引擎之间放一个只放行容器端点的代理,让 agent 指向代理而不是直连 socket;容器用非 root 跑,单独映射宿主 socket 的组权限。两者解决的是不同问题。

四、三个别信的说法

「加了只读标记就安全。」 只读只能防止容器替换或删除 socket 文件。能连上就意味着能发写请求,这是两件事。

「用正则挡掉 prod 前缀就够了。」 挡的是调用者传来的字符串,不是真实对象。ID、短 ID、前缀都能绕过。要挡就得挡引擎解析后的名字。

「给它全权限,提示词里写清楚别乱动就行。」 提示词是建议,不是权限。模型在上下文里带着容器 ID 时,把 ID 填进参数是最自然的动作。约束得写在代码里。

五、一句话结论

把它当 root 对待,只给它四个动作,然后按引擎解析后的名字决定放不放行。

信息来源

功能与价格以官方公告为准。本文写于 2026 年 10 月 22 日。

下一站 · 起步必读 Claude 自己选了基因疗法,给小鼠做脑手术 给它 19 个疗法和一个癫痫小鼠模型,它自己选药、定脑区、算坐标、盯着注射,中途还因校准错误拒绝继续。这篇讲清实验边界,以及拒绝那一下为什么比成功更值得看。
下一篇,直接发你邮箱

每周一封,只发新教程和可复制模板。不发广告,随时退订。

复制规范引用格式,便于转载注明出处
这篇有用吗?