公司最近请来一位全能维修工小 A,他专业技能精湛,能自动检修流水线、写自动化脚本、调用各种外部工具。他一个人就能顶一个班组,可问题也随之而来:兴奋起来会同时开五台机器把电闸拉跳,溜达起来可能误闯机密档案室,稍不留神还可能把客户数据“顺手”传出去。自主 Agent 正是这样一位“全能但需要边界”的高手。安全沙箱,就是公司为他专门打造的一座透明工作间:里面的工具刚好够完成眼前的任务,网络只有一部专线电话,门禁只开放几个房间,所有动作都被全程记录;一旦行为越界,总电闸会立刻切断。Docker 容器、文件系统隔离、网络隔离和 API 权限管控,正是搭起这座“工作间”的七根柱子。本文从小 A 上班的第一天讲起,把每根柱子一根根讲明白,也让你学会:如何用同样的思路,给 AI Agent 装上可靠护栏。

岗位关联

掌握安全沙箱,是让自主 Agent 从“实验室玩具”走向“生产工具”的护身符。对 AI 工程师而言,它是模型能力安全落地必备的护栏,也是自动化系统交付中最有含金量的一环。

目录
  1. 可视化演示
  2. 资源隔离——给“维修工”装上限流器
  3. 权限最小化——只发一张“临时工牌”
  4. Docker 容器化——把工作间装进标准集装箱
  5. 文件系统隔离——看不见,就谈不上泄露
  6. 网络隔离——只留一部“专线电话”
  7. API 权限管控——每一次请求都要过闸机
  8. 异常处置——监控室里的红灯
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示给自主Agent装上安全沙箱的核心机制,通过概览/流程/对比/趋势四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

给自主Agent装上安全沙箱:安全沙箱 安全沙箱隔离原理与防护目标 Docker容器化部署与资源隔 核心机制可视化 给自主Agent装上安全沙箱整体架构与关键组件

资源隔离——给“维修工”装上限流器

全能维修工小 A 上岗第二天就闹了笑话:他同时启动六台电动工具,厂区电闸“啪”地跳掉,正在运行的生产线全部黑屏。问题不是他不够专业,而是没人告诉他:这里每一路电都有功率上限。自主 Agent 也是如此,它能同时开启大量线程、占用满额 CPU 和内存,若不加限制,就会像小 A 一样把整个系统拖垮。

解决思路与工厂给工作间装限流器如出一辙。Linux 的 cgroup 就是一台看不见的“限流器”:它可以为进程组设定 CPU 时间配额、内存上限、IO 带宽,还能通过 namespace 隔离进程视图,让容器里的 Agent 连宿主机上有哪些进程都看不到。Docker 在启动容器时,正是把 --cpus 和 --memory 参数转化为 cgroup 规则落到内核。

举个例子,你在 Docker 中启动自主编程 Agent,执行 docker run --cpus=1 --memory=1g my-agent,它最多只能用一个 CPU 核和 1GB 内存。即便 Agent 写出再疯狂的代码,内核也会在资源超限的那一刻直接阻止。

工厂给工作间装上功率表后,小 A 再也没拉跳过电闸;跑在沙箱里的 Agent 也一样,哪怕手握“百宝工具箱”,也消耗不了超过配额一瓦特的算力。对它而言,安全边界就像工厂的限流器——权力很大,上限却非常清晰。

CPU 占比=该容器 cpu.shares 权重∑i=1n第 i 个容器的 cpu.shares 权重\text{CPU 占比} = \frac{\text{该容器 cpu.shares 权重}}{\sum_{i=1}^{n} \text{第 } i \text{ 个容器的 cpu.shares 权重}}
当多个容器争抢 CPU 时,这个比值决定 Agent 能分到多少 CPU 时间;权重越大,获得的算力越多。
  1. 分子权重当前容器被分配的 cpu.shares 值,如 512 或 1024,表示它在资源竞争中的“话语权”。
    该容器 cpu.shares 权重\text{该容器 cpu.shares 权重}
  2. 分母总和宿主机上所有运行中容器的权重之和,相当于“分蛋糕”的总盘子大小。
    ∑i=1n第 i 个容器的 cpu.shares 权重\sum_{i=1}^{n} \text{第 } i \text{ 个容器的 cpu.shares 权重}
  3. 比例计算分子除以分母得到该容器占用 CPU 的份额比例,是 cgroup 动态调度的依据。
    分子分母=CPU 占比\frac{\text{分子}}{\text{分母}} = \text{CPU 占比}

