KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA
04. 安全规则必须在模型绕不过去的地方生效 — keel 龙骨
把规则写进 system prompt 可以降低模型主动违规的概率,但攻击者仍可能绕开模型直接调用后端接口,模型也可能受注入影响。因此规则必须在现实动作提交前由程序强制执行。
把规则写进 system prompt 可以降低模型主动违规的概率,但攻击者仍可能绕开模型直接调用后端接口,模型也可能受注入影响。因此规则必须在现实动作提交前由程序强制执行。
PDP 与 PEP 分工
- Policy Decision Point(PDP)读取可信上下文并计算决定;
- Policy Enforcement Point(PEP)位于执行必经路径,执行 allow、deny 或 require approval;
- Adapter 只接受 PEP 发出的受控请求。
PDP: “alice 可以改 tenant-a/staging,但写操作需要独立审批。”
PEP: 没有有效审批时绝不调用配置 Adapter。
如果另一个内部模块能直接调用 Adapter,PEP 就不是完整边界。
PolicyDecision 应该可解释
class PolicyDecision(BaseModel):
outcome: Literal["allow", "deny", "require_approval"]
reason_code: str
policy_version: str
obligations: list[str]
稳定 reason code 便于测试和指标聚合;对用户返回最小必要信息,详细规则与资源存在性只进入受限审计,避免拒绝消息泄露其他租户。
默认拒绝与显式允许
动作目录中没有注册的 action、未知 environment、缺少 principal、资源归属不明确、策略服务无法给出可靠决定时,应阻止副作用。
“fail closed”也要设计可用性:只读、低风险路径可以使用经审查的缓存策略;高风险写动作宁可暂停并告知人工,也不能在 PDP 不可用时默认放行。
策略输入必须可信
可信:认证 principal、Agent Registry、资源目录、服务端动作 effect、审批存储
不可信:模型 JSON、用户声明的角色、网页文字、记忆中的权限描述、Agent 消息
模型可以提出 environment=staging,PEP 必须通过资源目录解析真实资源并确认它确实属于 staging。
Obligation 不等于 allow
策略可能返回:
require_approval
obligations = ["redact_secrets", "bind_resource_version", "single_use_ticket"]
PEP 只有在 obligations 全部满足后才允许执行。调用方不能忽略其中一项并把 decision 当作普通布尔值。
每次提交都重新执行策略
审批后到执行前可能权限撤销、资源版本变化或策略升级。PEP 在实际副作用前重新读取当前上下文,并验证批准的 fingerprint 与待执行动作一致。
运行策略实验
python courses/advanced/safety-controls/course/project/examples/01_policy_decisions.py
固定验证:同租户 read 允许、staging write 需审批、跨租户拒绝、未知动作拒绝、缺少可信身份拒绝。这个测试不需要模型。
检查理解
- PDP 和 PEP 为什么不能只存在于 prompt 中?
- 策略服务不可用时,为什么高风险动作不应默认放行?
- obligations 为什么不能被压缩成一个
allowed布尔值?