Agent权限三分配置:用文件、工具、网络三层限制住执行范围
Agent权限三分配置的核心,是把“能碰哪些文件”“能调哪些工具”“能访问哪些网络地址”拆成三个独立维度,分别设好允许范围和默认拒绝策略。
只在一个地方写一句“允许执行”,等于没有配置;
三个维度分开管,越权时才能定位到底是哪一层放行过宽。
这套做法适用于给自动化运行、会调用工具、会读写本地文件的 Agent 收权限的场景。
下面按配置文件结构、逐层配置、越权排查和上线验证展开。
三层权限分别管什么
先把边界划清楚,避免三层混在一起:
- 文件层:Agent 能读、能写哪些目录。重点是写权限,读权限可以适当放宽,但敏感目录必须单独拒绝。
- 工具层:Agent 能调用哪些工具或命令,每个工具允许哪些参数范围。重点是禁止通配符式放行。
- 网络层:Agent 能访问哪些域名和端口。重点是默认拒绝,只放行明确需要的出口。
三层之间的关系是“与”,不是“或”:一次操作必须同时通过三层检查才允许执行。
任何一层拒绝,整体就拒绝。
配置前需要准备的信息
动手写配置前,先把下面几项列清楚,否则配出来要么过宽要么跑不通:
- Agent 的运行用户和进程启动方式,例如是否以
agent用户运行、工作目录在哪里。 - Agent 实际需要读写的目录清单,区分只读和可写。
- 需要调用的工具清单,以及每个工具的必要参数。
- 需要访问的外部服务域名和端口。
- 拒绝时的处理方式:是直接报错终止,还是记录日志后跳过。
建议先用一份最小清单跑通,再逐步加权限,而不是一开始就把常用目录全放开。
文件层:只给必要目录,写权限单独收紧
文件层配置建议写成白名单结构,未列出的路径一律拒绝。
下面是一个 YAML 示例,字段名可按你的 Agent 框架调整,逻辑不变:
filesystem:
default: deny
allow:
- path: /srv/agent/workspace
mode: read_write
- path: /srv/agent/input
mode: read_only
deny:
- path: /etc
- path: /root
- path: /home
- path: /srv/agent/workspace/.env
几个容易踩的点:
deny的优先级要高于allow,否则白名单里的父目录会把敏感子路径带进来。- 写权限尽量只给一个工作目录,输入目录保持只读。
- 路径要写绝对路径,避免 Agent 用
..跳出工作目录。 - 配置文件、密钥文件、
.env这类路径即使在工作目录内,也要显式拒绝。
配置完成后,用运行 Agent 的同一个用户手动验证一次:
sudo -u agent test -w /srv/agent/workspace && echo writable
sudo -u agent test -r /etc/shadow || echo denied
如果第一条输出 writable、第二条输出 denied,说明文件层基本生效。
工具层:按工具名放行,参数也要限制
工具层最常见的问题是只限制了工具名,没限制参数。
比如允许调用 shell,却不管它能执行什么命令,等于没限制。
配置思路是:工具名白名单加参数约束。
tools:
default: deny
allow:
- name: read_file
args:
path_prefix: /srv/agent/workspace
- name: http_get
args:
host_allow: [api.internal.example.net]
- name: shell
args:
command_allow: [git status, ls, cat]
timeout_seconds: 30
注意两点:
command_allow用完整命令前缀匹配,不要用正则通配,避免cat /etc/shadow这类拼接绕过。- 给工具设超时,防止长时间挂起占用资源。
如果 Agent 框架支持工具级审批,对写操作类工具开启二次确认会更稳。
网络层:默认拒绝,只放行明确出口
网络层建议在 Agent 进程所在环境做出口控制,而不是只依赖 Agent 自身配置。
常见做法是通过防火墙或代理白名单限制目标域名和端口。
以 iptables 为例,先默认拒绝出站,再按需放行:
sudo iptables -P OUTPUT DROP
sudo iptables -A OUTPUT -o lo -j ACCEPT
sudo iptables -A OUTPUT -d 10.0.0.20 -p tcp --dport 443 -j ACCEPT
执行前务必确认你有带外登录方式,默认拒绝出站可能把 SSH 会话之外的更新、监控一起断掉。
改完用下面命令检查规则是否生效:
sudo iptables -L OUTPUT -n -v
如果不想动系统防火墙,也可以在 Agent 配置里限制允许访问的域名,但这种方式依赖 Agent 自身遵守配置,安全性弱于网络层控制。
越权报错怎么定位
Agent 报权限错误时,先看错误发生在哪一层,不要一上来就放宽配置:
- 报
permission denied且带文件路径,查文件层白名单和deny规则。 - 报工具未授权或参数非法,查工具层工具名和参数约束。
- 报连接超时、域名解析失败,查网络层出口规则和 DNS 配置。
定位时可以临时把 default 改成允许,确认是配置问题还是代码问题,但验证完要立刻改回拒绝。
上线前做一次三层的联合验证
配置完成后,用真实任务跑一遍,重点确认三件事:
- 正常任务能完整跑通,说明白名单范围够用。
- 故意访问一个未授权目录、调用一个未授权工具、访问一个未放行域名,都应被拒绝并留下日志。
- 拒绝日志里能看出是哪一层拦截的,方便后续排查。
三层都验证通过,再逐步按需加权限。
权限配置不是一次写完就结束,每次给 Agent 加新工具或新目录,都要回头检查这三层是否仍然闭合。
常见疑问
只配文件层够不够? 不够。
文件层管不住工具参数和网络出口,三层缺一层,越权就有绕过口子。
白名单和黑名单怎么选? 优先白名单加默认拒绝。
黑名单需要穷举所有危险路径和命令,维护成本高且容易漏。
权限收紧后任务跑不通怎么办? 先看拒绝日志定位是哪一层拦截,再补最小必要权限,不要直接改成全部允许。