Install
openclaw skills install @sinnzen/permission-guard分层权限守卫系统。基于 Claude Code Permission System 设计,包含危险命令拦截、规则优先级链、自动模式白名单和拒绝追踪。
openclaw skills install @sinnzen/permission-guard分层权限守卫 — 基于 Claude Code Permission System。
让 AI 在执行敏感操作前进行安全检查,防止意外破坏用户系统。
AI 执行命令时,怎么保证不干坏事?
错误做法:
正确做法: 分层权限 + 智能分类 + 自动拦截危险操作
| 模式 | 行为 | 适用场景 |
|---|---|---|
| default | 每个命令确认一次 | 初始学习阶段 |
| auto | 信任的自动,不信任的询问 | 日常开发 |
| plan | 每次都问(Plan Mode) | 审查阶段 |
| bypass | 完全不确认 | ⚠️ 危险,仅测试用 |
| dontAsk | 直接拒绝 | 受限环境 |
cliArg(命令行参数)
↓
session(当前会话)
↓
localSettings(本地配置)
↓
projectSettings(项目配置)
↓
userSettings(用户配置)
↓
policySettings(企业策略)
企业策略 > 用户设置,企业可以锁定权限配置。
// 代码执行解释器
python, python3, node, deno, ruby, perl, php
npx, npm run, yarn run, pnpm run, bun run, bunx
// Shell
bash, sh, zsh, fish, ssh
eval, exec, xargs, sudo
// 管道执行
curl | bash, wget | sh
// 自动拒绝宽泛规则
Bash(python:*) → 拦截,等于允许任意代码执行
Bash(node:*) → 拦截
Bash(curl:*) → 拦截,可能用于下载恶意脚本
可在配置中添加:
{
"dangerousCommands": [
"rm -rf /",
"dd if=* of=/dev/*",
":(){ :|:& };:" // Fork bomb
]
}
auto 模式下自动允许的安全命令:
// Git 读取操作
git status, git diff, git log, git show, git branch
git diff --staged, git diff HEAD, git remote -v
// 文件读取
ls, ll, cat, head, tail, grep, find, pwd
// 目录操作
cd, mkdir -p, tree, stat, file
// 开发工具
npm --version, node --version, git --version
python3 --version, docker ps, docker images
// 网络检查
ping, curl -I, wget --spider
{
"tool": "Bash",
"command": "git push origin main",
"behavior": "allow"
}
:* 语法){
"tool": "Bash",
"command": "git:*",
"behavior": "ask"
}
{
"tool": "Bash",
"command": "git commit *",
"behavior": "allow"
}
{
"tool": "Bash",
"command": "rm *",
"cwd": "/Users/julian/project",
"behavior": "allow"
}
// 追踪每个命令被拒绝的次数
denialTracking = {
'rm -rf node_modules': { denyCount: 3, lastDeny: timestamp },
'git push': { denyCount: 5, lastDeny: timestamp }
}
// 如果 denyCount > 阈值 → 给出建议
if (denyCount >= 3) {
suggest("建议将此命令加入白名单或调整规则")
}
// 连续失败 3 次 → 降级到询问模式,不阻塞
if (consecutiveFailures >= 3) {
fallbackToAsk()
}
问题: 高优先级规则可能"遮住"低优先级规则。
// 用户设置了: git push → allow
// 项目设置了: git * → deny
// 结果:git push 被 deny,但用户不知道为什么
// 检测并警告
shadowedRules = detectShadowedRules(userRules, projectRules)
if (shadowedRules.length > 0) {
warn("以下规则被覆盖:\n" + shadowedRules.map(...).join("\n"))
}
// 执行前扫描命令
scanForSecrets(command) → {
detected: [
{ type: 'api_key', pattern: 'sk-[a-zA-Z0-9]{20,}', value: '***' },
{ type: 'password', pattern: '-p\\s+\\S+', value: '***' },
{ type: 'private_key', pattern: '-----BEGIN.*PRIVATE KEY-----', value: '***' }
]
}
// 如果检测到 → 拒绝执行并警告
用户请求执行命令
↓
解析命令和工具
↓
检查危险命令黑名单
├── 是 → 自动拒绝 + 警告
└── 否 → 继续
↓
匹配规则(按优先级)
├── 有匹配规则 → 按规则执行
└── 无匹配 → 进入自动模式
↓
自动模式分类
├── 白名单 → 自动允许
├── 黑名单 → 自动拒绝
└── 其他 → 询问用户
↓
用户响应 → 记录到规则/拒绝追踪
// Pre-execution hooks
preCheck = [
dangerousPatternHook, // 危险模式检测
ruleMatchingHook, // 规则匹配
secretScanningHook, // 敏感信息扫描
sandboxHook // 沙箱检查
]
// Post-execution hooks
postCheck = [
logPermissionResult, // 记录到日志
updateAutoModeRules, // 更新自动模式规则
denialTracking // 更新拒绝计数
]
{
"defaultMode": "auto",
"dangerousCommands": [
"rm -rf /",
"rm -rf /home/*",
":(){ :|:& };:"
],
"autoAllow": [
"git status",
"git diff",
"npm test"
],
"autoDeny": [
"curl | bash",
"wget -O- | sh"
],
"rules": [
{
"tool": "Bash",
"command": "git push",
"behavior": "ask"
},
{
"tool": "Bash",
"command": "npm run deploy",
"behavior": "ask"
}
]
}
必须进行权限检查的场景:
sudo 的命令🔐 Permission required
Tool: Bash
Command: git push origin main
Reason: 即将推送到远程仓库
[Allow] [Deny] [Don't ask again] [Configure rules]
✅ Auto-allowed: git status
(匹配自动模式白名单)
🚫 Auto-denied: rm -rf /*
Reason: 危险命令,已拦截
❌ 不要在未检查权限的情况下执行删除操作
❌ 不要执行包含敏感信息(API keys、密码)的命令
❌ 不要忽略危险命令拦截
❌ 不要在 bypass 模式下执行非测试操作
❌ 不要让 curl | bash 类型的命令通过
❌ 不要执行 eval 类型的动态代码命令