保护AI Agent服务器:沙箱隔离、防火墙与监控
AI Agent执行任意操作、消耗不可预测的资源、处理不可信的输入。本指南将每种威胁映射到具体的Linux控制措施,附带经过测试的命令。
AI Agent不是普通服务。Web服务器处理可预测的HTTP请求。AI Agent执行任意工具调用、生成子进程、发起出站API请求,并以不可预测的方式消耗资源。如果prompt injection(提示词注入)攻击成功,Agent就变成了一个拥有你赋予权限的攻击者。
本指南将每个AI Agent视为不可信代码。每一节从一个具体威胁开始,然后映射到一个可验证的Linux控制措施。这些命令适用于运行Debian 12或Ubuntu 22.04+的任何VPS,兼容任何Agent框架:OpenClaw、Claude Code、n8n、LangChain、CrewAI或自定义方案。
前置条件: 一台有root权限的VPS,基本的Linux和SSH知识(VPS安全基础涵盖了基线配置),以及至少一个你想要加固的AI Agent。本指南假设你已完成初始服务器加固(SSH加固)。
AI Agent为什么是不同的安全威胁?
传统服务有一组有限的行为。Nginx进程提供文件服务和代理请求。AI Agent的行为取决于它的输入,而输入不受你控制。三个属性使Agent与服务器上运行的其他任何服务不同:
- 它们执行任意操作。 具有工具调用能力的Agent根据LLM输出运行shell命令、写入文件、发起HTTP请求。
- 它们消耗不可预测的资源。 一个推理循环可以让CPU飙升到100%持续数分钟。一个失控的Agent可以在几秒内烧光API token。
- 它们天然处理不可信输入。 Agent存在的意义就是接受自然语言并据此行动。
| 威胁 | 攻击向量 | 影响 | 控制措施 |
|---|---|---|---|
| Shell命令执行 | 通过用户输入或工具输出的prompt injection | 系统完全被攻破 | 用户隔离、容器沙箱 |
| 数据泄露 | Agent通过HTTP/DNS将密钥发送到攻击者域名 | 凭据窃取、数据泄露 | 出站防火墙、DNS过滤 |
| 资源耗尽 | 无限推理循环或递归工具调用 | 服务器崩溃、其他服务宕机 | cgroup CPU/内存限制 |
| 凭据泄漏 | Agent记录或记忆环境变量中的API密钥 | API密钥被盗、横向移动 | 密钥注入、环境隔离 |
| 横向移动 | 被攻破的Agent转向其他服务 | 整个基础设施被攻破 | 网络分段、最小权限 |
如何用专用Linux用户隔离AI Agent?
为每个Agent创建一个专用系统用户,不提供登录shell、不给sudo权限、限制home目录。这是最简单但影响最大的控制措施。如果Agent被攻破,攻击者只继承该用户的权限,而非root。
sudo useradd --system --create-home --shell /usr/sbin/nologin agent-worker
锁定home目录,防止其他用户读取Agent的文件:
sudo chmod 750 /home/agent-worker
验证用户已创建且shell正确:
getent passwd agent-worker
输出显示如下输出:
agent-worker:x:998:998::/home/agent-worker:/usr/sbin/nologin
注意看:shell是/usr/sbin/nologin。这意味着没有人能以这个用户SSH登录或打开交互式会话。Agent进程通过systemd以该用户身份运行,而非通过登录。
如果你的Agent需要写入临时文件,创建一个专用目录:
sudo mkdir -p /home/agent-worker/tmp
sudo chown agent-worker:agent-worker /home/agent-worker/tmp
sudo chmod 700 /home/agent-worker/tmp
验证权限:
ls -la /home/agent-worker/
效果说明: 即使攻击者通过prompt injection获得了代码执行能力,他们也被限制在/home/agent-worker中,无法读取其他用户的文件、提权到root或修改系统二进制文件。
如何在Docker容器中沙箱化AI Agent?
在Docker容器中运行Agent增加了第二层隔离边界。容器拥有自己的文件系统、进程命名空间和网络栈。配合安全标志,即使Agent被攻破并获得代码执行能力,也能限制其行为。
AI Agent应使用哪些Docker安全标志?
使用Agent能容忍的所有限制。从最严格的锁定开始,只放宽导致故障的部分。以下是AI Agent的生产级docker run命令:
docker run -d \
--name ai-agent \
--user 1000:1000 \
--read-only \
--tmpfs /tmp:size=100M,noexec,nosuid \
--cap-drop ALL \
--security-opt no-new-privileges:true \
--security-opt seccomp=/etc/docker/seccomp-agent.json \
--memory 2g \
--memory-swap 2g \
--cpus 1.5 \
--pids-limit 100 \
--network agent-net \
--restart unless-stopped \
--env-file /etc/agent/env \
your-agent-image:latest
各标志的作用:
| 标志 | 用途 | 对Agent安全的意义 |
|---|---|---|
--user 1000:1000 |
在容器内以非root身份运行 | 防止通过root漏洞突破容器 |
--read-only |
根文件系统只读 | 阻止恶意软件安装、配置篡改 |
--tmpfs /tmp:size=100M,noexec,nosuid |
可写临时目录但禁止执行 | Agent可以写临时文件但无法从/tmp执行二进制文件 |
--cap-drop ALL |
移除所有Linux capabilities | 没有CAP_NET_RAW(抓包)、没有CAP_SYS_ADMIN(挂载)等 |
--security-opt no-new-privileges:true |
阻止通过setuid提权 | 阻止被攻破的Agent通过setuid二进制文件获得root |
--pids-limit 100 |
限制进程数量 | 防止失控Agent发起fork bomb |
--memory 2g / --memory-swap 2g |
硬性内存上限,无swap | 防止OOM killer终止其他服务 |
--cpus 1.5 |
CPU限制 | Agent无法抢占其他服务的资源 |
验证容器以正确的安全设置运行:
docker inspect ai-agent --format '{{.HostConfig.SecurityOpt}}'
预期输出:
[no-new-privileges:true seccomp=/etc/docker/seccomp-agent.json]
检查是否以非root身份运行:
docker exec ai-agent whoami
返回值应该是非root用户,不是root。
AI Agent的自定义seccomp配置
Docker默认的seccomp配置阻止约44个危险系统调用。对于AI Agent,可以进一步收紧。创建/etc/docker/seccomp-agent.json:
{
"defaultAction": "SCMP_ACT_ERRNO",
"defaultErrnoRet": 1,
"archMap": [
{
"architecture": "SCMP_ARCH_X86_64",
"subArchitectures": ["SCMP_ARCH_X86", "SCMP_ARCH_X32"]
}
],
"syscalls": [
{
"names": [
"read", "write", "close", "fstat", "lseek", "mmap", "mprotect",
"munmap", "brk", "rt_sigaction", "rt_sigprocmask", "ioctl",
"access", "pipe", "select", "sched_yield", "mremap", "msync",
"mincore", "madvise", "dup", "dup2", "nanosleep", "getpid",
"socket", "connect", "sendto", "recvfrom", "sendmsg", "recvmsg",
"bind", "listen", "accept", "getsockname", "getpeername",
"setsockopt", "getsockopt", "clone", "execve", "exit",
"wait4", "kill", "uname", "fcntl", "flock", "fsync",
"fdatasync", "truncate", "ftruncate", "getdents", "getcwd",
"chdir", "openat", "newfstatat", "readlinkat", "fchmodat",
"set_tid_address", "exit_group", "epoll_wait", "epoll_ctl",
"tgkill", "futex", "set_robust_list", "get_robust_list",
"epoll_create1", "pipe2", "clock_gettime", "clock_nanosleep",
"prlimit64", "getrandom", "memfd_create", "statx",
"rseq", "close_range", "poll", "getuid", "getgid",
"geteuid", "getegid", "arch_prctl", "sigaltstack",
"rt_sigreturn", "accept4", "pread64", "pwrite64",
"writev", "readv", "sched_getaffinity"
],
"action": "SCMP_ACT_ALLOW"
}
]
}
这个配置只允许典型Python/Node.js Agent进程所需的系统调用。其他一切,包括mount、ptrace、reboot、kexec_load和init_module,都会返回权限错误。
设置配置文件的正确权限:
sudo chmod 644 /etc/docker/seccomp-agent.json
sudo chown root:root /etc/docker/seccomp-agent.json
测试容器是否能使用自定义配置启动:
docker run --rm --security-opt seccomp=/etc/docker/seccomp-agent.json alpine echo "seccomp works"
如果你看到seccomp works,说明配置有效。
关于更深入的Docker加固(包括rootless模式),参见Docker安全加固。关于Docker/UFW交互问题,参见Docker UFW修复。
如何阻止AI Agent访问互联网?
威胁: 被攻破的Agent通过出站HTTP请求将密钥发送到攻击者控制的服务器,或在DNS查询中编码数据。默认UFW允许所有出站流量。
设置出站流量默认拒绝策略,然后只放行Agent需要的端点:
sudo ufw default deny outgoing
sudo ufw default deny incoming
允许必要的出站流量:
# DNS resolution (required for all outbound)
sudo ufw allow out 53/udp
# Allow outbound HTTPS to reach AI provider APIs
sudo ufw allow out 443/tcp
# Allow outbound HTTP for package updates only
sudo ufw allow out 80/tcp
允许入站SSH(避免把自己锁在外面):
sudo ufw allow in 22/tcp
启用防火墙:
sudo ufw enable
验证规则:
sudo ufw status verbose
你应该在顶部看到Default: deny (incoming), deny (outgoing),后面是你的允许规则。
如何只放行Agent需要的API端点?
上面的规则仍然允许出站HTTPS到任意目标。要更严格地控制,需要将出站流量限制到特定IP范围。这需要iptables,因为UFW不支持按域名过滤目标。
首先,解析你的AI服务商的API端点:
dig +short api.anthropic.com
dig +short api.openai.com
然后为这些IP创建iptables规则。创建/etc/iptables/agent-egress.rules:
#!/bin/bash
# Agent egress whitelist - update IPs when providers change
# Anthropic API (check current IPs with: dig +short api.anthropic.com)
ANTHROPIC_IPS="104.18.0.0/16"
# Drop all outbound from agent user except whitelisted destinations
iptables -A OUTPUT -m owner --uid-owner agent-worker -d $ANTHROPIC_IPS -p tcp --dport 443 -j ACCEPT
iptables -A OUTPUT -m owner --uid-owner agent-worker -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -m owner --uid-owner agent-worker -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -m owner --uid-owner agent-worker -j DROP
sudo chmod 700 /etc/iptables/agent-egress.rules
sudo bash /etc/iptables/agent-egress.rules
验证Agent用户无法访问任意主机:
sudo -u agent-worker curl -s --max-time 5 https://example.com && echo "FAIL: egress not blocked" || echo "OK: egress blocked"
预期输出是OK: egress blocked。
DNS泄露说明: 上述规则允许53端口的DNS。高级攻击者可以在DNS查询中编码数据,将密钥作为子域名发送(例如sk-ant-api-key.attacker.com)。要堵住这个漏洞,将Agent的DNS指向一个本地解析器如unbound,并配置响应策略区(RPZ)来阻止对非白名单域名的查询。
安装并配置本地解析器:
sudo apt install -y unbound
编辑/etc/unbound/unbound.conf.d/agent-dns.conf:
server:
interface: 127.0.0.1
access-control: 127.0.0.0/8 allow
# Only allow resolution of specific domains
local-zone: "." deny
local-zone: "anthropic.com." transparent
local-zone: "openai.com." transparent
local-zone: "ubuntu.com." transparent
local-zone: "debian.org." transparent
sudo systemctl enable --now unbound
sudo systemctl status unbound
然后将Agent的容器或systemd服务配置为使用127.0.0.1作为DNS解析器,而不是系统默认值。在Docker中,向docker run命令添加--dns 127.0.0.1。
如何对AI Agent的API端点进行速率限制?
威胁: 暴露的Agent API端点被机器人大量访问,或遭受自动化prompt injection攻击。没有速率限制的情况下,每个请求都会触发昂贵的LLM API调用。
如果你通过Nginx暴露Agent,在反向代理层添加速率限制。在Nginx配置中添加:
http {
# 10 requests per second per IP for agent endpoints
limit_req_zone $binary_remote_addr zone=agent_api:10m rate=10r/s;
# Stricter limit for prompt submission endpoints
limit_req_zone $binary_remote_addr zone=agent_prompt:10m rate=2r/s;
server {
listen 443 ssl;
server_name agent.example.com;
location /api/agent/ {
limit_req zone=agent_api burst=20 nodelay;
limit_req_status 429;
proxy_pass http://127.0.0.1:8080;
}
location /api/agent/prompt {
limit_req zone=agent_prompt burst=5 nodelay;
limit_req_status 429;
proxy_pass http://127.0.0.1:8080;
}
}
}
测试配置:
sudo nginx -t && sudo systemctl reload nginx
通过发送快速请求验证速率限制是否生效:
for i in $(seq 1 30); do curl -s -o /dev/null -w "%{http_code}\n" https://agent.example.com/api/agent/; done
你应该先看到200响应,然后在达到限制后看到429响应。
如何限制AI Agent的CPU和内存使用?
威胁: 推理循环或递归工具调用使CPU飙升到100%持续数分钟。没有限制的话,Agent会抢占SSH、监控和其他服务的资源。在共享VPS上,这可能触发服务商的节流或自动暂停。
Docker资源限制
如果Agent在Docker中运行,上面容器部分的--memory和--cpus标志已经处理了这个问题。验证限制是否生效:
docker stats ai-agent --no-stream
检查MEM USAGE是否低于MEM LIMIT,CPU %是否低于你分配的核心数。
非容器化Agent的systemd cgroup限制
如果Agent直接在主机上运行(不在Docker中),使用systemd来执行cgroup v2限制。创建一个带有资源控制的systemd服务:
sudo systemctl edit --force --full ai-agent.service
[Unit]
Description=AI Agent Service
After=network.target
[Service]
Type=simple
User=agent-worker
Group=agent-worker
WorkingDirectory=/home/agent-worker
ExecStart=/home/agent-worker/run-agent.sh
Restart=on-failure
RestartSec=10
# Resource limits
MemoryMax=2G
MemoryHigh=1536M
CPUQuota=150%
TasksMax=100
# Security hardening
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=tmpfs
PrivateTmp=true
ReadWritePaths=/home/agent-worker/data
# Secrets
EnvironmentFile=/etc/agent/env
[Install]
WantedBy=multi-user.target
MemoryMax=2G是硬性上限。如果Agent超过此值,OOM killer会终止它。MemoryHigh=1536M是软限制。内核在超过此阈值时会积极回收内存,在Agent达到硬上限之前使其减速。CPUQuota=150%允许使用1.5个CPU核心。TasksMax=100防止fork bomb。
启用并启动服务:
sudo systemctl enable --now ai-agent.service
enable使其在重启后自动启动。--now立即启动。
验证服务运行状态和限制是否生效:
sudo systemctl status ai-agent.service
检查cgroup限制:
systemctl show ai-agent.service | grep -E "(MemoryMax|CPUQuota|TasksMax)"
预期输出:
MemoryMax=2147483648
CPUQuota=150%
TasksMax=100
如何管理AI Agent的密钥而不泄露?
威胁: Agent记录其环境变量(许多框架在debug模式下会这样做)、将API密钥包含在LLM上下文中,或将凭据写入临时文件。拥有Agent内存或日志读取权限的攻击者可以获取所有密钥。
永远不要将密钥放在Agent的配置文件、Dockerfile或命令行参数中。使用具有严格权限的环境文件。
创建密钥文件:
sudo mkdir -p /etc/agent
sudo touch /etc/agent/env
sudo chmod 600 /etc/agent/env
sudo chown root:root /etc/agent/env
添加你的密钥:
sudo tee /etc/agent/env > /dev/null << 'EOF'
ANTHROPIC_API_KEY=sk-ant-your-key-here
AGENT_DB_PASSWORD=replace-with-generated-password
EOF
生成强密码,不要自己编造:
openssl rand -base64 32
systemd服务通过EnvironmentFile=/etc/agent/env引用此文件。Agent进程接收这些变量,但无法直接读取文件本身(归root所有,权限600)。systemd读取文件并将变量传递给进程。
验证文件权限:
ls -la /etc/agent/env
预期结果:-rw------- 1 root root。只有root可以读取。
轮换: 当你轮换密钥时,更新/etc/agent/env并重启服务:
sudo systemctl restart ai-agent.service
Agent会获取新值,无需修改任何配置文件。
如何监控Linux服务器上的AI Agent活动?
威胁: 被攻破或异常的Agent静默运行。没有监控的话,你会在API账单到来或服务器被标记滥用时才发现问题。
实时资源监控
实时查看资源使用:
journalctl -u ai-agent.service -f
这会实时输出Agent的stdout/stderr。按Ctrl+C停止。
对于Docker容器:
docker logs -f ai-agent
实时监控CPU和内存:
docker stats ai-agent
AI Agent进程应设置哪些auditd规则?
安装auditd:
sudo apt update && sudo apt install -y auditd
创建Agent专用的审计规则。添加到/etc/audit/rules.d/agent.rules:
# Monitor all commands executed by the agent user
-a exit,always -F arch=b64 -S execve -F uid=998 -k agent-exec
# Monitor file access in sensitive directories
-a exit,always -F arch=b64 -S openat -F dir=/etc -F uid=998 -k agent-etc-access
# Monitor network connections by agent user
-a exit,always -F arch=b64 -S connect -F uid=998 -k agent-network
# Monitor file permission changes by agent user
-a exit,always -F arch=b64 -S chmod,fchmod,fchmodat -F uid=998 -k agent-chmod
将uid=998替换为Agent用户的实际UID。查询方法:
id -u agent-worker
加载新规则:
sudo augenrules --load
sudo systemctl enable --now auditd
验证规则是否生效:
sudo auditctl -l | grep agent
输出显示你的四条规则。
搜索Agent执行事件:
sudo ausearch -k agent-exec --start recent
自动告警
在生产环境中,设置一个简单的监控脚本在资源使用过高时告警。创建/usr/local/bin/agent-watchdog.sh:
#!/bin/bash
# Alert if agent container exceeds 90% memory
USAGE=$(docker stats ai-agent --no-stream --format "{{.MemPerc}}" | tr -d '%')
THRESHOLD=90
if (( $(echo "$USAGE > $THRESHOLD" | bc -l) )); then
logger -t agent-watchdog "ALERT: ai-agent memory at ${USAGE}%"
fi
sudo chmod 755 /usr/local/bin/agent-watchdog.sh
通过cron或systemd timer每分钟运行一次。告警会出现在syslog中,你可以将其转发到监控系统。
如何安全更新AI Agent软件?
威胁: 未打补丁的Agent软件包含已知漏洞。但在会话中途更新可能破坏状态或中断正在运行的工作流。
对于基于Docker的Agent,更新过程是原子性的:
# Pull the new image
docker pull your-agent-image:latest
# Stop the old container
docker stop ai-agent
# Remove the old container
docker rm ai-agent
# Start with the same flags (use the docker run command from above)
docker run -d \
--name ai-agent \
# ... same flags as before ...
your-agent-image:latest
对于非容器化Agent:
# Check for updates to the agent
sudo systemctl stop ai-agent.service
# Update the agent (varies by framework)
# pip install --upgrade agent-framework
# npm update -g agent-tool
# Restart
sudo systemctl start ai-agent.service
# Verify it is running
sudo systemctl status ai-agent.service
生产建议: 在负载均衡器后运行两个Agent实例。逐个更新。如果更新后的实例未通过健康检查,回滚到先前版本。
单独为主机OS打补丁:
sudo apt update && sudo apt upgrade -y
启用自动安全更新:
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
加固前后对比:攻击者看到的变化
在未加固的服务器上,Agent以root身份运行,没有容器和防火墙:
- 完整文件系统访问:读取
/etc/shadow、SSH密钥、其他用户的数据 - 不受限的出站访问:向任意目标泄露数据
- 所有系统调用可用:挂载文件系统、加载内核模块、嗅探网络流量
- 无限资源:用fork bomb或内存泄漏使服务器崩溃
- 持久化访问:安装后门、添加SSH密钥、创建新用户
应用本指南中的每项控制措施后:
- 被限制在
/home/agent-worker中,无法访问系统文件 - 出站HTTPS仅限白名单中的API端点
- 约80个系统调用可用(从300+减少),没有mount/ptrace/reboot
- 硬性上限2 GB内存和1.5个CPU核心,100个进程限制
- 只读文件系统,无法安装软件或持久化修改
- auditd记录每条命令,提供可搜索的审计追踪
Agent仍然正常工作。它可以调用LLM API、处理输入、返回输出。但被攻破的Agent无法逃出它的沙箱。
遇到问题了?
| 现象 | 可能原因 | 修复方法 |
|---|---|---|
| 容器立即退出 | Seccomp配置过于严格 | 临时使用--security-opt seccomp=unconfined运行,检查dmesg中被阻止的系统调用,将它们添加到你的配置中 |
| Agent无法访问API | 出站防火墙阻止了出站连接 | 检查sudo ufw status,确认目标IP被允许 |
| Agent被OOM终止 | 内存限制过低 | 增加MemoryMax或--memory,用docker stats检查Agent的实际峰值使用量 |
auditd没有记录日志 |
规则未加载或UID错误 | 运行sudo auditctl -l验证,检查UID是否匹配Agent用户 |
Nginx返回429错误 |
速率限制过严 | 增加burst值,检查是否预期会有合理的流量高峰 |
| Agent无法写入临时文件 | 使用了--read-only但没有--tmpfs |
在Docker run命令中添加--tmpfs /tmp:size=100M |
首先检查Agent日志:
# Systemd service
journalctl -u ai-agent.service -n 50 --no-pager
# Docker container
docker logs --tail 50 ai-agent
检查审计日志中被阻止的操作:
sudo ausearch -k agent-exec --start today -i
常见问题
可以安全地以root身份运行AI Agent吗?
不可以。以root身份运行Agent意味着任何prompt injection都会给攻击者完整的系统控制权。没有任何补偿控制措施能使以root身份运行变得可接受。始终使用专用的非root用户。
必须使用Docker才能保护AI Agent吗?
不是必须的。Linux用户隔离、systemd安全指令(ProtectSystem、NoNewPrivileges、PrivateTmp)和cgroup限制在没有Docker的情况下也能提供强隔离。Docker增加了一个容器边界,作为纵深防御很有价值。如果可以就使用它,但仅靠用户隔离就能阻止大多数prompt-injection-to-root-shell攻击。
应该给AI Agent分配多少CPU?
在8 GB的VPS上,从1-2个CPU核心开始(systemd中CPUQuota=150%或Docker中--cpus 1.5),配2 GB内存。用docker stats或systemctl status监控一周的实际使用量,然后调整。Agent是突发型的:在请求之间空闲,在推理时飙升。限制防止飙升影响其他服务。
如何在同一台服务器上保护多个Agent?
为每个Agent创建单独的Linux用户和容器。每个都有自己的cgroup限制、出站规则和审计追踪。使用Docker网络隔离Agent间的流量。永远不要在Agent之间共享密钥。
版权所有 2026 Virtua.Cloud。保留所有权利。 本内容为 Virtua.Cloud 团队原创作品。 未经书面许可,禁止复制、转载或再分发。