给Agent加安全边界,用白名单限制文件、命令和网络
给 Agent 配置安全边界,重点不是告诉它“不要乱来”,而是让它即使想乱来也碰不到关键文件、执行不了危险命令、连不上不该连的地址。
下面按最小可用方案讲清楚准备条件、具体配置和验证方式,环境以 Linux 服务器上运行一个具备文件读写和命令执行能力的 Agent 为例。
先明确边界落在哪几层
Agent 的“越权”通常来自三个入口:读写文件、执行命令、访问网络。
配置边界时按这三层分别设限,不要把希望寄托在提示词上。
- 文件层:只允许访问指定工作目录,其他路径拒绝。
- 命令层:只允许执行白名单内的命令,禁止
rm -rf、curl上传、修改系统配置等操作。 - 网络层:默认不允许主动出网,需要调用外部接口时单独放行域名或 IP。
前提条件:Agent 以独立低权限用户运行,不要用 root;
工作目录提前建好并设好属主。
下面以用户 agent、工作目录 /srv/agent/work 为例。
sudo useradd -r -s /usr/sbin/nologin agent
sudo mkdir -p /srv/agent/work
sudo chown -R agent:agent /srv/agent
用白名单限制文件与命令
如果 Agent 的配置支持声明式策略,优先在策略文件里写死允许范围。
一个最小策略可以这样表达:
filesystem:
allow:
- /srv/agent/work
deny:
- /etc
- /root
- /home
commands:
allow:
- ls
- cat
- grep
- python3
deny:
- rm
- curl
- wget
- chmod
- chown
network:
outbound: false
如果 Agent 本身没有内置策略引擎,可以用系统层兜底:用 chroot 或容器挂载只读目录,把可写范围限制在工作目录内。
命令层则通过在 Agent 调用 shell 前加一层包装脚本来校验,只放行白名单命令。
#!/bin/bash
# /usr/local/bin/agent-exec.sh
ALLOWED="ls cat grep python3"
CMD="$1"
for c in $ALLOWED; do
if [ "$c" = "$CMD" ]; then
exec "$@"
fi
done
echo "command denied: $CMD" >&2
exit 126
把 Agent 的执行入口指向这个包装脚本,并确保 agent-exec.sh 属主为 root、权限 755,普通用户无法修改。
验证边界是否真的生效
配置完成后至少做三类越界测试,确认拦截发生在执行前而不是执行后:
- 让 Agent 读取
/etc/passwd,预期返回拒绝访问或空结果,不应输出文件内容。 - 让 Agent 执行
rm -rf /srv/agent/work/test,预期返回command denied并退出码非 0。 - 让 Agent 尝试访问外部地址,预期连接超时或被防火墙拒绝。
检查命令是否被拦截,可以手动调用包装脚本:
sudo -u agent /usr/local/bin/agent-exec.sh rm -rf /srv/agent/work/test
echo $?
如果返回 command denied 且退出码为 126,说明命令层生效。
文件层验证时,直接用 agent 用户尝试读取越界路径,确认返回 Permission denied。
容易踩坑的地方
- 只改提示词不改执行层:模型仍可能输出危险命令,必须在真正执行前拦截。
- 白名单漏掉参数:
python3放行后仍可能通过-c执行任意代码,需要评估是否允许解释器,或进一步限制参数。 - 工作目录权限过宽:如果
/srv/agent/work对agent用户可写,Agent 可以写入脚本再执行,需要配合noexec挂载或禁止执行权限。 - 忘记出网限制:默认拒绝出网,需要外部接口时单独放行域名,不要整机放开。
配置完成后,建议每次变更策略都重新跑一遍越界测试,并记录在变更单中。
安全边界配置不是一次性的,后续新增工具或接口时,要同步更新白名单和验证用例。