治理 Agentic AI:用可执行护栏替代权限猜测

2026-07-22 36 预计阅读时间: 1 分钟
来源: docker.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:8 分钟

Agentic AI 的风险不只来自模型会不会答错,更来自它能够调用 API、读取数据、修改资源并触发后续流程。Docker 汇集企业安全负责人讨论的核心问题,正是如何治理这些具备行动能力的 AI Agent,同时避免把开发流程拖入漫长的人工审批。

真正可落地的答案不是要求开发者“谨慎使用”,而是把权限、审批、审计和运行时隔离做成可执行的工程护栏。这样,常规操作可以自动通过,高风险动作才需要升级处理。

风险边界应该围绕动作,而不是模型名称

传统应用通常有相对稳定的调用链,而 Agent 会根据上下文动态选择工具、组合步骤。相同的用户请求,可能在不同时间产生不同的工具调用序列。因此,只批准某个模型或某个 Agent 名称,并不能充分约束它最终产生的副作用。

治理时更值得追踪的是四类信息:

  • 身份:用户、Agent、工作负载和服务账号分别是谁。
  • 动作:Agent 准备调用哪个工具,执行读取、写入、删除还是对外发送。
  • 资源:目标是测试数据库、生产集群、代码仓库还是客户数据。
  • 上下文:请求来自哪个环境,是否包含敏感数据,是否已经获得人工批准。

例如,读取测试环境日志可以自动放行;修改生产部署必须获得审批;删除数据库、导出凭据或向未知域名发送数据则应直接拒绝。这样的规则比“允许 Agent 使用 Kubernetes”更精确,也更容易审计。

护栏要进入执行路径

只把规则写在安全手册里,Agent 在运行时并不会自动遵守。有效护栏必须位于模型与工具之间,在每次工具调用前做授权判断,并在调用后记录结构化审计事件。

一条典型执行链可以是:

  1. Agent 生成结构化工具调用,而不是直接执行任意 Shell 文本。
  2. 策略层检查主体、动作、资源、环境和参数。
  3. 低风险请求自动执行,高风险请求进入审批队列。
  4. 工具在隔离环境中使用短期凭据运行。
  5. 系统记录策略版本、输入摘要、审批人和执行结果。

Prompt 中的“不要执行危险操作”可以作为行为提示,但不能代替授权控制。Prompt 可能被注入、忽略或被间接数据影响;权限系统则应该在模型之外独立生效。

可以这样实践:给工具调用加一个最小策略门

下面是一个仅依赖 Python 标准库的最小示例。它不是 Docker 或某个商业产品的正式 API,而是一个可直接运行、再改造成策略服务的参考实现。运行前可修改 REQUESTS,模拟自己的 Agent 工具调用。

from dataclasses import dataclass
from typing import Literal

Decision = Literal["allow", "require_approval", "deny"]


@dataclass(frozen=True)
class ToolRequest:
    actor: str
    tool: str
    action: str
    environment: str
    destination: str = ""


def authorize(req: ToolRequest) -> tuple[Decision, str]:
    blocked_actions = {"delete_database", "read_credentials"}
    approved_tools = {"logs.read", "deploy.update", "http.post"}

    if req.tool not in approved_tools:
        return "deny", "tool is not registered"

    if req.action in blocked_actions:
        return "deny", "action is prohibited"

    if req.tool == "http.post" and not req.destination.endswith(".example.com"):
        return "deny", "external destination is not allowlisted"

    if req.environment == "production" and req.action != "read":
        return "require_approval", "production write requires a human"

    return "allow", "request matches automated policy"


REQUESTS = [
    ToolRequest("support-agent", "logs.read", "read", "staging"),
    ToolRequest("release-agent", "deploy.update", "write", "production"),
    ToolRequest(
        "research-agent",
        "http.post",
        "send",
        "development",
        "collector.unknown.net",
    ),
]

for request in REQUESTS:
    decision, reason = authorize(request)
    print(f"{decision:18} {request.actor:16} {request.tool:14} {reason}")

执行:

python3 guardrail.py

预期结果中,测试环境的日志读取会通过,生产写入需要审批,向未知域名发送数据会被拒绝。真实系统还需要加入身份签名、参数校验、超时、速率限制、审计存储和不可绕过的网络策略。

如果 Agent 需要运行代码,可以进一步把执行器放入容器,并使用只读文件系统、资源限制和无特权用户。下面的命令可作为本地隔离实验,需将 agent-task 替换为自己的镜像名:

docker run --rm \
  --read-only \
  --user 65532:65532 \
  --cap-drop ALL \
  --security-opt no-new-privileges \
  --memory 256m \
  --cpus 0.5 \
  --network none \
  agent-task:latest

--network none 适合不需要联网的任务。需要访问内部 API 时,不应直接开放全部网络,而应通过受控代理或域名白名单提供最小出口。

不拖慢开发的关键是默认路径清晰

护栏是否有效,不只看它拦住了多少请求,还要看开发者能否预测结果。策略含糊、审批没有负责人、测试环境与生产环境规则完全相同,都会促使团队寻找绕过路径。

落地时可以检查以下项目:

  • 工具必须注册,并声明输入模式、所需权限和可能副作用。
  • 凭据按任务临时签发,不把长期密钥写入 Prompt、镜像或环境模板。
  • 读取、写入、删除和外发采用不同风险等级。
  • 常规低风险操作自动放行,审批集中在生产写入和不可逆动作。
  • 审计日志记录最终工具调用,而不只记录自然语言对话。
  • 策略在 CI 和预发布环境中可以测试,变更也需要版本管理。
  • 容器隔离是纵深防御的一层,不能替代身份认证和细粒度授权。

Agentic AI 的治理目标不是消除所有自主性,而是限定自主性能够作用的范围。把规则变成机器可执行、可测试、可审计的控制面,开发者才能快速迭代,安全团队也不必依赖猜测判断一次 Agent 行动是否越界。


相关推荐