沙箱与执行隔离
YeePilot 如何使用 Linux 命名空间、资源限制和路径限制来隔离命令执行
YeePilot 在隔离的沙箱中运行每个命令,限制命令可以访问的内容和可以消耗的资源量。即使命令行为异常,沙箱也能防止它对系统造成广泛损害。
沙箱的工作方式
当 YeePilot 执行命令时,它使用 Linux 命名空间创建隔离的执行环境。这与驱动 Docker 等容器运行时的技术相同,应用在单个命令级别。
每个命令运行时具有:
- 进程隔离 -- 命令无法看到或与其命名空间外的进程交互
- 资源限制 -- CPU、内存、文件大小和进程数量都有上限
- 路径限制 -- 敏感系统文件不可访问
- 输出截断 -- 失控的输出在充满终端之前被截断
- 执行超时 -- 运行时间过长的命令会被自动终止
资源限制
YeePilot 对每个命令强制执行默认资源限制:
| 资源 | 默认限制 | 描述 |
|---|---|---|
| CPU 时间 | 300 秒 | 所有线程的最大 CPU 时间总和 |
| 内存 | 512 MB | 最大常驻内存使用量 |
| 文件大小 | 100 MB | 创建的任何单个文件的最大大小 |
| 进程数 | 64 | 最大派生进程/线程数 |
| 输出 | 10,000 字符 | 超出此限制的输出将被截断 |
| 超时 | 30 秒 | 命令被终止前的实际时间 |
这些默认值旨在处理合理的管理任务,同时防止失控进程消耗服务器资源。
自定义资源限制
在 ~/.yeepilot/config.yaml 的 sandbox 部分调整限制:
sandbox:
enabled: true
cpu_limit: 300 # CPU 秒
memory_limit: 512 # 兆字节
file_size_limit: 100 # 兆字节
process_limit: 64 # 最大进程数
output_limit: 10000 # 字符数
timeout: 30 # 秒(实际时间)对于编译软件或处理大型日志文件等资源密集型任务,您可能需要增加这些限制:
sandbox:
memory_limit: 1024 # 1 GB 用于编译任务
timeout: 120 # 2 分钟用于长时间运行的构建
output_limit: 50000 # 更多输出用于详细日志禁止路径
某些敏感路径默认被阻止,防止命令读取或修改关键系统文件:
| 禁止路径 | 原因 |
|---|---|
/etc/shadow | 密码哈希 |
/etc/gshadow | 组密码哈希 |
/root | root 用户主目录 |
试图访问禁止路径的命令将因权限错误而失败。
自定义禁止路径
在配置中添加或修改禁止路径:
sandbox:
denied_paths:
- /etc/shadow
- /etc/gshadow
- /root
- /var/lib/secrets # 自定义:您的应用程序密钥
- /opt/myapp/keys # 自定义:应用程序密钥存储这对于保护不应通过 YeePilot 访问的应用程序特定密钥存储或配置目录特别有用。
网络访问
默认情况下,通过 YeePilot 执行的命令具有网络访问权限,以便软件包安装(apt install)、更新和健康检查等任务正常工作。
您可以限制网络访问以实现更严格的隔离:
sandbox:
network: true # true(默认)或 false将 network 设置为 false 会阻止执行命令的所有出站和入站网络连接。这在需要确保命令仅操作本地资源的高安全环境中非常有用。
PTY 支持
YeePilot 使用伪终端(PTY)分配来执行命令。这意味着命令的行为就像在真实终端中运行一样,确保:
- 正确的输出格式 -- 检测终端功能的工具(如彩色输出、进度条)正常工作
- 交互兼容性 -- 需要终端功能的命令正确运行
- 信号处理 --
Ctrl+C和其他信号被正确传递给运行中的命令
输出截断
当命令产生的输出超过配置的限制(默认:10,000 字符)时,YeePilot 会截断它并通知您:
> Search all log files for errors
Running: grep -r "ERROR" /var/log/
[Output truncated at 10,000 characters -- 45,230 total characters produced]
... showing last portion of output ...这防止单个命令占满您的会话。如果需要查看完整输出,您可以:
- 在配置中增加
output_limit - 将输出重定向到文件:"Search for errors and save results to /tmp/errors.log"
- 使用更具体的查询来减少输出量
执行超时
命令默认在 30 秒实际时间后被终止。这可以防止:
- 意外运行无限挂起的命令
- 等待网络资源而卡住的命令
- 无限循环或失控进程
当命令超时时,YeePilot 会干净地终止它并报告超时:
Command timed out after 30 seconds: ping 10.0.0.1为需要更长时间的合理命令增加超时:
sandbox:
timeout: 120 # 2 分钟完整沙箱配置参考
以下是包含所有可用选项的完整沙箱配置:
sandbox:
enabled: true # 启用/禁用沙箱(默认:true)
cpu_limit: 300 # CPU 秒(默认:300)
memory_limit: 512 # 兆字节(默认:512)
file_size_limit: 100 # 兆字节(默认:100)
process_limit: 64 # 最大进程数(默认:64)
output_limit: 10000 # 字符数(默认:10000)
timeout: 30 # 实际时间秒数(默认:30)
network: true # 允许网络访问(默认:true)
denied_paths: # 命令无法访问的路径
- /etc/shadow
- /etc/gshadow
- /root**注意:**完全禁用沙箱(
enabled: false)会移除所有隔离和资源限制。强烈不建议在生产环境中这样做。仅在完全信任所执行命令的受控开发环境中禁用沙箱。