sandbox/README.md
Star f9dcf07ba4 first version
supported macOS、linux
2026-03-23 00:35:27 +08:00

216 lines
6.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# sandbox
## 项目概述
sandbox 是一个基于 Go 语言开发的轻量级沙箱环境,用于安全地执行代码,支持 Python 和 Node.js 等运行时。该项目主要用于低代码框架的测试和验证,提供了网络访问控制、资源限制等安全特性。
## 功能特点
- **多语言支持**:内置支持 Python 和 Node.js 运行时,其他运行时可以通过 RegisterRuntime 注册。
- **网络控制**
- 支持允许/阻止互联网访问
- 支持允许特定端口监听
- 支持 IP 白名单和黑名单
- **资源限制**
- CPU 使用率限制
- 内存使用限制
- SWAP 限制
- /dev/shm 和 /tmp 大小限制
- **环境配置**:支持自定义环境变量
- **安全隔离**:提供安全的执行环境,防止恶意代码影响系统
- **跨平台支持**:支持 Linux 和 macOS 操作系统
- **状态管理**:支持沙箱状态持久化和恢复
## 项目架构
### 核心代码结构
```
sandbox/
├── plugin.go # 插件入口,注册 sandbox 模块到 gojs 框架
├── sandbox.go # 定义沙箱的核心结构和配置
├── master.go # 管理沙箱的生命周期和状态
├── runtime.go # 运行时管理
├── sandbox_linux.go # Linux 平台实现
├── sandbox_darwin.go # macOS 平台实现
├── pythonRuntime.go # Python 运行时实现
├── nodejsRuntime.go # Node.js 运行时实现
├── util.go # 工具函数
├── base_test.js # 测试入口文件
├── testcase/ # 测试用例目录
│ ├── base_allow.py # 允许模式测试
│ ├── base_deny.py # 拒绝模式测试
│ ├── secret.py # 敏感信息测试
│ └── base_allow.js # Node.js 环境测试
└── README.md # 项目说明文档
```
### 核心组件
1. **Plugin 模块**
- 注册 sandbox 模块到 gojs 框架
- 提供 Start、Fetch、Query 等 API 接口
- 管理沙箱的启动和恢复
2. **Sandbox 核心**
- 定义沙箱的配置结构Config
- 管理沙箱的状态和生命周期
- 提供资源限制和网络控制功能
3. **运行时管理**
- 支持 Python 和 Node.js 运行时
- 处理不同运行时的启动和配置
4. **平台适配**
- Linux 平台实现sandbox_linux.go
- macOS 平台实现sandbox_darwin.go
## 技术实现
### 沙箱隔离机制
- **文件系统隔离**:使用挂载点和只读挂载
- **网络隔离**:通过 namespace 机制控制网络访问
- **资源限制**:使用 cgroupsLinux或等效机制限制资源使用
- **进程隔离**:创建独立的进程环境
### 核心 API
| API | 说明 |
|-----|------|
| Start(config) | 创建并启动新的沙箱实例 |
| Fetch(id) | 根据 ID 获取沙箱实例 |
| Query(name) | 根据名称查询沙箱实例 |
| Sandbox.status() | 获取沙箱状态 |
| Sandbox.wait(timeout) | 等待沙箱执行完成 |
| Sandbox.kill() | 终止沙箱进程(适用于服务类或运行过久的场景,简单一次性场景不需要调用) |
## 安装与使用
### 基本使用
1. 导入 sandbox 模块:
```javascript
import sandbox from 'apigo.cc/gojs/sandbox'
```
2. 配置并启动沙箱:
```javascript
const sb = sandbox.start({
projectDir: "data",
runtime: { language: "python", venv: "test", version: "3.12" },
startArgs: ["-c", "print('Hello, sandbox!')"],
network: {
allowInternet: true,
allowListen: [19999]
},
limits: { cpu: 0.5, mem: 0.2 }
})
```
3. 等待执行完成:
```javascript
sb.wait(10000) // 等待最多 10 秒
```
4. 查看执行状态:
```javascript
const status = sb.status()
console.log(status)
```
## 配置选项
| 选项 | 类型 | 说明 |
|------|------|------|
| Name | string | 沙盒名称 |
| projectDir | string | 宿主机的工作目录自动映射到沙盒内workDir |
| workDir | string | 沙盒内的工作目录 |
| envs | map[string]string | 环境变量,支持$变量 |
| volumes | []Volume | 挂载列表 |
| limits | Limits | 资源限制 |
| network | struct | 网络配置 |
| gpu | struct | GPU 配置 |
| extraOptions | []string | 额外参数 |
| autoStart | bool | 是否自动启动沙盒进程 |
| startCmd | string | 启动命令 |
| startArgs | []string | 启动参数 |
| runtime | struct | 运行时配置 |
| noLog | bool | 是否不显示沙盒运行日志 |
### 资源限制配置
| 选项 | 类型 | 说明 |
|------|------|------|
| Cpu | float64 | CPU 核心限制 (如 0.5) |
| Mem | float64 | 内存限制 (单位: GB) |
| Swap | float64 | SWAP 限制 (单位: GB) |
| Shm | uint | /dev/shm 大小 (单位: MB) |
| Tmp | uint | /tmp 大小 (单位: MB) |
### 网络配置
| 选项 | 类型 | 说明 |
|------|------|------|
| AllowInternet | bool | 是否允许出站网络连接 |
| AllowLocalNetwork | bool | 是否允许访问本地网络 |
| AllowListen | []int | 允许监听端口列表 |
| AllowList | []string | 允许出站访问的 IP/端口 列表 |
| BlockList | []string | 拒绝访问的 IP/端口 列表 |
## 测试说明
### 运行测试
```bash
go test -v .
```
### 测试用例说明
1. **base_allow.py**:测试允许模式下的功能,包括:
- 内存使用限制128M 允许512M 拒绝)
- CPU 使用率限制
- 网络监听(允许特定端口)
- 网络访问(允许互联网访问,阻止特定 IP
- 环境变量配置
- 外部依赖安装cowsay
2. **base_deny.py**:测试拒绝模式下的功能,包括:
- 网络监听(只允许特定端口)
- 网络访问(只允许白名单 IP 和端口)
3. **secret.py**:测试敏感信息处理
4. **base_allow.js**:测试 Node.js 环境下的功能
### 压力测试
测试脚本还包含了压力测试,会并发执行多个沙箱实例,测试系统的稳定性和性能。
## 日志管理
沙盒内的stdout会自动重定向到日志文件stderr也会被重定向到日志文件。
日志存储在 `[projectDir]/logs/` 目录中,包括:
- 标准输出日志stdout_*.log
- 标准错误日志stderr_*.log
## 注意事项
1. **macOS 限制**macOS 系统不支持某些 Linux 特有的功能,如 cgroup 限制和 IP 过滤。测试脚本会自动检测操作系统并调整测试逻辑。
2. **资源限制**:在 macOS 上资源限制CPU 和内存)不会生效。
3. **网络限制**:在 macOS 上网络细化限制IP 过滤)不会生效。
4. **权限要求**:在 Linux 上,建议以 root 权限运行,否则也能运行但部分功能会受限。
## 许可证
本项目采用 MIT 许可证,详见 LICENSE 文件。