第七章:沙箱终端与安全

沙箱终端架构

Hermes Agent 的沙箱终端是其安全体系的核心组件。它基于 Docker 容器技术构建,为 Agent 的代码执行提供了一个隔离、可控的运行环境。沙箱的设计目标是:在给予 Agent 充分操作能力的同时,严格限制其对宿主机系统的影响范围。

沙箱架构概览

沙箱终端采用分层架构设计:

  1. 容器层:基于 Docker 的运行隔离,每个会话对应一个独立的容器实例
  2. 网络层:控制容器与外部网络的通信策略
  3. 文件系统层:通过挂载卷(Volume)映射控制文件访问
  4. 策略层:定义允许/禁止的操作规则集合
  5. 审计层:记录所有执行操作,用于事后追溯与安全审计
# .hermes/sandbox.yaml - 沙箱终端配置
sandbox:
  enabled: true

  # Docker 配置
  docker:
    image: "hermes-agent/sandbox:latest"
    network_mode: "bridge"
    remove_on_exit: true
    memory_limit: "2g"
    cpu_limit: 2.0

  # 卷挂载配置
  volumes:
    - host_path: /home/user/project
      container_path: /workspace
      read_only: false
    - host_path: /tmp/hermes-cache
      container_path: /cache
      read_only: true

配置沙箱环境

选择合适的 Docker 镜像

沙箱镜像的选择直接影响 Agent 可用工具的范围和执行效率。Hermes Agent 提供了官方基础镜像,也支持自定义镜像:

# 自定义沙箱 Dockerfile
FROM hermes-agent/sandbox:base

