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