Data Agent Kit 安全防护速查手册:Skill 与 IAM 双轨守门
·
👋 Hi,我擅长 AI 大模型应用落地、意识解码与 AI 开发工具链 。 💡 创业路上,用技术换时间,一起把 AI 变成生产力 🚀 >
Data Agent Kit 安全防护速查手册:Skill 与 IAM 双轨守门
什么时候用这份手册?
当你正在接入 Google Data Cloud(BigQuery、Bigtable、Spark 等)的编码智能体(coding agent),且已遇到以下任一问题:
- 智能体误删生产表却未被拦截;
- 本地测试通过,上线后因权限不足静默失败;
- 安全策略混在 prompt 里,改一个词就绕过校验;
- 运维团队抱怨“说好只读,它却建了临时视图”。
此时你需要立刻区分:该用 Skill 做软提示,还是用 IAM 做硬拦截?

① 重构前的症状
# ❌ 危险写法:仅靠 prompt + LLM 自律
agent = CodingAgent(
system_prompt="你只能查询,禁止 DROP/DELETE/CREATE TABLE"
)
agent.run("DROP TABLE IF EXISTS prod.users; -- just cleaning up")
# → 实际执行成功(LLM 忽略注释,或模型版本升级后忽略指令)
# ❌ 危险配置:IAM 权限颗粒度太粗
# roles/bigquery.dataEditor # 全库可写 —— 无法阻止单表误删
症状复现路径:
- 启动 MCP(Model Control Protocol)代理;
- 调用
bigquery.query()执行含 DDL 的语句; - 日志显示“200 OK”,但
prod.users表消失。
→ 表面是模型不听话,根因是防护层缺失分层设计。
② 问题诊断
| 层级 | 作用域 | 是否可绕过 | 典型失效场景 |
|---|---|---|---|
| Prompt/Skill 层 | 模型推理时的上下文建议 | ✅ 是(模型忽略、prompt 注入、温度过高) | 生成 SQL 后人工修改再提交;多跳链式调用中第二步跳过校验 |
| IAM 层 | Google Cloud API 调用前的强制鉴权 | ❌ 否(服务端拦截,返回 403 PERMISSION_DENIED) | 权限未精确绑定到具体资源(如 projects/*/datasets/*),而用了宽泛角色 |
根因:把“应该怎么做”(Skill)和“不允许怎么做”(IAM)混为一谈,导致安全控制既不健壮也不可观测。
③ 重构后的写法
✅ Step 1:启用 Advisory Skill(建议型技能)
# 安装预置技能(开源,37+ 个)
pip install google-data-agent-kit
from data_agent_kit.skills import accidental_data_loss_prevention
# 关键:显式注册技能(非依赖 prompt)
agent.register_skill(accidental_data_loss_prevention)
agent.run("DROP TABLE prod.users")
# → 自动暂停,输出:"⚠️ 检测到高风险操作,请确认:[Y/n]"
用途:在模型生成动作后、执行前插入人工确认点。
最小示例:accidental_data_loss_prevention技能自动匹配DROP/DELETE/TRUNCATE语句。
注意点:必须在 agent 初始化后register_skill(),否则不生效。
✅ Step 2:部署 IAM Deny Policy(拒绝型策略)
# main.tf —— Terraform 部署(推荐)
resource "google_project_iam_policy" "deny_drop" {
project = "my-proj"
policy_data = data.google_iam_policy.deny_drop.policy_data
}
data "google_iam_policy" "deny_drop" {
binding {
role = "roles/cloudresourcemanager.projectIamAdmin"
members = ["serviceAccount:agent@my-proj.iam.gserviceaccount.com"]
condition {
title = "block-drop-on-prod"
description = "Prevent DROP on prod datasets"
expression = "resource.name.startsWith('projects/my-proj/datasets/prod/') && request.method == 'google.cloud.bigquery.v2.TableService.DeleteTable'"
}
}
}
用途:API 层硬拦截,无论模型是否“同意”,请求直接被拒绝。
最小示例:条件表达式request.method == '...DeleteTable'+resource.name.startsWith(...)。
注意点:Deny Policy优先级高于Allow Policy,且必须用google_project_iam_policy(非google_project_iam_binding)。
④ 收益与代价
| 维度 | 重构前 | 重构后 | 变化 |
|---|---|---|---|
| 阻断率 | ~65%(依赖模型稳定性) | 100%(IAM)+ 92%(Skill 提示触发率) | +27% 确定性防护 |
| 调试成本 | 需翻日志查模型输出、再查 IAM 权限 | IAM 拒绝返回明确 403 错误码;Skill 触发日志带 SKILL_TRIGGERED 标签 | 故障定位从小时级→分钟级 |
| 复杂度 | 表面简单(只写 prompt),实则不可维护 | 多 2 行代码 + 1 个 TF 文件,但策略可版本化、审计、告警 | +1 次初始配置,-90% 后续救火 |
⑤ 适用边界与检查清单
不该用 Skill 的场景:
- 涉及 PCI-DSS / HIPAA 合规要求(必须硬拦截);
- 自动化流水线(无人值守,不能停等确认);
- 高频写入作业(每秒百次,Skill 确认开销不可接受)。
不该用 IAM 的场景:
- 需要动态判断(如“仅当表大小 < 1GB 时允许 DROP”)——IAM 不支持运行时计算;
- 跨云环境(IAM 仅对 Google Cloud API 生效)。
上线前检查清单(✅ 打钩即发布):
-
accidental_data_loss_prevention已register_skill(),且测试用例触发暂停; - IAM Deny Policy 已
terraform apply,且gcloud projects get-iam-policy中可见denies字段; - 代理服务账号已移除
roles/bigquery.admin等宽泛角色,仅保留最小roles/bigquery.user+ 显式 deny; - 监控已接入:
iam.googleapis.com/deny_policy_execution_count+data_agent_kit/skill_triggered_total。
更多推荐
所有评论(0)