Docs安全沙箱与执行隔离
返回文档
安全

沙箱与执行隔离

YeePilot 如何使用 Linux 命名空间、资源限制和路径限制来隔离命令执行

最后更新: 2026年2月28日

YeePilot 在隔离的沙箱中运行每个命令,限制命令可以访问的内容和可以消耗的资源量。即使命令行为异常,沙箱也能防止它对系统造成广泛损害。

沙箱的工作方式

当 YeePilot 执行命令时,它使用 Linux 命名空间创建隔离的执行环境。这与驱动 Docker 等容器运行时的技术相同,应用在单个命令级别。

每个命令运行时具有:

  • 进程隔离 -- 命令无法看到或与其命名空间外的进程交互
  • 资源限制 -- CPU、内存、文件大小和进程数量都有上限
  • 路径限制 -- 敏感系统文件不可访问
  • 输出截断 -- 失控的输出在充满终端之前被截断
  • 执行超时 -- 运行时间过长的命令会被自动终止

资源限制

YeePilot 对每个命令强制执行默认资源限制:

资源默认限制描述
CPU 时间300 秒所有线程的最大 CPU 时间总和
内存512 MB最大常驻内存使用量
文件大小100 MB创建的任何单个文件的最大大小
进程数64最大派生进程/线程数
输出10,000 字符超出此限制的输出将被截断
超时30 秒命令被终止前的实际时间

这些默认值旨在处理合理的管理任务,同时防止失控进程消耗服务器资源。

自定义资源限制

~/.yeepilot/config.yamlsandbox 部分调整限制:

yaml
sandbox:
  enabled: true
  cpu_limit: 300          # CPU 秒
  memory_limit: 512       # 兆字节
  file_size_limit: 100    # 兆字节
  process_limit: 64       # 最大进程数
  output_limit: 10000     # 字符数
  timeout: 30             # 秒(实际时间)

对于编译软件或处理大型日志文件等资源密集型任务,您可能需要增加这些限制:

yaml
sandbox:
  memory_limit: 1024      # 1 GB 用于编译任务
  timeout: 120            # 2 分钟用于长时间运行的构建
  output_limit: 50000     # 更多输出用于详细日志

禁止路径

某些敏感路径默认被阻止,防止命令读取或修改关键系统文件:

禁止路径原因
/etc/shadow密码哈希
/etc/gshadow组密码哈希
/rootroot 用户主目录

试图访问禁止路径的命令将因权限错误而失败。

自定义禁止路径

在配置中添加或修改禁止路径:

yaml
sandbox:
  denied_paths:
    - /etc/shadow
    - /etc/gshadow
    - /root
    - /var/lib/secrets       # 自定义:您的应用程序密钥
    - /opt/myapp/keys        # 自定义:应用程序密钥存储

这对于保护不应通过 YeePilot 访问的应用程序特定密钥存储或配置目录特别有用。

网络访问

默认情况下,通过 YeePilot 执行的命令具有网络访问权限,以便软件包安装(apt install)、更新和健康检查等任务正常工作。

您可以限制网络访问以实现更严格的隔离:

yaml
sandbox:
  network: true            # true(默认)或 false

network 设置为 false 会阻止执行命令的所有出站和入站网络连接。这在需要确保命令仅操作本地资源的高安全环境中非常有用。

PTY 支持

YeePilot 使用伪终端(PTY)分配来执行命令。这意味着命令的行为就像在真实终端中运行一样,确保:

  • 正确的输出格式 -- 检测终端功能的工具(如彩色输出、进度条)正常工作
  • 交互兼容性 -- 需要终端功能的命令正确运行
  • 信号处理 -- Ctrl+C 和其他信号被正确传递给运行中的命令

输出截断

当命令产生的输出超过配置的限制(默认:10,000 字符)时,YeePilot 会截断它并通知您:

plaintext
> 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 ...

这防止单个命令占满您的会话。如果需要查看完整输出,您可以:

  1. 在配置中增加 output_limit
  2. 将输出重定向到文件:"Search for errors and save results to /tmp/errors.log"
  3. 使用更具体的查询来减少输出量

执行超时

命令默认在 30 秒实际时间后被终止。这可以防止:

  • 意外运行无限挂起的命令
  • 等待网络资源而卡住的命令
  • 无限循环或失控进程

当命令超时时,YeePilot 会干净地终止它并报告超时:

plaintext
Command timed out after 30 seconds: ping 10.0.0.1

为需要更长时间的合理命令增加超时:

yaml
sandbox:
  timeout: 120             # 2 分钟

完整沙箱配置参考

以下是包含所有可用选项的完整沙箱配置:

yaml
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)会移除所有隔离和资源限制。强烈不建议在生产环境中这样做。仅在完全信任所执行命令的受控开发环境中禁用沙箱。