权限最小化——只发一张“临时工牌”

小 A 办完入职手续,保安只递给他一张临时工牌:能刷开工作间、工具间和公共茶水间,但财务室、档案室、实验室的门禁统统打不开。物业经理开玩笑说:“在大楼里,我这张工牌连董事长办公室都刷不开。”正是这种“抠门”,让整栋楼有了最基本的安全感。

自主 Agent 的权限管理遵循同样的道理。它需要读文件、调 API、跑命令,但不需要触碰系统中的“机密档案室”。落地时,工程师会用非 root 用户运行容器,把文件系统设成只读,给 API Token 只配上必要的 scope——这就是最小权限原则。以 AI 编程 Agent 为例:它应该能改写项目代码,但不该有权限删除 /etc 下的系统配置;它能向代码仓库推送分支,但不能删库。

在一个 AI Agent 平台里,最安全的状态是:每新增一项任务,就去明确“完成这件事最少要哪些权限”,然后只授予这些权限,并在任务结束时收回。缺少任何一个权限,任务就无法推进;多出任何一项权限,都是埋给未来的风险。

临时工牌是有期限的,24 小时后自动失效。就算小 A 真被忽悠去刷财务室的门,门也不会开;即便他起了坏心思,第二天这张卡也会自然作废。这小小的“边界”,正是 Agent 与安全事故之间最重要的一道闸门。

授予的权限集合=⋃t∈任务所需最小权限(t)\text{授予的权限集合} = \bigcup_{t \in \text{任务}} \text{所需最小权限}(t)
Agent 能拿到的总权限,是各项任务“刚好够用”的权限的并集;缺一个任务完不成,多一个则增加风险。
  1. 任务集合中的 tAgent 的每个原子动作,比如“读取文件 A”“执行测试 B”“调用接口 C”。
    t∈任务t \in \text{任务}
  2. 所需最小权限(t)为完成一个任务而必须的最小权限集合,去掉任何一个功能就会失败。
    所需最小权限(t)\text{所需最小权限}(t)
  3. 并集合并把所有任务需求合并成一个总权限集合,保证每项任务都畅通且无冗余权限。
    ⋃t∈任务所需最小权限(t)\bigcup_{t \in \text{任务}} \text{所需最小权限}(t)

Docker 容器化——把工作间装进标准集装箱

公司规定:每位维修工的工具必须统一打包成标准集装箱,到了现场开箱即用。这解决了长期困扰行政部的难题——有人爱用锤子,有人只信电动螺丝刀,还有人带着一整套不明来历的改装设备。统一封装,才能统一管理安全边界。

Docker 容器就是 Agent 运行环境的“标准集装箱”。镜像里打包了 Python 解释器、依赖库、工具链和配置文件;容器是镜像的运行实例。AI Agent 平台把 Agent 的代码、工具和运行目录做成镜像,再部署到隔离容器中,无论是本地调试还是云端运行,环境完全一致,安全规则也被一并固化。

Docker 的安全加固并不复杂,只需注意几件事:用 docker run 时传入 --cpus、--memory 做资源限制;用 --read-only 把根文件系统设为只读;不添加 --privileged;用 --cap-drop=ALL 丢弃全部内核能力,再按需只放开必要的。镜像构建时,也要选用更新过的干净基础镜像,并定期扫描漏洞。

每个标准集装箱都自带铭牌:承载多少重量、最大堆叠层数,超限即拒收。Docker 容器正是用一致的打包方式,让安全措施能规模化落地——每一次构建、每一条限制规则,都像集装箱的编号一样可追溯、可审计。

容器内存上限=min⁡(–memory 参数, 宿主机可用内存)\text{容器内存上限} = \min(\text{--memory 参数},\ \text{宿主机可用内存})
容器可使用的最大内存,不会超过“配置参数”和“宿主机剩余内存”两者中较小的那个。
  1. --memory 参数管理员为容器设置的理想内存上限,比如 --memory=1g 表示 1GB。
    –memory 参数\text{--memory 参数}
  2. 宿主机可用内存物理机或虚拟机在当前时刻真正剩余的内存资源。
    宿主机可用内存\text{宿主机可用内存}
  3. min 取较小值若宿主机连 512MB 都不剩,即使配置了 2GB 上限,容器也会因宿主内存不足而无法启动或被杀掉。
    min⁡(–memory 参数, 宿主机可用内存)\min(\text{--memory 参数},\ \text{宿主机可用内存})

