feat(sandbox): Docker 一次性容器执行隔离边界(步骤 6-7)
引入两类安全边界:统一审批=授权边界(上一提交),一次性 Docker
容器=执行隔离边界(本提交)。LLM 即使执行恶意代码也只能在受限容器
内运行。
spec.rs: 新增 SandboxSpec(profile/network/memory/cpus/pids_limit/
read_only),默认 profile=local 不启用容器。
executor.rs: 按 sandbox.profile 选择执行后端
- local: 本地 spawn(env_clear + 白名单注入)
- stdio: ias-stdio-runner,--network none --read-only --cap-drop ALL
--security-opt no-new-privileges,仅 bind mount 工具二进制(ro)+tmpfs /tmp
- network: ias-network-runner(预留自行联网工具)
- builder: ias-tool-builder(供 tool_manager 编译)
全局开关 IAS_DOCKER_SANDBOX=1,未启用时行为不变(向后兼容)。
tool_manager: build_tool 支持 IAS_DOCKER_BUILDER=1 在 ias-tool-builder
容器内离线编译(--network none,挂载 tool_dir 到 /work)。
docker/: 三类 Dockerfile + build-images.sh 构建脚本。
- stdio-runner: debian-slim + ca-certificates,无网络只读
- network-runner: 预留联网工具
- tool-builder: rust:1.88-slim 预缓存 serde_json,支持离线编译
spec 迁移: 17 个普通工具追加 sandbox.profile: stdio;tool_manager
保持 local(自身在宿主操作文件系统)。
端到端验证: datetime 工具本地模式 +08:00,Docker 模式 +00:00(UTC),
--rm 无容器残留。
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
# ias-network-runner — 允许联网的工具运行环境
|
||||
# 供需要自行发起 HTTP 的工具使用(当前工具均通过宿主 http 消息代理联网,
|
||||
# 此镜像为将来工具直接联网预留)。运行时仍可按需 --network none。
|
||||
FROM debian:bookworm-slim
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends ca-certificates curl \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
ENTRYPOINT []
|
||||
@@ -0,0 +1,7 @@
|
||||
# ias-stdio-runner — 运行普通 stdio 工具的极简隔离环境
|
||||
# 无网络、只读根、低权限。工具二进制通过 bind mount 提供,镜像本身不含工具。
|
||||
FROM debian:bookworm-slim
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends ca-certificates \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
ENTRYPOINT []
|
||||
@@ -0,0 +1,10 @@
|
||||
# ias-tool-builder — tool_manager 编译 Rust 工具的隔离环境
|
||||
# 预缓存 serde_json(tool_manager 生成工具的唯一依赖),支持 --network none 离线编译。
|
||||
# 运行时由 tool_manager 挂载 tool_dir 到 /work,cargo 在 /work 内编译,产物写回宿主。
|
||||
FROM rust:1.88-slim
|
||||
RUN cargo new /tmp/seed && cd /tmp/seed \
|
||||
&& printf 'serde_json = "1.0"\n' >> Cargo.toml \
|
||||
&& cargo build --release \
|
||||
&& rm -rf /tmp/seed
|
||||
WORKDIR /work
|
||||
ENTRYPOINT []
|
||||
Executable
+16
@@ -0,0 +1,16 @@
|
||||
#!/usr/bin/env bash
|
||||
# 构建三类沙箱基础镜像。无需为每个工具单独写 Dockerfile。
|
||||
set -euo pipefail
|
||||
cd "$(dirname "$0")" # docker/
|
||||
|
||||
echo "=== 构建 ias-stdio-runner(无网络只读容器)==="
|
||||
docker build -t ias-stdio-runner -f Dockerfile.stdio-runner .
|
||||
|
||||
echo "=== 构建 ias-network-runner(联网容器)==="
|
||||
docker build -t ias-network-runner -f Dockerfile.network-runner .
|
||||
|
||||
echo "=== 构建 ias-tool-builder(Rust 编译容器)==="
|
||||
docker build -t ias-tool-builder -f Dockerfile.tool-builder .
|
||||
|
||||
echo "=== 完成 ==="
|
||||
docker images | grep -E '^ias-(stdio|network|tool)'
|
||||
Reference in New Issue
Block a user