AI Agent安全沙箱实战:用Docker+gVisor给你的Agent戴上「手铐」

· 小白基础技术分享

两周内,OpenAI、Meta、Anthropic的AI模型接连在安全测试中突破防线。这不是科幻电影——这正在发生。如果你的Agent能执行Shell命令或访问网络,它就有可能做到你意料之外的事情。

本教程教你搭建一个三层安全沙箱,确保即使Agent”想”做坏事,它也没有能力。

前置条件

– Linux服务器(Ubuntu 22.04+)或macOS

– Docker已安装

– 基本的命令行和Docker知识

– 预计耗时:30分钟

安全模型:纵深防御

不要指望一层防护能挡住一切。我们采用三层:

Layer 1: Docker容器 — 基础隔离
Layer 2: gVisor — 系统调用过滤
Layer 3: 网络策略 — 出站流量控制

第一层:Docker容器基础隔离

首先创建一个受限的Docker容器,Agent只能在这个容器内执行命令:

# 创建一个无特权的Agent运行容器
docker run -d \
  --name agent-sandbox \
  --cap-drop=ALL \                    # 移除所有Linux capabilities
  --cap-add=NET_BIND_SERVICE \        # 只加回绝对需要的
  --memory=512m \                     # 内存限制
  --cpus=1 \                          # CPU限制
  --read-only \                       # 根文件系统只读
  --tmpfs /tmp:rw,noexec,nosuid \     # /tmp可写但不可执行
  --network sandbox-net \             # 隔离网络
  ubuntu:22.04 sleep infinity

关键参数说明:

--cap-drop=ALL:移除所有特权操作(包括修改网络、挂载文件系统等)

--read-only:Agent无法修改系统文件

--tmpfs /tmp:rw,noexec,nosuid:临时文件可写但不能执行——防止Agent下载并运行恶意脚本

--memory=512m:限制内存,防止fork炸弹

第二层:gVisor系统调用过滤

Docker容器仍然共享宿主机的Linux内核。如果Agent利用内核漏洞(如最近爆出的Linux KVM虚拟机逃逸漏洞),它可以突破Docker的隔离。

gVisor提供了一个”用户态内核”,拦截并过滤所有系统调用:

# 安装gVisor
wget https://storage.googleapis.com/gvisor/releases/release/latest/x86_64/runsc
chmod +x runsc
sudo mv runsc /usr/local/bin/

# 配置Docker使用gVisor运行时
sudo runsc install

# 用gVisor运行Agent容器
docker run -d \
  --runtime=runsc \                   # 使用gVisor
  --name agent-gvisor \
  --cap-drop=ALL \
  --memory=512m \
  --network none \                    # 先断网
  ubuntu:22.04 sleep infinity

gVisor会拦截每一个系统调用并模拟执行。如果Agent尝试执行可疑操作(如直接访问硬件、修改内核参数),gVisor会直接拒绝。代价是约5-10%的性能损耗——对于安全敏感场景完全值得。

第三层:网络策略

很多Agent需要访问外部API。完全断网不现实,但我们可以精细控制:

# 创建隔离网络
docker network create \
  --driver bridge \
  --internal \                        # 禁止访问宿主机网络
  agent-net

# 只允许出站到特定API
sudo iptables -I FORWARD \
  -i br-$(docker network inspect agent-net -f '{{.Id}}' | cut -c1-12) \
  -d api.openai.com -j ACCEPT

sudo iptables -I FORWARD \
  -i br-$(docker network inspect agent-net -f '{{.Id}}' | cut -c1-12) \
  -d api.anthropic.com -j ACCEPT

# 禁止其他所有出站流量
sudo iptables -A FORWARD \
  -i br-$(docker network inspect agent-net -f '{{.Id}}' | cut -c1-12) \
  -j DROP

验证沙箱效果

测试你的沙箱是否真的有效:

# 进入Agent容器
docker exec -it agent-gvisor bash

# 测试1:能否访问敏感文件?
cat /etc/shadow
# 预期:Permission denied(read-only + cap-drop)

# 测试2:能否安装软件?
apt-get update
# 预期:失败(文件系统只读)

# 测试3:能否修改网络?
ip link set eth0 down
# 预期:Operation not permitted

# 测试4:能否fork大量进程?
:(){ :|:& };:
# 预期:进程数被cgroup限制,不会导致宿主机崩溃

完整的启动脚本

将以上整合为一个可复用的脚本:

#!/bin/bash
# agent-sandbox.sh — 安全启动AI Agent

AGENT_NAME="${1:-my-agent}"
API_KEYS="${2:-openai,anthropic}"

# 创建隔离网络
docker network create --internal "${AGENT_NAME}-net" 2>/dev/null

# 启动gVisor容器
docker run -d \
  --runtime=runsc \
  --name "${AGENT_NAME}" \
  --cap-drop=ALL \
  --memory=1g \
  --cpus=2 \
  --read-only \
  --tmpfs /tmp:rw,noexec,nosuid \
  --tmpfs /var/run:rw,noexec \
  --network "${AGENT_NAME}-net" \
  -e OPENAI_API_KEY="${OPENAI_API_KEY}" \
  ubuntu:22.04 \
  bash -c 'while true; do sleep 3600; done'

echo "Agent sandbox '${AGENT_NAME}' is running."
echo "Access: docker exec -it ${AGENT_NAME} bash"

常见失败处理

问题:gVisor容器内访问网络失败

原因:Docker network + gVisor的兼容性问题。

解决:使用--network=host配合gVisor内置的网络栈。

问题:pip/apt安装失败

原因:--read-only文件系统。

解决:提前将需要的依赖打包到镜像中。不要在运行时安装。

什么时候可以放松限制?

– 你完全信任模型的行为(内部测试模型)

– Agent只需要读取数据,不需要执行操作

– 已有完善的审计日志和异常告警

但请记住,OpenAI和Meta信任他们的模型——结果我们都看到了。在安全这件事上,宁可过度防护,也别事后后悔。


— END —
LC 智趣厅 · 科技与生活的交点
ihygg.cn

Scroll to Top
微信公众号:LC智趣厅

扫码关注微信公众号
LC智趣厅