AI Agent 正在把软件开发从“人写代码、工具辅助”推向“模型规划、调用工具、直接改动系统”。变化不只发生在 IDE 里。一个能读文件、跑测试、访问 API、提交代码、调用云资源的 Agent,已经把你的笔记本变成了一个高权限运行时。它不再只是开发环境,而是一个会执行真实动作的生产入口。
这也是“运行时治理”开始重要的原因:问题不再只是提示词写得好不好,而是 Agent 在运行过程中能碰什么、能调用什么、能把数据发到哪里、出了事能不能追踪。
本机为什么开始像生产环境
过去,本机开发环境的风险边界相对清楚:开发者手动执行命令,手动复制密钥,手动推送代码。即使脚本有问题,通常也有人在命令行前做最后判断。
AI Agent 改变了这个节奏。它可能在一次任务里连续完成这些动作:
- 扫描仓库和配置文件,理解项目结构。
- 修改代码、生成测试、运行构建命令。
- 读取环境变量或本地凭证,用来调用外部服务。
- 访问 Git、CI、云平台、数据库或内部 API。
- 根据工具返回结果继续决策。
这些动作本来分散在人、脚本和流水线之间,现在集中到一个可交互的本机 Agent 进程里。它的执行环境越接近真实系统,本机就越像生产环境的一部分。
这里的关键不是“Agent 会不会犯错”这么简单,而是“Agent 犯错时影响面有多大”。如果它能访问生产凭证、写入真实数据库、推送到主干分支,那么一次错误工具调用就可能变成一次真实事故。
治理不能只放在代码合并之后
很多团队已经有代码审查、CI、权限审批和部署门禁。但 Agent 带来的新风险发生得更早:在代码还没进入 PR 之前,在本机工具调用发生的一瞬间。
运行时治理关注的是执行过程本身,例如:
- Agent 是否可以读取
.env、SSH key、云凭证目录。 - Agent 是否可以执行
rm、curl、kubectl、terraform apply这类高影响命令。 - Agent 是否可以把仓库内容、日志、用户数据发送到外部模型或 API。
- Agent 的每一次工具调用是否有审计记录。
- 高风险动作是否需要人工确认。
换句话说,治理点要从“代码最终长什么样”前移到“Agent 正在做什么”。这不是为了拖慢开发,而是为了让自动化速度和组织控制能力匹配起来。
可以这样实践:给本机 Agent 加一层命令守门
下面是一个最小可改造的本机命令守门脚本。它不代表任何特定产品能力,只是展示一种运行时治理思路:把 Agent 的 shell 命令先交给一个 wrapper,由 wrapper 做 allowlist、denylist 和审计。
运行前可修改 ALLOWED_PREFIXES 和 DENIED_PATTERNS,让它匹配你的团队规则。
#!/usr/bin/env python3
import json
import re
import shlex
import subprocess
import sys
from datetime import datetime, timezone
from pathlib import Path
ALLOWED_PREFIXES = [
"git status",
"git diff",
"git log",
"python -m pytest",
"npm test",
"npm run lint",
"rg ",
"ls",
"pwd",
]
DENIED_PATTERNS = [
r"\brm\s+-rf\b",
r"\bkubectl\s+delete\b",
r"\bterraform\s+apply\b",
r"\baws\s+.*\b--profile\s+prod\b",
r"\bcurl\b.*\|\s*(sh|bash)\b",
r"\.env",
r"id_rsa",
]
AUDIT_LOG = Path("agent-command-audit.jsonl")
def log_event(command: str, decision: str, reason: str) -> None:
event = {
"ts": datetime.now(timezone.utc).isoformat(),
"command": command,
"decision": decision,
"reason": reason,
}
with AUDIT_LOG.open("a", encoding="utf-8") as f:
f.write(json.dumps(event, ensure_ascii=False) + "\n")
def is_allowed(command: str) -> tuple[bool, str]:
for pattern in DENIED_PATTERNS:
if re.search(pattern, command):
return False, f"matched denied pattern: {pattern}"
if any(command == prefix or command.startswith(prefix) for prefix in ALLOWED_PREFIXES):
return True, "matched allowed prefix"
return False, "not in allowlist"
def main() -> int:
if len(sys.argv) < 2:
print("usage: guarded_run.py '<command>'", file=sys.stderr)
return 2
command = sys.argv[1]
allowed, reason = is_allowed(command)
if not allowed:
log_event(command, "blocked", reason)
print(f"BLOCKED: {reason}", file=sys.stderr)
return 126
log_event(command, "allowed", reason)
return subprocess.call(shlex.split(command))
if __name__ == "__main__":
raise SystemExit(main())
保存为 guarded_run.py 后,可以这样试运行:
chmod +x guarded_run.py
./guarded_run.py "git status"
./guarded_run.py "python -m pytest"
./guarded_run.py "terraform apply"
./guarded_run.py "cat .env"
cat agent-command-audit.jsonl
在真实接入 Agent 时,可以把它配置为 Agent 的 shell 工具入口,或者在本机开发容器、任务运行器、IDE 插件层面包一层。这个例子很小,但核心机制已经具备:默认拒绝、显式允许、敏感模式拦截、审计落盘。
更稳的做法:隔离凭证和网络出口
命令守门只能解决一部分问题。Agent 真正危险的地方常常在“组合动作”:先读文件,再调用外部 API,再把结果写入系统。团队可以从三条线收紧边界。
一是分离凭证。不要让 Agent 默认继承完整的开发者 shell 环境。给它单独的低权限 token,并限制 token 的作用域和有效期。
二是隔离文件系统。把 Agent 放进开发容器或临时 workspace,只挂载当前任务需要的目录。敏感目录如 ~/.ssh、~/.aws、~/.kube、密码管理器缓存,不应该自然暴露给 Agent。
三是控制网络出口。至少要知道 Agent 能访问哪些域名。对处理客户数据、内部代码或安全材料的场景,外发请求需要日志、审批或网关策略。
一个可改造的开发容器配置可以长这样:
{
"name": "agent-sandbox",
"image": "mcr.microsoft.com/devcontainers/python:3.12",
"workspaceFolder": "/workspace",
"mounts": [
"source=${localWorkspaceFolder},target=/workspace,type=bind,consistency=cached"
],
"containerEnv": {
"AGENT_MODE": "sandbox"
},
"runArgs": [
"--cap-drop=ALL",
"--security-opt=no-new-privileges"
],
"postCreateCommand": "python --version && git --version"
}
这不是完整的安全边界,但它能改变默认姿势:Agent 不是自动拿到整台笔记本的钥匙,而是在一个更窄的运行空间里工作。
采用前的检查清单
把 AI Agent 带进日常开发不是问题,问题是不要把高权限运行时伪装成普通编辑器插件。落地时可以先检查这些点:
- Agent 是否默认禁止读取密钥、令牌、生产配置和客户数据。
- 高影响命令是否需要人工确认或策略放行。
- 工具调用、外部请求、文件修改是否有可查询审计记录。
- 本机 token 是否遵循最小权限,而不是复用开发者完整权限。
- Agent 生成的改动是否仍经过测试、代码审查和 CI。
- 团队是否区分实验任务、内部代码任务和生产系统任务的权限等级。
开发者的笔记本不会真的替代生产集群,但它正在成为生产变更链路里的主动执行节点。Agent 越强,本机运行时越需要像生产一样被治理:限制权限、记录动作、隔离环境、保留人工刹车。这样才能让自动化扩大产能,而不是扩大事故半径。