498 lines
9.9 KiB
Markdown
498 lines
9.9 KiB
Markdown
|
|
# SafeExec 详细文档
|
|||
|
|
|
|||
|
|
> 完整的使用指南、配置说明、开发文档和常见问题
|
|||
|
|
|
|||
|
|
**主文档:** [README.md](README.md) | **变更日志:** [CHANGELOG.md](CHANGELOG.md)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📑 目录
|
|||
|
|
|
|||
|
|
- [使用指南](#使用指南)
|
|||
|
|
- [工作原理](#工作原理)
|
|||
|
|
- [批准工作流](#批准工作流)
|
|||
|
|
- [风险等级详解](#风险等级详解)
|
|||
|
|
- [全局控制](#全局控制)
|
|||
|
|
- [高级配置](#高级配置)
|
|||
|
|
- [环境变量](#环境变量)
|
|||
|
|
- [自定义规则](#自定义规则)
|
|||
|
|
- [非交互式模式](#非交互式模式)
|
|||
|
|
- [开发文档](#开发文档)
|
|||
|
|
- [架构设计](#架构设计)
|
|||
|
|
- [文件说明](#文件说明)
|
|||
|
|
- [API 参考](#api-参考)
|
|||
|
|
- [贡献指南](#贡献指南)
|
|||
|
|
- [常见问题](#常见问题)
|
|||
|
|
- [故障排查](#故障排查)
|
|||
|
|
- [最佳实践](#最佳实践)
|
|||
|
|
- [性能优化](#性能优化)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 使用指南
|
|||
|
|
|
|||
|
|
### 工作原理
|
|||
|
|
|
|||
|
|
SafeExec 通过以下步骤保护你的系统:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
1. 命令拦截
|
|||
|
|
↓
|
|||
|
|
2. 模式匹配
|
|||
|
|
↓
|
|||
|
|
3. 风险评估
|
|||
|
|
↓
|
|||
|
|
4. 决策
|
|||
|
|
├── 安全 → 直接执行
|
|||
|
|
└── 危险 → 请求批准
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 架构组件
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
~/.openclaw/safe-exec/
|
|||
|
|
├── pending/ # 待处理的批准请求
|
|||
|
|
│ └── req_*.json # 请求详情文件
|
|||
|
|
├── safe-exec-rules.json # 规则配置文件
|
|||
|
|
└── safe-exec-audit.log # 审计日志
|
|||
|
|
|
|||
|
|
~/.openclaw/safe-exec-known-*.txt # 监控追踪文件
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 批准工作流
|
|||
|
|
|
|||
|
|
#### 1. 危险命令检测
|
|||
|
|
|
|||
|
|
当 Agent 尝试执行危险命令时:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
🚨 **危险操作检测 - 命令已拦截**
|
|||
|
|
|
|||
|
|
**风险等级:** CRITICAL
|
|||
|
|
**命令:** `rm -rf /tmp/test`
|
|||
|
|
**原因:** 递归删除,使用 force 标志
|
|||
|
|
|
|||
|
|
**请求 ID:** `req_1769938492_9730`
|
|||
|
|
|
|||
|
|
ℹ️ 此命令需要用户批准才能执行。
|
|||
|
|
|
|||
|
|
**批准方法:**
|
|||
|
|
1. 在终端运行: `safe-exec-approve req_1769938492_9730`
|
|||
|
|
2. 或者: `safe-exec-list` 查看所有待处理请求
|
|||
|
|
|
|||
|
|
**拒绝方法:**
|
|||
|
|
`safe-exec-reject req_1769938492_9730`
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 2. 批准请求
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 方法 1: 使用请求 ID
|
|||
|
|
safe-exec-approve req_1769938492_9730
|
|||
|
|
|
|||
|
|
# 方法 2: 列出并批准最近的请求
|
|||
|
|
safe-exec-list
|
|||
|
|
# 输出所有待处理的请求,然后使用 ID 批准
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 3. 命令执行
|
|||
|
|
|
|||
|
|
批准后,命令会执行并记录到审计日志。
|
|||
|
|
|
|||
|
|
### 风险等级详解
|
|||
|
|
|
|||
|
|
#### 🔴 CRITICAL(危急)
|
|||
|
|
|
|||
|
|
系统破坏性命令,需要明确批准:
|
|||
|
|
|
|||
|
|
- `rm -rf /` - 删除根目录
|
|||
|
|
- `dd if=/dev/zero` - 磁盘覆盖
|
|||
|
|
- `mkfs.*` - 格式化文件系统
|
|||
|
|
- `:(){ :|:& };:` - Fork bomb
|
|||
|
|
- `> /dev/sda` - 直接写入磁盘
|
|||
|
|
|
|||
|
|
#### 🟠 HIGH(高危)
|
|||
|
|
|
|||
|
|
可能导致数据丢失或系统变动的命令:
|
|||
|
|
|
|||
|
|
- `rm -rf` (非根目录) - 递归删除
|
|||
|
|
- `chmod 777` - 设置全局可写权限
|
|||
|
|
- `curl | bash` - 管道下载到 shell
|
|||
|
|
- 写入 `/etc/`, `/boot/`, `/sys/` - 系统目录修改
|
|||
|
|
- `wget | sh` - 下载并执行脚本
|
|||
|
|
|
|||
|
|
#### 🟡 MEDIUM(中危)
|
|||
|
|
|
|||
|
|
需要特权或影响系统的操作:
|
|||
|
|
|
|||
|
|
- `sudo` - 使用特权执行
|
|||
|
|
- `iptables`, `firewall-cmd`, `ufw` - 防火墙修改
|
|||
|
|
- `systemctl` - 服务管理
|
|||
|
|
- `crontab -e` - 定时任务编辑
|
|||
|
|
|
|||
|
|
#### 🟢 LOW(低危)
|
|||
|
|
|
|||
|
|
相对安全的操作,可能无需批准:
|
|||
|
|
|
|||
|
|
- `ls`, `cat`, `grep` - 读取操作
|
|||
|
|
- `cp`, `mv` (非系统目录) - 文件操作
|
|||
|
|
- `mkdir`, `touch` - 创建操作
|
|||
|
|
- `cd`, `pwd` - 导航操作
|
|||
|
|
|
|||
|
|
### 全局控制
|
|||
|
|
|
|||
|
|
#### 启用/禁用 SafeExec
|
|||
|
|
|
|||
|
|
**对话式:**
|
|||
|
|
```
|
|||
|
|
Enable SafeExec # 启用
|
|||
|
|
Disable SafeExec # 禁用
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**脚本式:**
|
|||
|
|
```bash
|
|||
|
|
~/.openclaw/skills/safe-exec/safe-exec.sh --enable
|
|||
|
|
~/.openclaw/skills/safe-exec/safe-exec.sh --disable
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**环境变量:**
|
|||
|
|
```bash
|
|||
|
|
export SAFE_EXEC_DISABLE=1 # 禁用
|
|||
|
|
unset SAFE_EXEC_DISABLE # 启用
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 查看状态
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 查看待处理的请求
|
|||
|
|
safe-exec-list
|
|||
|
|
|
|||
|
|
# 查看审计日志(最近 50 条)
|
|||
|
|
tail -n 50 ~/.openclaw/safe-exec-audit.log
|
|||
|
|
|
|||
|
|
# 查看配置
|
|||
|
|
cat ~/.openclaw/safe-exec-rules.json
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 高级配置
|
|||
|
|
|
|||
|
|
### 环境变量
|
|||
|
|
|
|||
|
|
| 变量 | 说明 | 默认值 |
|
|||
|
|
|------|------|--------|
|
|||
|
|
| `SAFE_EXEC_DISABLE` | 全局禁用 SafeExec | 未设置 |
|
|||
|
|
| `OPENCLAW_AGENT_CALL` | 标识 Agent 调用(自动检测) | 自动 |
|
|||
|
|
| `SAFE_EXEC_AUTO_CONFIRM` | 自动批准 LOW/MEDIUM 风险 | 未设置 |
|
|||
|
|
| `SAFEXEC_CONTEXT` | 用户上下文信息 | 空 |
|
|||
|
|
|
|||
|
|
**使用示例:**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 自动批准低中风险命令
|
|||
|
|
export SAFE_EXEC_AUTO_CONFIRM=1
|
|||
|
|
|
|||
|
|
# 在 Agent 中使用(自动设置)
|
|||
|
|
export OPENCLAW_AGENT_CALL=1
|
|||
|
|
|
|||
|
|
# 完全禁用
|
|||
|
|
export SAFE_EXEC_DISABLE=1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 自定义规则
|
|||
|
|
|
|||
|
|
编辑 `~/.openclaw/safe-exec-rules.json`:
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"enabled": true,
|
|||
|
|
"rules": [
|
|||
|
|
{
|
|||
|
|
"pattern": "docker rm.*-f",
|
|||
|
|
"risk": "medium",
|
|||
|
|
"reason": "强制删除 Docker 容器"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"pattern": "kubectl delete",
|
|||
|
|
"risk": "high",
|
|||
|
|
"reason": "删除 Kubernetes 资源"
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 非交互式模式
|
|||
|
|
|
|||
|
|
在非交互式环境(如 Agent 调用)中:
|
|||
|
|
|
|||
|
|
1. **TTY 检测**:SafeExec 自动检测是否在交互式终端
|
|||
|
|
2. **环境检测**:检测 `OPENCLAW_AGENT_CALL` 环境变量
|
|||
|
|
3. **智能跳过**:在非交互式环境中跳过二次确认
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Agent 调用时自动启用非交互模式
|
|||
|
|
export OPENCLAW_AGENT_CALL=1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 开发文档
|
|||
|
|
|
|||
|
|
### 架构设计
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌─────────────┐
|
|||
|
|
│ Agent │
|
|||
|
|
└──────┬──────┘
|
|||
|
|
│
|
|||
|
|
▼
|
|||
|
|
┌──────────────────┐
|
|||
|
|
│ safe-exec.sh │ ← 主入口
|
|||
|
|
└──────┬───────────┘
|
|||
|
|
│
|
|||
|
|
▼
|
|||
|
|
┌────────────────────┐
|
|||
|
|
│ 风险评估引擎 │
|
|||
|
|
│ - 模式匹配 │
|
|||
|
|
│ - 上下文分析 │
|
|||
|
|
└──────┬─────────────┘
|
|||
|
|
│
|
|||
|
|
▼
|
|||
|
|
┌───┴────┐
|
|||
|
|
│ 危险? │
|
|||
|
|
└───┬────┘
|
|||
|
|
是 │ │ 否
|
|||
|
|
│ └──────────→ 直接执行
|
|||
|
|
▼
|
|||
|
|
┌──────────────┐
|
|||
|
|
│ 请求批准 │
|
|||
|
|
│ - 写入 pending│
|
|||
|
|
│ - 通知用户 │
|
|||
|
|
└──────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 文件说明
|
|||
|
|
|
|||
|
|
#### 核心脚本
|
|||
|
|
|
|||
|
|
| 文件 | 功能 |
|
|||
|
|
|------|------|
|
|||
|
|
| `safe-exec.sh` | 主执行脚本,命令拦截和风险评估 |
|
|||
|
|
| `safe-exec-approve.sh` | 批准请求的脚本 |
|
|||
|
|
| `safe-exec-reject.sh` | 拒绝请求的脚本 |
|
|||
|
|
| `safe-exec-list.sh` | 列出待处理的请求 |
|
|||
|
|
| `safe-exec-check-pending.sh` | 检查待处理请求 |
|
|||
|
|
|
|||
|
|
#### 文档文件
|
|||
|
|
|
|||
|
|
| 文件 | 说明 |
|
|||
|
|
|------|------|
|
|||
|
|
| `README.md` | 主要文档,快速开始 |
|
|||
|
|
| `README-detail.md` | 本文档,详细说明 |
|
|||
|
|
| `CHANGELOG.md` | 版本变更日志 |
|
|||
|
|
| `SKILL.md` | ClawdHub skill 描述 |
|
|||
|
|
| `CONTRIBUTING.md` | 贡献指南 |
|
|||
|
|
|
|||
|
|
#### 配置和数据
|
|||
|
|
|
|||
|
|
| 文件/目录 | 说明 |
|
|||
|
|
|-----------|------|
|
|||
|
|
| `~/.openclaw/safe-exec-rules.json` | 规则配置 |
|
|||
|
|
| `~/.openclaw/safe-exec-audit.log` | 审计日志 |
|
|||
|
|
| `~/.openclaw/safe-exec/pending/` | 待处理请求 |
|
|||
|
|
|
|||
|
|
### API 参考
|
|||
|
|
|
|||
|
|
#### safe-exec.sh
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 执行命令
|
|||
|
|
safe-exec.sh "command"
|
|||
|
|
|
|||
|
|
# 启用/禁用
|
|||
|
|
safe-exec.sh --enable
|
|||
|
|
safe-exec.sh --disable
|
|||
|
|
safe-exec.sh --status
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### safe-exec-approve.sh
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 批准请求
|
|||
|
|
safe-exec-approve.sh <request_id>
|
|||
|
|
|
|||
|
|
# 查看详情
|
|||
|
|
safe-exec-approve.sh --list
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### safe-exec-list.sh
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 列出所有待处理请求
|
|||
|
|
safe-exec-list.sh
|
|||
|
|
|
|||
|
|
# 仅显示 CRITICAL 级别
|
|||
|
|
safe-exec-list.sh --critical
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 贡献指南
|
|||
|
|
|
|||
|
|
#### 开发环境设置
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 1. Fork 并克隆仓库
|
|||
|
|
git clone https://github.com/OTTTTTO/safe-exec.git
|
|||
|
|
cd safe-exec
|
|||
|
|
|
|||
|
|
# 2. 创建功能分支
|
|||
|
|
git checkout -b feature/my-feature
|
|||
|
|
|
|||
|
|
# 3. 测试修改
|
|||
|
|
./test-safeexec.sh
|
|||
|
|
|
|||
|
|
# 4. 提交更改
|
|||
|
|
git commit -m "feat: Add my feature"
|
|||
|
|
|
|||
|
|
# 5. 推送并创建 PR
|
|||
|
|
git push origin feature/my-feature
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 代码规范
|
|||
|
|
|
|||
|
|
- Bash 脚本遵循 [ShellCheck](https://www.shellcheck.net/) 建议
|
|||
|
|
- 文档使用 Markdown 格式
|
|||
|
|
- 提交信息遵循 [Conventional Commits](https://www.conventionalcommits.org/)
|
|||
|
|
|
|||
|
|
#### 测试
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 运行所有测试
|
|||
|
|
./test-safeexec.sh
|
|||
|
|
|
|||
|
|
# 运行特定测试
|
|||
|
|
./test-regression.sh
|
|||
|
|
./test-context-aware.sh
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 常见问题
|
|||
|
|
|
|||
|
|
### 故障排查
|
|||
|
|
|
|||
|
|
#### Q: SafeExec 没有拦截命令
|
|||
|
|
|
|||
|
|
**A:** 检查以下几点:
|
|||
|
|
|
|||
|
|
1. 是否已启用?
|
|||
|
|
```bash
|
|||
|
|
~/.openclaw/skills/safe-exec/safe-exec.sh --status
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. 是否被环境变量禁用?
|
|||
|
|
```bash
|
|||
|
|
echo $SAFE_EXEC_DISABLE
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. 命令是否在白名单中?
|
|||
|
|
|
|||
|
|
#### Q: 批准命令后没有执行
|
|||
|
|
|
|||
|
|
**A:** 可能的原因:
|
|||
|
|
|
|||
|
|
1. 请求已超时(5分钟)
|
|||
|
|
2. 命令语法错误
|
|||
|
|
3. 权限不足
|
|||
|
|
|
|||
|
|
查看审计日志:
|
|||
|
|
```bash
|
|||
|
|
tail -f ~/.openclaw/safe-exec-audit.log
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### Q: 如何重置所有状态?
|
|||
|
|
|
|||
|
|
**A:** 删除数据文件:
|
|||
|
|
```bash
|
|||
|
|
rm -rf ~/.openclaw/safe-exec/
|
|||
|
|
rm ~/.openclaw/safe-exec-*
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 最佳实践
|
|||
|
|
|
|||
|
|
#### 1. 生产环境使用
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 启用自动确认低中风险操作
|
|||
|
|
export SAFE_EXEC_AUTO_CONFIRM=1
|
|||
|
|
|
|||
|
|
# 定期备份审计日志
|
|||
|
|
cp ~/.openclaw/safe-exec-audit.log ~/.backup/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 2. 多用户环境
|
|||
|
|
|
|||
|
|
为每个用户配置独立的规则文件:
|
|||
|
|
```bash
|
|||
|
|
export SAFE_EXEC_RULES_FILE="/home/user/.safe-exec-rules.json"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 3. 与其他工具集成
|
|||
|
|
|
|||
|
|
**与 sudo 集成:**
|
|||
|
|
```bash
|
|||
|
|
# 在 sudoers 中添加
|
|||
|
|
Defaults secure_path = /usr/local/bin:/usr/bin:/bin
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**与日志系统集成:**
|
|||
|
|
```bash
|
|||
|
|
# 将审计日志发送到 rsyslog
|
|||
|
|
tail -f ~/.openclaw/safe-exec-audit.log | logger -t safeexec
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 性能优化
|
|||
|
|
|
|||
|
|
#### 减少延迟
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 使用更快的磁盘存储
|
|||
|
|
export SAFE_EXEC_DIR="/dev/shm/safe-exec"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 定期清理
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 清理过期的 pending 请求
|
|||
|
|
find ~/.openclaw/safe-exec/pending/ -mtime +1 -delete
|
|||
|
|
|
|||
|
|
# 压缩旧日志
|
|||
|
|
logrotate ~/.openclaw/safe-exec-audit.log
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 附录
|
|||
|
|
|
|||
|
|
### 相关资源
|
|||
|
|
|
|||
|
|
- [OpenClaw 文档](https://docs.openclaw.ai/)
|
|||
|
|
- [ClawdHub 市场](https://www.clawhub.ai/skills)
|
|||
|
|
- [Bash 最佳实践](https://github.com/koalaman/shellcheck)
|
|||
|
|
|
|||
|
|
### 社区
|
|||
|
|
|
|||
|
|
- **GitHub Issues**: https://github.com/OTTTTTO/safe-exec/issues
|
|||
|
|
- **Discussions**: https://github.com/OTTTTTO/safe-exec/discussions
|
|||
|
|
- **Email**: 731554297@qq.com
|
|||
|
|
|
|||
|
|
### 许可证
|
|||
|
|
|
|||
|
|
MIT License - 详见 [LICENSE](LICENSE)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**最后更新:** 2026-02-01
|
|||
|
|
**维护者:** OTTTTTO
|
|||
|
|
**版本:** v0.3.3
|