文件系统隔离——看不见,就谈不上泄露

如果小 A 抬眼就能看到总裁办电脑、伸手就能摸到财务室的保险柜,哪怕公司明文规定“不准碰”,也难免夜长梦多。于是办公室装修时,干脆把小 A 的工作电脑单独接了一张“工作盘”,里面只有配件清单和维修工单;机密档案室的门,从他的视野里彻底消失。

文件系统隔离做的正是这件“隐身衣”。通过只读挂载,把 Agent 不需要写的目录以 ro 方式挂进容器;利用命名空间,让 Agent 的进程看不到宿主机上的其他目录。对代码执行类 Agent,工作目录往往是一个临时目录(tmpfs),任务跑完即销毁,不留痕迹在磁盘上。

在 Docker 中,-v /host/data:/container/data:ro 把宿主机数据只读挂载进容器,--tmpfs /tmp 为临时文件提供内存盘。这样设置之后,Agent 想向系统目录写入文件,内核只会干脆地回答“权限不够”。想读不该读的路径?那个路径在它的世界里根本不存在。

看不见,就谈不上泄露。当小 A 的工作电脑里根本没有通往档案室的门时,哪怕是史上最强的黑客 Agent 也拿不到它看不到的数据;而那张唯一的“工作盘”,任务结束后被格式化,什么痕迹都不剩。