# 安装项目所需依赖
RUN apt-get update && apt-get install -y     nodejs     npm     python3-pip     && rm -rf /var/lib/apt/lists/*

# 安装全局工具
RUN npm install -g typescript eslint prettier
RUN pip install pytest black mypy

# 设置工作目录
WORKDIR /workspace

资源限制配置

为了防止 Agent 执行消耗过多系统资源,需要合理配置资源限制:

资源类型推荐值说明
CPU2 核限制容器使用的 CPU 核心数
内存2 GB超过限制的进程将被 OOM Kill
磁盘5 GB限制容器可使用的磁盘空间
网络带宽10 Mbps限制容器网络 I/O
进程数100限制容器内可创建的进程总数
打开文件数1024限制文件描述符数量

安全策略

文件系统访问控制

沙箱通过三层文件系统控制来保障安全:

security:
  filesystem:
    # 第一层:Docker 卷挂载控制
    mounts:
      - type: bind
        source: /workspace
        target: /sandbox/workspace
        options: [rw, nosuid, nodev]
      - type: tmpfs
        target: /sandbox/tmp
        options: [noexec, size=100m]

    # 第二层:Hermes 内部路径白名单
    allowed_paths:
      - /sandbox/workspace
      - /sandbox/tmp

    # 第三层:文件操作过滤
    forbidden_patterns:
      - "*.pem"
      - "*.key"
      - ".env"
      - "credentials*"

网络限制

网络访问控制确保 Agent 只能访问白名单中的外部服务:

security:
  network:
    # 出站规则
    egress:
      allowed_ips:
        - "0.0.0.0/0"    # 允许访问外网
      denied_ports:
        - 22             # 禁止 SSH
        - 3306           # 禁止 MySQL
        - 6379           # 禁止 Redis

    # DNS 过滤
    dns_filter:
      enabled: true
      blocked_domains:
        - "*.malicious.com"

    # 入站规则 - 默认禁止所有入站连接
    ingress:
      enabled: false

沙箱内 vs 沙箱外执行对比

以下表格详细对比了在沙箱内外执行操作的核心差异:

对比维度沙箱内执行沙箱外执行
文件访问仅限挂载卷路径全部文件系统
网络访问受策略控制完整网络访问
系统命令受限命令集全部系统命令
执行速度中等(有容器开销)快速(直接执行)
隔离性完全隔离无隔离
环境一致性可重复环境依赖宿主机配置
资源限制可精确控制依赖系统调度
审计日志全量记录需要额外配置
适用场景代码运行、测试执行文件编辑、代码阅读

敏感信息保护

Agent 在运行过程中不可避免地会接触到 API Key、密码等敏感信息。Hermes Agent 提供了多层保护机制:

# .hermes/secrets.yaml(需加入 .gitignore)
secrets:
  # 环境变量注入(不在日志中显示)
  env_vars:
    OPENAI_API_KEY: sk-xxxxx
    GITHUB_TOKEN: ghp_xxxxx

  # 敏感文件保护
  protected_files:
    - pattern: ".env"
      action: block          # 阻止读取
    - pattern: "config/prod.*"
      action: warn           # 读取时发出警告

  # 日志脱敏规则
  redact:
    patterns:
      - regex: "sk-[A-Za-z0-9]{20,}"
        replacement: "sk-****"
      - regex: "ghp_[A-Za-z0-9]{36}"
        replacement: "ghp_****"

安全最佳实践

  1. 永远不要将密钥硬编码到提示词或工具配置中:使用环境变量或密钥管理服务
  2. 启用审计日志:记录所有敏感信息的访问历史
  3. 定期轮换密钥:设置 API Key 的自动轮换策略
  4. 最小权限原则:只授予 Agent 完成任务所需的最低权限
  5. 使用临时凭证:优先使用短期有效的临时凭证而非长期密钥

实战:为项目配置安全的沙箱终端

下面我们为一个实际项目配置完整的沙箱终端环境。

步骤 1:创建项目专属沙箱配置

# .hermes/sandbox.config.yaml
project:
  name: "my-web-app"
  type: "nextjs"

sandbox:
  image:
    build:
      context: .
      dockerfile: .hermes/Dockerfile.sandbox
    tags:
      - "my-web-app-sandbox:latest"

  workspace:
    mount_path: /workspace
    exclude:
      - node_modules
      - .next
      - .git

  environment:
    NODE_ENV: development
    DATABASE_URL: postgresql://test:test@localhost:5432/test
    # API Key 通过外部密钥管理服务注入
    OPENAI_API_KEY: ${SECRETS_OPENAI_API_KEY}

步骤 2:创建沙箱入口脚本

#!/bin/bash
# scripts/start-sandbox.sh

set -euo pipefail

SANDBOX_IMAGE="my-web-app-sandbox:latest"
WORKSPACE_DIR=$(pwd)

echo "构建沙箱镜像..."
docker build -t $SANDBOX_IMAGE -f .hermes/Dockerfile.sandbox .

echo "启动沙箱容器..."
docker run -it --rm   --name hermes-sandbox   --memory="2g"   --cpus="2"   --network="hermes-net"   -v $WORKSPACE_DIR:/workspace:rw   -v /tmp/hermes-cache:/cache:ro   -e NODE_ENV=development   -e OPENAI_API_KEY=${OPENAI_API_KEY:?必须设置 OPENAI_API_KEY}   $SANDBOX_IMAGE

步骤 3:验证沙箱安全策略

启动沙箱后,运行以下命令验证安全策略是否生效:

# 测试文件隔离 - 应该被拒绝
cat /etc/shadow
# 输出: cat: /etc/shadow: Permission denied

# 测试网络限制
nc -zv internal.company.com 22
# 输出: 连接超时(根据策略配置)

# 测试资源限制
stress --vm-bytes 3g --vm-keep
# 输出: 进程被 OOM Killer 终止

# 验证工作目录访问
ls /workspace
# 输出: 项目文件列表(正常)

通过以上配置,项目获得了完整的沙箱保护,Agent 可以在安全可控的环境中执行各种操作。合理的沙箱配置既能充分发挥 Agent 的能力,又能确保宿主机的安全。下一章我们将探讨消息网关集成,了解如何将 Hermes Agent 接入聊天和协作平台。