拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

openClaw 安全配置实战:从 Gateway 到沙箱模式,一份可落地的 config.toml 骨架

openClaw 安全配置实战:从 Gateway 到沙箱模式,一份可落地的 config.toml 骨架 1. 为什么你的 openClaw 一上线就被盯上openClaw 是一个把大模型接入 IM 渠道、让它能读写文件、执行命令、调用外部工具的 Agent 框架。它能做什么简单说你给它一个飞书或 Telegram 机器人它就能帮你查资料、改代码、跑脚本。适合谁适合想把 AI 从聊天框里放出来、真正干活的开发者和运维。但问题也出在这里一旦它连上了公网、拿到了 shell 权限攻击面就不再是“模型会不会胡说”而是“别人能不能借它的手删你的库”。社区里关于 openClaw 不安全的讨论很多但大多停在“别暴露公网”“小心提示词注入”这种口号层面。真正缺的是一份能直接抄的配置骨架。我试过把 Gateway、沙箱模式、Docker 隔离这三块拆开配发现只要 config.toml 里几个关键项写错前面所有努力都白费。下面这份骨架你可以直接拿去改。先明确威胁模型入站访问陌生人给机器人发消息、工具影响提示词注入让 AI 执行非预期操作、网络暴露Gateway 端口裸奔、本地权限以 root 跑、插件风险恶意技能偷 Key。核心思路只有一句假设模型可以被操纵那就让操纵的影响范围有限。2. TaoToken 前置先把模型入口收进可控范围在配 openClaw 之前模型调用这一层也得收敛。很多人把 API Key 明文写在 config.toml 里一旦配置文件被读走Key 就泄露了。我的做法是统一走 TaoToken 的 API 入口Key 只放在环境变量里配置文件里只留引用。TaoToken 官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 。你需要在控制台生成 Key然后把它写进环境变量而不是写进任何会被 git 提交的文件。# 生成后只写入当前 shell 的环境变量不要 echo 到终端历史 export TAOTOKEN_API_KEYsk-你的key # 验证环境变量已生效只显示前 6 位 echo ${TAOTOKEN_API_KEY:0:6}如果你要长期跑编码类 Agent建议用 Coding Plan把模型调用和额度管理放在一起避免 Key 散落在多台机器上。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite API Keys 管理页是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 配 openClaw 的模型 provider 时对着文档填 base_url 就行。这一步的意义在于即使 openClaw 的配置文件被读攻击者拿到的也只是TAOTOKEN_API_KEY这个变量名而不是真实 Key。Key 的轮换和额度上限在控制台做比在每台机器上改配置文件靠谱得多。3. 可复制的 config.toml 骨架下面这份骨架覆盖 Gateway、沙箱、Docker 三块。注意openClaw 不同版本的字段名可能有差异以你本地openclaw --version对应的文档为准但结构逻辑是通用的。# ~/.openclaw/config.toml # 权限chmod 600属主为专用低权限用户 [gateway] # 只监听本地绝不写 0.0.0.0 host 127.0.0.1 # 改掉默认 18789避免被批量扫描 port 28796 # 必须开认证密码从环境变量读 auth_mode password auth_password ${OPENCLAW_GATEWAY_PASSWORD} # 反向代理场景下只信任本机代理 trusted_proxies [127.0.0.1] [sandbox] # 强制沙箱Agent 只能在 workspace 内活动 mode strict workspace /opt/openclaw/workspace # 禁止执行任意系统二进制 allow_system_binaries false # 禁止 shell 直通需要时再单独开 allow_shell false [heartbeat] # 除非明确需要自主循环否则关掉 enabled false [channels.telegram] # 私信只允许白名单pairing 和 open 都别用 dm_policy allowlist allowlist [123456789] # 群里必须 才响应 mention_required true [plugins] # 默认拒绝只放明确信任的 deny_all_by_default true allow [openclaw/fs-reader, openclaw/web-search] [logging] # 日志脱敏别把 token 写进日志 sanitize true sensitive_fields [api_key, password, token, secret, authorization] level normal几个容易写错的点host写成0.0.0.0等于把控制界面送给全网auth_mode留空等于没认证sandbox.mode写成off或permissive时allow_shell再一开Agent 就能在你机器上跑任意命令。plugins.deny_all_by_default是白名单模式的关键不写这行装了什么插件就跑什么插件。settings.json 里对应的是工具白名单放在 Agent 工作区{ allowed_tools: [ filesystem:read, browser:navigate, search:web ], denied_tools: [ filesystem:write, filesystem:delete, shell:execute ], require_confirmation: { file_delete: true, file_move: true, system_command: true, external_api_call: true } }allowed_tools只留完成任务必需的shell:execute默认禁掉。真要跑命令走require_confirmation里的二次确认而不是直接放开。4. 验证沙箱是否生效、Gateway 是否收敛配完不验证等于没配。下面这几条命令是我每次改完配置都会跑的。先看 Gateway 监听地址。如果输出里出现0.0.0.0:28796或*:28796说明 host 没生效回去改 config.toml。ss -tlnp | grep 28796 # 期望输出127.0.0.1:28796再验证认证是否真的拦住了未授权请求。不带密码直接请求应该返回 401 或 403而不是 200。curl -i http://127.0.0.1:28796/health # 期望HTTP/1.1 401 Unauthorized验证沙箱让 Agent 尝试写一个 workspace 之外的文件应该被拒绝。你可以通过模型对话发一条指令测试模型对话入口在 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite 。如果它成功写到了/tmp或/etc说明沙箱没生效。# 检查沙箱进程的挂载和权限 ls -ld /opt/openclaw/workspace # 期望drwx------ openclaw openclawDocker 部署的话用下面这份 compose 做隔离。关键项是read_only、cap_drop: ALL、no-new-privileges以及端口只绑127.0.0.1。services: openclaw: image: openclaw:latest user: 1000:1000 read_only: true cap_drop: - ALL security_opt: - no-new-privileges:true ports: - 127.0.0.1:28796:28796 volumes: - ./data:/data:ro - ./logs:/logs:rw deploy: resources: limits: cpus: 2 memory: 2G跑起来后用docker inspect确认ReadonlyRootfs是 trueCapDrop包含 ALL。docker inspect openclaw_secure --format {{.HostConfig.ReadonlyRootfs}} {{.HostConfig.CapDrop}} # 期望true [ALL]最后跑一次内置审计让它自动修可修的问题openclaw security audit --deep openclaw security audit --fix审计会检查入站策略、工具范围、网络暴露、文件权限、插件安全。如果它报gateway.host过宽或sandbox.mode不是 strict别跳过回去改。5. 本篇常见错排查报错一gateway auth failed: password not set原因auth_password引用的环境变量没导出或者变量名拼错。检查echo $OPENCLAW_GATEWAY_PASSWORD是否有值注意 config.toml 里用的是${VAR}语法不是$VAR。报错二沙箱模式下 Agent 报permission denied但任务本该能跑原因workspace路径权限不对或者allow_system_binaries false把必需的工具也禁了。先chmod 700workspace再确认任务需要的工具在allowed_tools里。别为了省事把allow_shell打开。报错三Docker 里 openClaw 启动即退出日志显示read-only file system原因read_only: true后需要写的目录没单独挂载。把日志、缓存、session 目录用:rw挂出来数据目录用:ro。别直接把根文件系统改成可写。报错四改了端口但ss还是显示旧端口原因openClaw 没重启或者有旧进程占着。pkill -f openclaw后重新openclaw start再ss -tlnp确认。报错五插件装了但没生效日志说plugin denied原因deny_all_by_default true时插件必须在allow列表里。把插件名完整写进去注意 scope 前缀比如openclaw/fs-reader不能简写成fs-reader。报错六API Key 在日志里出现明文原因logging.sanitize没开或者sensitive_fields没覆盖到你的字段名。把 Key 相关的字段名都加进去然后openclaw security audit --fix会帮你检查日志权限。6. 把安全变成日常动作配完这一套你的 openClaw 至少做到了Gateway 只监听本地、有认证、端口非默认沙箱强制开启、工具白名单、高危操作要确认Docker 只读根文件系统、去掉所有 capability、禁止提权。但安全不是一次性的是日常动作。每周跑一次openclaw security audit --deep看有没有新开的端口、新装的插件、权限变宽的目录。API Key 在 TaoToken 控制台设月度额度上限防止失控消耗。模型调用统一走 https://taotoken.net/api Key 只放环境变量配置文件权限锁 600。如果你还在用默认端口、默认监听、默认权限那确实不安全。但按上面这份骨架配一遍你就已经比大多数“养虾人”稳了。最后一句不存在完美安全的设置只有持续收敛的配置。从最小权限开始需要什么再开什么别反过来。
返回列表