可写性={可写,读写挂载且路径已授权不可写,只读挂载或路径未授权\text{可写性} = \begin{cases} \text{可写}, & \text{读写挂载且路径已授权}\\ \text{不可写}, & \text{只读挂载或路径未授权} \end{cases}
文件系统能否写入,由挂载方式和授权清单共同决定;两个条件必须同时满足。
  1. 读写挂载 rw目录以可读写方式挂载,例如 -v ./code:/app:rw,表示允许修改。
    挂载为读写(rw)\text{挂载为读写(rw)}
  2. 路径已授权该路径明确出现在管理员允许写入的白名单中。
    路径在授权清单内\text{路径在授权清单内}
  3. 联合判定只有“读写挂载”且“路径已授权”同时成立才可写;任何一条不满足,写入即被拒绝。
    读写挂载∧路径已授权⇒可写\text{读写挂载} \wedge \text{路径已授权} \Rightarrow \text{可写}

网络隔离——只留一部“专线电话”

小 A 要联系配件供应商,公司没有给他配联网电脑,只在工作间放了部“专线电话”。这部电话只能拨通供应商的唯一号码,拨其他任何号码都只会听到“您拨打的号码不存在”。维修工作不能没有外部联系,但联系通道必须受控。

自主 Agent 也经常需要上网:查询文档、调用 API、下载依赖。如果给它完整公网访问权,一旦 Agent 被恶意提示注入,就可能把内部数据悄悄传向任意服务器。网络隔离要做的,就是划定 Agent 的“可出网范围”,把流量限制在必要域名、端口和协议之上。

实施手段包括:用 Docker 的 --network 指定容器接入隔离网络;用防火墙规则只放行指定目标 IP 和端口;为容器配置 HTTP 代理,由代理层做域名白名单过滤(如只允许 api.openai.com 和 pypi.org);更严格环境下,还能用 eBPF 或服务网格做七层协议过滤。

一部专线电话,让维修工能在需要时联系厂商,却也把一切“往外传数据”的路径锁死在单一受控通道里。即使 Agent 被诱导作恶,也无法把数据送到白名单之外的任何服务器——就像那部永远拨不通的长途电话。

放行={1,目标域名∈白名单0,其他\text{放行} = \begin{cases} 1, & \text{目标域名} \in \text{白名单}\\ 0, & \text{其他} \end{cases}
网络包能否通过,取决于目标域名是否在白名单中;白名单以外的请求一律拦截。
  1. 目标域名Agent 发起连接的目标地址,如 registry.npmjs.org。
    目标域名\text{目标域名}
  2. 白名单集合管理员事先批准可访问的域名列表。
    白名单\text{白名单}
  3. 判定逻辑 ∈目标域名属于白名单则输出 1 放行,否则输出 0 丢弃,这里的 1 和 0 是简化的布尔值。
    目标域名∈白名单⇒1\text{目标域名} \in \text{白名单} \Rightarrow 1

API 权限管控——每一次请求都要过闸机

小 A 申领配件、回填工单,都要用到公司的两套内部系统。公司没有给他管理员账号,而是为他的工牌开通了“仅本人可见”的接口调用权。每次过闸机刷卡,系统都会记录时间、地点和用途;卡里的权限,也只覆盖他工作区内的那几扇门。

Agent 调用 API 时同样需要这种“过闸机”式的管控。先做身份认证,确认“是谁在调用”;再做授权,确认“有没有权限”;最后留审计,记录“做了什么”。实际落地时,给 Agent 签发短期 Token,在 API 网关上校验 scope 白名单,每次调用都写入审计日志。

对自主 Agent 来说,密钥管理最是考验基本功:代码仓库中绝不能出现明文密钥;应通过环境变量注入,或使用密钥管理服务(如 Vault、KMS)在运行时动态分发给容器。密钥要定期轮换,Token 有效期尽量短,把泄露后的暴露窗口压缩到最小。

那张工牌只能刷开自己的工作区,每次“刷卡”都会在监控日志里留下记录——这正是 API 权限管控的缩影。当 Agent 完成任务离开沙箱的瞬间,所有接口权限同时作废,系统等于自动把小 A 的工牌吞进了闸机。

Access={allow,scopetoken⊇scope所需deny,其他\text{Access} = \begin{cases} \text{allow}, & \text{scope}_{token} \supseteq \text{scope}_{所需}\\ \text{deny}, & \text{其他} \end{cases}
请求是否放行,取决于 Token 携带的 scope 是否能覆盖接口要求的最小权限范围。
  1. scope_tokenToken 中声明的授权范围,如 repo:read、repo:write,类似工牌上印着的准入区域。
    scopetoken\text{scope}_{token}
  2. scope_所需目标接口声明的最小调用权限范围。
    scope所需\text{scope}_{所需}
  3. 包含关系 ⊇Token 的范围必须“包含”所需范围才放行,否则直接拒绝。
    scopetoken⊇scope所需\text{scope}_{token} \supseteq \text{scope}_{所需}

异常处置——监控室里的红灯

保安室的监控大屏上,小 A 的行动轨迹是一个绿色光点。某个凌晨,光点连续三次靠近档案室门口,门禁系统每次都“滴”地报错。值班保安按预案果断按下总电源按钮——工作间瞬间断电,小 A 被限制在原地。这不是保安多疑,而是安全体系设计好的“熔断时刻”。

自主 Agent 的行为同样需要实时监控与异常处置。系统持续采集沙箱内的审计日志和行为指标,通过基线与规则引擎判断哪些动作“不对劲”。一旦异常评分超过设定的阈值,就自动触发熔断:暂停 Agent 执行、吊销 Token、隔离容器;确认是误报后,再恢复运行。

常见的异常信号包括:非工作时段出现高危调用、短时间内高频访问敏感路径、批量导出异常数据。处置手段从轻到重可分为:告警通知、限制调用频率、吊销凭证、暂停容器、销毁沙箱。每次处置后还要复盘:误报就调低敏感性,漏报就补充规则,让沙箱越用越稳。

监控室里的红灯亮起,不是系统失败的证明,而是它尽职尽责的标志。就像保安大叔在凌晨果断按下电闸,一条条告警与熔断记录,让安全团队能够及时止损、回滚和复盘——Agent 纵有七十二变,也翻不出这层写满规则的手掌心。

熔断={触发,异常评分>θ放行,异常评分≤θ\text{熔断} = \begin{cases} \text{触发}, & \text{异常评分} > \theta\\ \text{放行}, & \text{异常评分} \le \theta \end{cases}
当异常评分跨过阈值 θ 时,系统自动触发熔断:停止 Agent、撤销权限并通知运维。
  1. 异常评分监控系统基于行为日志算出的风险数值,越高越可疑。
    异常评分\text{异常评分}
  2. 阈值 θ管理员设定的临界点,好比水库水位警戒线。
    θ\theta
  3. 比较判定异常评分大于 θ 触发熔断,否则继续放行。θ 设置过大易漏报,过小则误杀正常 Agent。
    异常评分>θ⇒触发熔断\text{异常评分} > \theta \Rightarrow \text{触发熔断}

AI 应用场景

AI 自主编程 Agent 的容器化部署

阶段:模型部署与运行

解决的问题:AI 编程 Agent 会自动生成代码、执行程序,甚至改项目配置。一旦它误判需求,执行了 rm -rf / 这类命令,宿主机会遭受不可逆损坏。传统靠人工审查代码速度太慢,跟不上 Agent 的迭代节奏。

具体案例:某研发团队部署“代码优化 Agent”时,用户要求它“优化项目依赖并运行 npm 命令”。Agent 生成了一段危险脚本,但因为容器根文件系统被 --read-only 挂载、内存上限仅 512MB,破坏命令直接失败,宿主安然无恙,事件只留下一条审计日志。

自动化运维 Agent 的 API 权限管控

阶段:Agent 工具调用与 API 集成

解决的问题:运维 Agent 需要调用云平台 API 查看日志、重启实例。若把管理员密钥交给 Agent,一旦它在告警风暴中误判,可能批量关闭生产服务。AI 方式是为 Agent 签发短期 Token,scope 仅开放“日志查询”和“指定实例重启”,所有请求经网关鉴权与审计。

具体案例:某运维 Agent 在一次异常分析中尝试调用数据库删表接口,网关核查 Token 的 scope 后直接拒绝,并给值班团队推送了告警。事后复盘发现,这是模型输出了错误的决策,安全电网关拦下了最致命的操作。

在线代码执行平台的隔离沙箱

阶段:模型驱动的代码执行服务

解决的问题:AI 教学、面试评测等平台需要执行用户或模型生成的不可信代码,代码可能尝试扫描内网、读取服务器文件。传统的进程隔离不完善,直接运行在宿主机上风险极高。

具体案例:某 AI 编程教学平台把模型生成的解题代码放进 Docker 容器运行,容器网络白名单只允许访问判题 API,文件系统只读并挂载临时目录。测试中,模型生成的代码尝试反向连接外网,被网络隔离策略当场拦截,题目环境完全隔绝。

Python 演示

python70 行
"""自主Agent安全沙箱演示: 资源限制 + 临时隔离目录 + 超时保护"""import osimport resourceimport subprocessimport tempfile  class AgentSandbox:    """轻量级沙箱: 临时工作目录 + CPU/内存限制 + 超时控制"""     def __init__(self, cpu_limit=2, mem_mb=256):        self.cpu_limit = cpu_limit        self.mem_limit = mem_mb * 1024 * 1024     def run(self, code_str):        with tempfile.TemporaryDirectory() as work_dir:            script_path = os.path.join(work_dir, "agent_script.py")            with open(script_path, "w", encoding="utf-8") as f:                f.write(code_str)             def limit_resources():                resource.setrlimit(                    resource.RLIMIT_CPU,                    (self.cpu_limit, self.cpu_limit)                )                resource.setrlimit(                    resource.RLIMIT_AS,                    (self.mem_limit, self.mem_limit)                )             proc = subprocess.run(                ["python3", "agent_script.py"],                cwd=work_dir,                capture_output=True,                text=True,                timeout=self.cpu_limit + 5,                preexec_fn=limit_resources,            )            return {                "stdout": proc.stdout,                "stderr": proc.stderr,                "returncode": proc.returncode,            }  if __name__ == "__main__":    sandbox = AgentSandbox(cpu_limit=2, mem_mb=256)     safe_code = (        "print('Agent 正常执行')\n"        "for i in range(3):\n"        "    print('任务进度:', i + 1)\n"    )     dangerous_code = (        "print('危险动作开始')\n"        "try:\n"        "    data = [0] * (1024 * 1024 * 1024)\n"        "    print('内存分配成功')\n"        "except MemoryError:\n"        "    print('内存超限, 被沙箱拦截!')\n"    )     print("=== 正常任务 ===")    result = sandbox.run(safe_code)    print(result["stdout"])     print("=== 恶意任务 ===")    result = sandbox.run(dangerous_code)    print(result["stdout"] or result["stderr"])
目的:演示一个轻量版 Agent 沙箱,把 Agent 生成的代码放进临时目录,用资源限制和超时保护约束其行为。
  1. with tempfile.TemporaryDirectory() as work_dir:为 Agent 创建独立临时工作目录,任务结束自动清理。
  2. open(script_path, "w", encoding="utf-8")把 Agent 代码写入隔离目录,避免污染外部文件系统。
  3. resource.setrlimit(resource.RLIMIT_CPU, (self.cpu_limit, self.cpu_limit))限制子进程最多使用多少秒 CPU 时间,超限立即被内核终止。
  4. resource.setrlimit(resource.RLIMIT_AS, (self.mem_limit, self.mem_limit))限制子进程虚拟内存总量,防止恶意申请大内存拖垮宿主。
  5. subprocess.run([...], cwd=work_dir, timeout=self.cpu_limit + 5, preexec_fn=limit_resources)在受限子进程中运行代码,并设置整体超时兜底。
  6. sandbox.run(dangerous_code)让 Agent 尝试分配超大内存,观察沙箱如何将其拦截。

常见误区

误区“我用了 Docker 容器,还有 namespace 隔离,Agent 放在里面绝对安全,不用额外配置。”

正解容器提供了隔离边界,但并不是“安全墙”。默认情况下,容器内是 root 用户、文件系统可写、网络可出公网;若挂载了宿主目录又放开权限,Agent 越权操作宿主机文件并非难事。好比搬进新办公室,门锁、保险柜、监控摄像头仍然需要自己配齐。

为何常见:docker run 一条命令就能启动容器,工具门槛太低,用户很容易把“运行成功”当成“安全加固完成”。

误区“权限管得越严,Agent 干活越频繁被打断,开发效率下降,还不如放手让它干。”

正解最小权限不是“砍权限”,而是“精确授权”。设计良好的权限清单和动态授权机制,能让 Agent 的绝大多数操作畅通无阻;真正被拦下的恰好是越权动作,等于安全护栏正在起作用。维修工带齐了一整套工具,只缺你没给的那把保险柜钥匙,他并不会因此修不好设备。

为何常见:人们习惯用“root 全知全能”思维看问题,觉得权限少就是障碍多,却忽略权限失控后的一次事故成本远高于十次补授权。

误区“沙箱都挡住攻击了,日志留不留无所谓;环境跑完销毁就行。”

正解审计日志是安全事件的回放录像。没有日志,你只能知道自己“可能被攻击过”,却不知道攻击路径、数据和影响面,也无法据此优化规则。即使容器销毁,关键日志也应持久化到外部存储。就像监控室的录像带,出事后才知道它多值钱。

为何常见:快速迭代的 AI 项目中,工程师更关心“Agent 跑完没”,日志链路则常常无人维护,最终成为最容易被砍掉的一环。

误区“密钥不写代码、放进 `.env` 文件,用环境变量注入,就不会泄露出去了。”

正解环境变量没有加密,若在镜像构建时把 .env 打包进去,密钥会随镜像层一起泄露;容器内的子进程也可能读取到环境变量。正确做法是交给密钥管理服务(Vault/KMS)动态注入,尽量短时效、自动轮换。好像临时工牌,丢了也不怕,因为半小时后就自动作废了。

为何常见:环境变量是教程里最常见的“推荐做法”,很多人把它当成终点,其实它只是避免硬编码的第一步。

面试题

Q1. 自主 Agent 在沙箱中运行,防止它“占满算力拖垮宿主机”的关键机制是?

单选题 · easy

  • A.扩容硬件设备资源
  • B.设置资源占用上限← 正确答案
  • C.优化交互界面的样式
  • D.增加训练数据的样本

答案:B。沙箱通过 cgroup 给 Agent 设置 CPU 和内存上限,一旦超限就会被内核限制或终止。这就好比给维修工的工作间装限流器,再大的功率也会被拦下。扩容硬件只是增加总量,并没有约束 Agent 本身的行为。

Q2. 最小权限原则落地到自主 Agent 部署时,最佳实践是?

单选题 · easy

  • A.仅授予完成任务所需权限← 正确答案
  • B.授予全部管理员权限以便调试
  • C.按模型置信度动态分配权限
  • D.将所有权限配置写入公开文档

答案:A。最小权限要求“缺一个任务完不成,多一个则埋风险”,因此按任务所需的最小权限授予最稳妥。管理员权限过大,公开文档则会泄露安全配置,都不是可取方案。

Q3. 下列哪些属于 Agent 沙箱的安全隔离措施?

多选题 · mid

  • A.文件系统只读挂载← 正确答案
  • B.限制出网域名白名单← 正确答案
  • C.增加图像渲染的帧率
  • D.签发短期 Token 限权← 正确答案

答案:ABD。只读挂载属于文件系统隔离,域名白名单属于网络隔离,短期 Token 属于 API 权限管控。图像渲染帧率与安全隔离无关,纯属干扰项。

Q4. 容器内 Agent 若以 root 身份运行,最大的安全风险是?

单选题 · mid

  • A.越权操作宿主机文件← 正确答案
  • B.容器启动速度变慢
  • C.镜像体积成倍膨胀
  • D.日志格式不再兼容

答案:A。root 用户拥有容器内最高权限,再加上可能存在的内核漏洞或挂载目录,Agent 就可能越权读写宿主机文件。最佳实践是用非 root 用户运行进程,并丢弃不需要的内核能力。

Q5. Docker 部署自主 Agent 时,正确的安全加固做法包括?

多选题 · mid

  • A.使用非 root 用户运行← 正确答案
  • B.丢弃多余内核能力← 正确答案
  • C.定期扫描镜像漏洞← 正确答案
  • D.对外开放 Docker 端口

答案:ABC。非 root 运行、丢弃多余内核能力、扫描镜像漏洞都是从最小权限和供应链安全角度加固容器。开放 Docker 端口等于把管理接口暴露在公网,是严重的安全隐患。

Q6. Agent 需要联网下载依赖包,最稳妥的网络隔离策略是?

单选题 · mid

  • A.仅放行白名单域名与指定端口← 正确答案
  • B.完全禁用容器一切网络功能
  • C.允许全部外网流量自由通行
  • D.映射宿主机公网 IP 给容器

答案:A。白名单加端口限制,既允许 Agent 访问必要的依赖源,又切断了其他外联通道。完全禁用网络虽然安全,但会导致任务无法完成;全部放行则等于没有隔离。

Q7. 为什么说文件系统隔离往往比访问控制更可靠?

单选题 · extreme

  • A.进程无法访问不存在的路径← 正确答案
  • B.文件系统隔离会提升运算速度
  • C.访问控制会让依赖无法安装
  • D.日志审计只能在隔离环境中进行

答案:A。访问控制需要逐一配置权限,一旦漏配就出漏洞;而文件系统隔离让敏感路径在 Agent 的“世界”里根本不存在,从源头上消灭了攻击面。好比看不到保险柜,就谈不上撬锁。

Q8. Agent API 密钥被误提交到公开代码仓库后,最恰当的补救是?

单选题 · hard

  • A.立即轮换密钥并托管到密钥服务← 正确答案
  • B.给仓库设置密码并继续使用
  • C.把公开仓库转为私有即可
  • D.不处理,等密钥过期自动失效

答案:A。密钥一旦公开就视为已泄露,必须立即轮换,并用密钥管理服务动态托管。转私有不能保证泄露期间无人复制;等待过期会让攻击窗口长期敞开,风险更大。

Q9. 自主 Agent 行为监控中,哪些信号应被视为异常?

多选题 · hard

  • A.非工作时段发生高频敏感调用← 正确答案
  • B.批量读取授权范围外的关键文件← 正确答案
  • C.频繁访问白名单之外的外部域名← 正确答案
  • D.正常执行任务输出标准业务日志

答案:ABC。非工作时段的高频调用、越权读文件和访问白名单外域名,都偏离了正常行为基线。正常输出业务日志是健康信号,不应触发告警。

Q10. Agent 在沙箱中因缺少权限而中断任务,正确处理是?

单选题 · easy

  • A.按需补充任务所需权限← 正确答案
  • B.直接授予最高管理员权限
  • C.永久关闭只读挂载限制
  • D.清空日志并重启沙箱

答案:A。缺什么补什么,这正是最小权限原则的动态落地。直接授予管理员权限、关闭只读限制或清空日志,都是在拆除安全护栏,会带来更大的失控风险。