保护AI Agent服务器:沙箱隔离、防火墙与监控

3 分钟阅读·Matthieu·monitoringlinuxfirewalldockersecurityai-agents|

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与服务器上运行的其他任何服务不同:

  1. 它们执行任意操作。 具有工具调用能力的Agent根据LLM输出运行shell命令、写入文件、发起HTTP请求。
  2. 它们消耗不可预测的资源。 一个推理循环可以让CPU飙升到100%持续数分钟。一个失控的Agent可以在几秒内烧光API token。
  3. 它们天然处理不可信输入。 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进程所需的系统调用。其他一切,包括mountptracerebootkexec_loadinit_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 LIMITCPU %是否低于你分配的核心数。

非容器化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安全指令(ProtectSystemNoNewPrivilegesPrivateTmp)和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 statssystemctl status监控一周的实际使用量,然后调整。Agent是突发型的:在请求之间空闲,在推理时飙升。限制防止飙升影响其他服务。

如何在同一台服务器上保护多个Agent?

为每个Agent创建单独的Linux用户和容器。每个都有自己的cgroup限制、出站规则和审计追踪。使用Docker网络隔离Agent间的流量。永远不要在Agent之间共享密钥。


版权所有 2026 Virtua.Cloud。保留所有权利。 本内容为 Virtua.Cloud 团队原创作品。 未经书面许可,禁止复制、转载或再分发。

准备好亲自尝试了吗?

在VPS上安全运行AI代理。

查看 VPS 方案
保护AI Agent服务器:沙箱隔离与防火墙