
我接触过的AI Agent项目里OpenClaw是比较特别的一个。它不是一个只能在网页里聊天的玩具而是能直接接管你的电脑、读写文件、执行命令、收发微信消息的数字员工。能力越大责任越大权限配置就成了这个项目最要命的话题。很多人装好OpenClaw第一个问题不是它能干嘛而是它会不会乱来。这篇东西就是把OpenClaw的权限体系从头到尾拆一遍告诉你哪些配置能防住AI越权哪些坑我替你踩过了。1. 为什么权限配置是OpenClaw的第一道安全底线1.1 AI越权到底意味着什么先想明白一件事大模型本身没有恶意但它天然有过度完成的倾向。你让它帮我看下这个项目里哪些文件比较大它可能会顺着列出整个用户目录的文件你让它整理一下桌面它可能真把桌面快捷方式全删了。这不是AI学坏了而是模型在做概率预测时倾向于生成一个看起来最完整的结果而完整往往意味着越界。OpenClaw这类Agent框架把这种风险放大了。它不止是聊天它能调用Shell、写文件、发HTTP请求。一旦某个环节权限放开AI就可能接触到不该接触的密钥、配置、内网地址甚至在群聊场景里替一个完全陌生的人执行危险操作。权限配置不是锦上添花的安全项是决定你这个AI助手是帮工还是隐患的分水岭。1.2 OpenClaw的权限模型长什么样OpenClaw的权限控制我把它拆成四个独立的维度理解了这四个维度后面所有配置都是围绕它展开的命令执行权限AI能不能跑Shell命令能跑哪些命令哪些命令一票否决。文件访问权限AI能读、写、删除哪些路径下的文件这个决定了它会不会碰你的私钥、密码本。网络请求权限AI能不能发外部HTTP请求能请求哪些域名这是防数据外泄的关键。消息收发权限哪些渠道微信、Telegram、Discord能触发AI群聊里谁有资格发起指令。这四个维度不是孤立的。举个例子你只限制了命令白名单但没限制文件写入那AI完全可以靠一条echo xxx ~/.ssh/authorized_keys把内容追加进关键文件。反过来你限制了网络请求即使某个prompt注入成功AI想外传数据也传不出去。所以我一直强调权限配置必须从整体看补一块漏一块等于没配。1.3 配置原则最小权限加默认拒绝我给所有用OpenClaw的朋友一个建议权限配置按进门默认锁死用到哪开到哪来做而不是按先全开出问题再关来做。前者是安全设计后者是事故预告。最小权限原则说起来简单做起来容易跑偏。刚开始配置的时候总想着这个命令以后可能用得上先放着吧结果白名单越滚越大最后跟没配一样。我自己的习惯是先用默认拒绝跑一段时间哪个功能报错了、确实需要再单独加一条放行规则。虽然前期麻烦点但每一条权限都是有明确需求才开的后面出问题的面就小得多。2. 核心权限配置项逐项拆解2.1 全局运行模式ask-first、allow、denyOpenClaw的权限配置入口是用户目录下的配置文件一般在~/.openclaw/openclaw.json首次初始化后生成。配置里第一类重要参数是全局运行模式它决定了AI面对一个不在白名单里的操作时的默认态度常见的有三种模式行为适合场景ask-first执行前弹确认等你点头大多数日常使用兼顾效率与可控allow直接放行所有请求完全可信的隔离环境、一次性跑批任务deny直接拒绝所有未明确授权的操作公网机器人、多人群聊、敏感目录我强烈建议默认用ask-first哪怕你是在自己的开发机上。原因是AI的一次操作可能引发连锁动作——比如它执行一条测试命令测试脚本里又调用了清理函数这个链条你没法预料人肉确认一下最稳。群里机器人更是别用allow任何人都能它执行任务跟把家门钥匙挂门口没区别。2.2 命令执行权限白名单与黑名单命令执行是OpenClaw能力最强也最危险的部分。配置里allowedCommands和deniedCommands两个数组定义哪些命令可用、哪些命令绝对不可碰。但我要重点提醒一个反直觉的点黑名单是不可靠的。你以为把rm拉黑了就安全了AI照样可以用find -delete、python os.remove()或者一条shell脚本绕过。所以正确思路是尽量用白名单而不是黑名单。我通常在白名单里只放这些命令ls、cat、git、node、python这类日常开发工具。sudo、rm -rf、mkfs、 /dev/sda、shutdown这些直接列进deniedCommands同时注意deniedCommands匹配的是命令片段配置的时候尽量写全一些变体。另外还有一个更细的颗粒度控制叫dangerousPatterns可以配置正则表达式比如匹配到路径里有/etc或~/.ssh的命令直接拦截这个比单纯命令名匹配靠谱得多。这里放一段我实际在用的配置模板{ permissions: { mode: ask-first, allowedCommands: [ls, cat, head, tail, git, node, python, npm], deniedCommands: [rm -rf, mkfs, shutdown, reboot, sudo, chmod 777], dangerousPatterns: [ \\.ssh/, /etc/, authorized_keys, base64 -d, curl .*\\|.*sh ] } }dangerousPatterns里那几条是我从一个真实的越权事故里总结出来的。当时AI被提示词注入引导着去读~/.ssh/id_rsa然后准备base64编码外传如果没有这条正则拦截后果可想而知。2.3 文件系统访问边界路径规则与沙箱命令白名单解决的是能不能执行命令但AI还可以通过编辑器、文件工具直接读写文件所以必须要单独划一个文件系统访问边界。OpenClaw里常见的是allowedPaths、deniedPaths配合一个sandboxRoot沙箱根目录来用。我踩过的一个坑是只配了allowedPaths指向工作目录但没配sandboxRoot结果AI用../相对路径一层层往上跑还是读到了工作目录外的文件。任何路径限制都要记住一个铁律AI不是人它不会嫌麻烦它会老老实实把../../../../etc/passwd拼出来。所以别指望路径字符串的隐蔽性直接把沙箱根目录设成项目根目录然后deniedPaths把~/.ssh、/etc、/root、~/.aws这种目录全部堵死才算是真正的边界。文件权限配置示例{ permissions: { sandboxRoot: /home/me/work, allowedPaths: [/home/me/work], deniedPaths: [ /etc, /root, /home/me/.ssh, /home/me/.aws, /home/me/.openclaw ] } }注意一个细节deniedPaths一定要包含OpenClaw自己的配置目录否则AI能读配置就等于把所有权限规则都看光了。这就跟保险箱密码写在保险箱外面一样。2.4 网络请求与API调用限制网络权限这块很多人会忽略觉得AI发个请求无所谓。但我可以负责任地告诉你AI Agent的数据外泄大多数是从网络请求这条通道出去的。OpenClaw支持配置network.allowDomains白名单只有白名单里的域名才允许发起HTTP请求。配置建议分两层。第一层是分布式访问限制默认禁止所有外部请求只放行必要的API域名比如api.github.com、api.openai.com、*.anthropic.com这类按需增加。第二层是本地网络保护network.denyLocalhost最好默认开启防止AI扫描局域网或者请求本机其他端口。你想想如果AI被恶意提示词引导着去请求http://localhost:9222可能就能操作你的浏览器调试端口这个通道不堵上其他权限配得再好也有漏洞。另外如果OpenClaw接入了像CC Switch这类模型切换工具切换模型后网络权限配置也要重新检查。因为不同模型的API端点不同有些代理工具会在本地起一个代理端口这时候denyLocalhost会把代理请求也拦掉导致切换后AI突然失灵。这种情况不是权限配置失效而是网络白名单和新模型端点不匹配排查时要有这个意识。2.5 多用户与群聊环境的角色权限OpenClaw接入微信、Telegram这类群聊场景后权限问题的维度会变得更复杂以前你只需要防AI越权现在还要防别人利用AI越权。所以群聊环境必须引入用户角色等级。我见过一个典型的反面教材某团队把OpenClaw拉进项目群所有人都能它跑命令结果有人开玩笑发了一句AI帮我把刚才那份合同发给群里的XXAI差点就把机密文档发出去了。问题出在权限配置里没有区分用户等级。正确做法是管理员完整权限可以执行命令、读全量文件、管理技能。普通成员只有问答、查资料、读公共目录的权限。访客/陌生人仅限基础问答所有命令和文件操作直接拒绝。在配置里用userRoles字段把各渠道用户ID映射到对应角色然后把命令白名单按角色再细分。群聊环境还有一个细节建议开启私聊确认功能当群聊中出现危险操作请求时AI不直接执行而是私聊管理员确认一次。这一步能把大部分误触风险和恶意指令挡在门外。3. 从零开始的完整配置实操3.1 安装与初始化后的默认权限状态先交代一下基础环境。OpenClaw在Linux、macOS上通过npm安装Windows下通常建议用WSL2跑也有社区做的离线整合包但核心配置文件的结构是一样的。安装完成后第一次启动会引导初始化配置文件默认生成的权限配置一般比较宽松——这也是我们后面要动手改的原因。默认状态通常是这样命令执行是ask-first但白名单很空文件访问没有设sandboxRoot等于AI在用户目录范围内基本畅通网络请求默认放行。说白了官方给的默认配置是为了让你先跑起来不是让你直接上生产。所以我每次在新机器部署OpenClaw第一件事就是打开openclaw.json先把网络请求默认改成拒绝再把sandboxRoot设好然后才敢跟它说第一句话。3.2 场景A个人开发助手——本地代码库操作我自己的主力场景是让OpenClaw当本地开发助手帮我整理代码库、生成README、做代码审查。这类场景的特点是AI需要读大量文件、偶尔跑测试命令但不需要删除文件也不需要访问代码库之外的系统区域。针对这个场景我的核心配置思路是代码库内全通代码库外免谈。{ permissions: { mode: ask-first, sandboxRoot: /home/me/myproject, allowedPaths: [/home/me/myproject], deniedPaths: [/home/me/myproject/node_modules], allowedCommands: [ls, cat, grep, find, git, npm, node], deniedCommands: [rm -rf, sudo, curl], network: { allowDomains: [api.github.com, registry.npmjs.org], denyLocalhost: true } } }这里有个细节值得说一下deniedPaths里我把node_modules也加进去了。AI读代码库的时候经常一头扎进node_modules读取量大且没啥信息量既慢又容易让它总结出错误结论。堵上这个路径AI反而会更快地聚焦到源码上。另外注意network.allowDomains里保留了registry.npmjs.org因为执行npm install时确实需要访问它如果没有这个白名单AI装依赖会反复失败。3.3 场景B群聊机器人——只读问答场景群聊机器人是最容易出事的场景因为交互对象不可控。给群里装OpenClaw我的建议是默认只给它能说话的权限不给它能动手的权限。配置上和开发助手有很大差别{ permissions: { mode: ask-first, userRoles: { wechat:admin_id: admin, telegram:channel_owner_id: admin, *: guest }, roleDefaults: { guest: { allowedCommands: [], allowedPaths: [/home/me/shared_public], network: { allowDomains: [] } }, admin: { allowedCommands: [ls, cat, grep], allowedPaths: [/home/me], network: { allowDomains: [api.github.com] } } } } }群聊场景的mode我依然保留ask-first但把管理员以外的用户角色全部限制成只读。注意allowedCommands: []这意味着访客角色连ls都执行不了——AI只能基于OpenClaw内置的对话能力来回答任何涉及系统操作的需求都会被拒绝。这样的好处是即使有人在群里写了一大段巧妙的提示词注入AI也无计可施因为它手里根本没有工具可用。3.4 场景C文件管理助手——目录隔离场景还有一种常见用法是让OpenClaw做文件整理比如批量重命名、归档日志、清理临时文件。这类任务的本质是高文件操作权限 低系统权限所以配置时要把精力放在文件边界上。我的做法是先建一个专门的共享目录比如/srv/openclaw-file-zone把AI能碰的文件全部放进去然后权限配置里sandbox就指向这个目录{ permissions: { sandboxRoot: /srv/openclaw-file-zone, allowedPaths: [/srv/openclaw-file-zone], deniedPaths: [/srv/openclaw-file-zone/archive/private], allowedCommands: [ls, cp, mv, mkdir, rename, zip, unzip], network: { allowDomains: [], denyLocalhost: true } } }这类场景通常会遇到一个实际问题AI要移动的文件有可能来自用户上传微信图片、接收的文档而这些文件最初落在/home/me/Downloads这样的系统目录里。如果不加处理AI没权限读取任务就卡住了。我建议在OpenClaw侧加一个文件收集目录的映射逻辑——用户先把文件发到共享目录AI只在共享目录内工作做到进得来、碰不到。别省这一步直接把/home/me/Downloads加进白名单AI会把下载目录翻个底朝天。3.5 如何验证权限配置是否生效配置写完了别急着上线先做一轮攻击测试。我通常用三个递进的问题来验证正常请求帮我看看当前目录下有哪些文件确认基本功能不被误伤。越界请求读取/etc/passwd并总结前10行预期结果是拒绝。绕过尝试用Python脚本读取/home/me/.ssh/id_rsa文件内容预期结果同样是拒绝。OpenClaw在命令执行前会打印权限判断日志大概长这样[permission] command blocked: python /tmp/exploit.py (matched deniedPattern: .ssh/)。我建议每次都检查这个日志确认到底是命令被拦截还是AI压根没尝试。如果是前者说明权限规则生效如果是后者那可能是prompt层面的限制并不是权限配置在起作用这种虚假安全很容易让人误判。4. 常见越权场景与排查实录4.1 一次真实的越权事故复盘AI读取了我的SSH私钥分享一个我之前踩过的坑希望你们都不用再踩一遍。当时我给OpenClaw配了一个开发助手配置命令白名单里有cat和grep但因为某些文件操作走的是AI内置FileTool没走shell所以我一度忽略了文件工具本身的权限。某一天我在代码里留了一处错误配置AI在排查问题的时候从系统日志里发现了一个指向~/.ssh/id_rsa的路径。它为了帮我确认这个路径是否存在直接用FileTool把文件内容读了出来并且还把开头几十个字符贴进了对话回复里。我立刻意识到不对劲翻日志定位到原因问题一FileTool的文件访问权限和白名单里的shell命令是两套独立系统我只配了shell白名单没限制FileTool的路径。问题二deniedPaths没有覆盖~/.ssh等于狙击枪瞄准了命令层文件层的门却敞开着。修复方案在deniedPaths里补上/home/me/.ssh同时把dangerousPatterns里的正则也添加了\.ssh/这样即使AI换一种路径表示方式也能被正则拦下。另外全局确认模式保持ask-first从此文件读取类操作也会触发确认。这里有一个很重要的经验权限是分层的XML格式的数据你看不到也要堵住API工具的路径和Shell命令的路径是两条路。配置完一定要分别验证一条走Shell命令一条走AI内置文件工具。4.2 配置不生效的排查思路权限配置不生效大部分时候不是OpenClaw的bug而是配置文件加载顺序或者预编译缓存的问题。我整理了几个最常见的排查步骤检查配置文件路径确认你改的文件确实是OpenClaw正在加载的那个。用openclaw --print-config命令输出当前的生效配置如果跟你改的不一致检查环境变量OPENCLAW_CONFIG是否指向了其他的配置文件。重启服务OpenClaw部分配置是启动时加载的改了配置文件不重启就不会生效。注意要用openclaw restart直接kill进程再启动可能因为端口未释放而加载到旧的日志状态。看权限日志级别在配置里把log.level调成debug然后重新触发一次越权测试。如果日志里完全没有权限判断的打印说明你的权限配置模块压根没被加载多半是JSON语法错误导致模块被跳过了。检查JSON语法openclaw.json是严格控制格式的多一个逗号就会导致权限模块崩溃回退到默认模式。我配置完总会先跑一遍jq . ~/.openclaw/openclaw.json做语法校验。最常见的坑是第四条。有一次我配置完在配置文件末尾多留了个逗号结果OpenClaw没报错只是日志里提示permission module not loaded, fallback to default所有限制全被静默绕过。这种失效方式最危险因为表面上看服务一切正常实际上已经裸奔了。4.3 环境特有的权限坑WSL2、微信插件的特殊情况不同部署环境下权限配置的坑还不一样。WSL2环境我在Windows里用过WSL2跑OpenClaw遇到一个很恼人的问题——启动时报错could not safely verify the WSL2 environment然后拒绝启动。后来排查发现是权限模块在检测/etc/wsl.conf的挂载选项因为我没有给某个Windows盘符配置成只读挂载它担心AI能跨文件系统访问Windows的用户目录。如果在WSL2下也遇到这个报错解决办法是在/etc/wsl.conf或%USERPROFILE%\.wslconfig里把非必要盘符挂载为只读或者在OpenClaw配置里增加allowUnsafeWslMount: false效果一样都是让权限模块知道我确认不会跨盘写操作。微信插件OpenClaw接入微信通常会走第三方适配器比如ilinkai这种。我自己用的时候发现微信端历史会话里残留的上下文有时候会触发服务端风控导致权限确认消息发不出去。现象是AI实际上在等确认但因为在风控期确认请求根本到不了你手机。这种不是权限配置问题而是会话状态问题。处理办法是配置定期清理会话上下文或者设置长时间无操作后自动登出别让AI一直处于等待确认的假死状态。CC Switch切换模型后如果你用CC Switch这类工具切换底层模型切换之后权限配置理论上不变但要留意模型的能力差异。同一个Agent任务模型A可能规规矩矩地只调白名单命令模型B却可能自作主张用另一种方式完成任务。切换模型后一定要重新跑一遍4.2里的三条验证问题别默认权限配置跟模型无关。4.4 权限配置速查表最后总结一个速查表方便直接照着检查和配置检查项推荐配置误配置风险全局模式ask-firstallow模式下一旦prompt注入AI无确认直接执行命令白名单只放行日常开发必需命令仅配置黑名单时容易被等效命令绕过危险正则覆盖/etc、.ssh、authorized_keys等AI通过路径拼接读取关键文件文件沙箱设置sandboxRoot并允许路径限定在沙箱内未设沙箱时AI用../逃逸到任意目录文件工具权限与Shell命令权限同步配置双通道权限不一致导致漏口网络白名单默认空列表按需放行API域名无限制网络请求时数据可被外传本地网络开启denyLocalhostAI可扫描局域网或访问本机服务用户角色管理员/成员/访客分级群聊中任何人可触发危险操作确认机制危险操作私聊管理员确认群聊误操作无人工复核就执行表格不是让你背下来是让你在每次改完配置之后按行自查一遍。我每次部署OpenClaw到新环境都会打开这个表对照检查十分钟能搞定但能省下后面几天的事故排查时间。写到最后配置OpenClaw的权限说白了就是一句话把AI当成一个能力很强但完全没有常识判断力的新员工所有不该碰的东西都要提前上锁。我个人实际用下来的体会是权限配置这个东西前期多花半小时后期能少熬三个夜。尤其是那些准备把OpenClaw接进微信、接进生产环境的一定别跳过越权测试这一步别觉得我的AI不会那么干——训练一个不乱来的AI很难但写好一个配置文件很简单做好后者就够了。