Clawdbot:从“史诗级 AI 助手”到“公网肉机”只差一个 18789。。。
昨天晚上十一点多吧,我在公司楼下抽烟,冻得手都麻了,我们组那个小李就来一句“你看下这个 clawdbot,最近挺火”,我当时还以为又是什么套壳机器人……
结果我点开 repo 看了两眼,哎这玩意儿还真不一样,它不是那种“你问一句它回一句”的客服模型,它更像……怎么说呢,一个“你自己电脑里的远程小助理”,但是入口是聊天软件,你在手机里发消息,它在你那台机器上真能动手干活。
Clawdbot 大概是这么个路子:你把它跑起来之后,它中间有个 gateway,左边接各种聊天入口(Telegram/Slack/Discord 这些,反正就是你平时用来聊天的通道),右边接你本机的工具链——shell 命令、文件读写、浏览器自动化、定时任务、workspace 里的脚本之类。也就是说,你一句“帮我拉下代码跑下测试”,它不是回你“建议你这么做”,它是真的在那台机器上把命令跑了,然后把结果回到聊天里。你听着挺爽对吧,但我说实话我当时心里就有点发毛,因为这等于“聊天入口 → 本地高权限工具”被你打通了。
我先说部署,我自己习惯是能少花哨就少花哨,尤其这种带权限的东西,别上来就全开。正常部署大概两条路:本机/专机直接跑,或者 Docker 跑。
本机/专机这条,核心就几个点:Node 版本别太老(它对版本要求挺高的),然后装 CLI,跑 onboarding,装成常驻服务。你照着这么干一般就起来了:
# Node 版本建议新一点,别 16/18 那种
npm install -g clawdbot@latest
# 跑引导 + 安装守护进程(让它开机常驻)
clawdbot onboard --install-daemon
# 你想看 gateway 起没起可以开 verbose
clawdbot gateway --port 18789 --verbose
端口这里你注意下,它默认就喜欢用 18789(这个数字你后面会懂我为啥一直念叨)。Control UI 基本就是浏览器开本机地址看配置,channel、workspace、skills 这些都在里面配,属于“向导把你领进门”的那种。
Docker 这条我就一句话:更隔离,但也更容易把端口一不小心映射出去。一般仓库里会有脚本帮你一键把镜像 build、compose 拉起来、再走一遍 onboarding。你跑完它会让你打开 127.0.0.1:18789,然后把 token 贴进控制台里那种。大概长这样:
# 在 repo 根目录
./docker-setup.sh
# 然后本机浏览器开
# http://127.0.0.1:18789/
我插一句,很多人现在喜欢拿个小主机或者 Mac mini 专门跑它,不是装逼哈,是图个边界清晰:这台机子就干 agent 的活,别跟你日常办公/网银/密码管理器混一块。你把风险域隔开了,心态会好很多。
好,重点来了,你前面说你手痒上 Shodan 一搜,看到公网暴露一堆 gateway,端口 18789,甚至零鉴权……
我看到这种我也是“心里一咯噔”。因为这东西的危险不是“它暴露了一个 API”,而是暴露了“一个能被远程指挥去动你电脑资源的入口”。你想象下:它能跑 shell、能读文件、还能开浏览器,那别人拿到的不是接口权限,拿到的是“你这台机器的手和眼”,顺便还可能把你塞进去的 API key、环境变量、配置文件一起带走。这个就不是“数据泄露”那么轻飘飘的词了,有时候是直接把你当跳板机用。
我不讲吓人故事哈,直接讲最小防御,你现在就能改的那种,别搞成大工程。
第一条,gateway 监听范围先收回来,能只听 localhost 就别听 0.0.0.0。你记住一句土话:端口只要出公网,就是给全世界写了“来试试我”。所以要么只监听 127.0.0.1,要么只在内网网段监听(公司内网也得分段哈,不是说内网就安全),公网层面直接防火墙 drop 18789 入站。这个最硬核,成本最低,收益最大。
比如你自己写个 systemd/启动参数,别让它绑到全网:
# 示意:只给本机访问
clawdbot gateway --host 127.0.0.1 --port 18789
如果你用 Docker,注意不要写这种:
# 这玩意儿很容易把你坑死(示意)
ports:
-"18789:18789"
你真要映射,也尽量绑本机回环:
# 只让本机访问(示意)
ports:
-"127.0.0.1:18789:18789"
第二条,必须加认证,别偷懒。最少也得 token 校验,最好再套反代 + TLS(https),再加签名或者 basic auth 之类。你别觉得“我就自己用”,这句话是事故现场最常见的一句,真的。
我给你个超粗暴的 token 例子,你随便换成你自己的配置方式就行,核心意思就一个:没有 token 别想进控制面。
// 伪代码示意:网关入口先验 token(你可以在反代层做也行)
functionauth(req, res, next) {
const token = req.headers["x-gateway-token"];
if (!token || token !== process.env.GATEWAY_TOKEN) {
res.statusCode = 401;
res.end("Unauthorized");
return;
}
next();
}
第三条,日志和告警别当摆设。你至少做到两件事:access logs 开着,定期翻;再加个“异常请求次数/未知 IP/失败鉴权”的告警。你别笑,这个能救命。很多人不是被黑了才知道,是日志里早就有人在敲门,你没看而已。
第四条,密钥别写进配置文件、别写进仓库、别贴进聊天里。就用环境变量或者密钥管理(哪怕你用个最土的方式:系统 keychain、vault、k8s secret 都行)。你一旦把 key 写死在文件里,工具链又能读文件,那就是“顺手牵羊”。
# 环境变量方式(示意)
export OPENAI_API_KEY="..."
export GATEWAY_TOKEN="$(openssl rand -hex 32)"
第五条,权限收紧,真别一口气把所有工具全开。你可以给它分层:日常 agent 只读,不给 exec;需要执行命令的时候单独开一个“运维 agent”,而且最好加二次确认,敏感动作比如 rm、curl 外连、读 ~/.ssh 这种,直接弹确认,不确认就不做。
我给你一个“最小权限”的工具白名单思路,写成一个很土的配置示意,你照着你自己的框架改:
{
"agent": "daily",
"tools": {
"allow": ["read_file", "list_dir"],
"deny": ["exec_shell", "write_file", "browser"]
},
"confirm": {
"dangerous": ["exec_shell", "write_file", "browser"],
"mode": "always"
}
}
你看这个意思就很直白:平时它只能看,不能动刀。你真要它动刀,那就换 agent 或者临时提权,并且你人得在场点确认。
最后一条,也是我自己现在最推荐的:专机部署 + 最小权限用户运行。别用你日常管理员账号跑,把它当服务跑在一个单独系统用户下,home 目录权限收紧,workspace 单独放一个目录,能不给它碰你真实 home 就别给。你把它的“可见范围”缩小了,哪怕真出事,损失也能被限住。
反正我现在的态度就是:Clawdbot 这东西确实酷,真能把“聊天入口”变成“操控你本地工具”的遥控器,但你千万别让“方便”变成你最薄的那块护甲。哦对了,我刚才说到哪了……算了,我先去把我那台测试机的 18789 端口再确认一遍,我这会儿想到“万一公网开着”就有点犯恶心了,等下小李又要来催我 review 代码了。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html