👋 Hi,我擅长 AI 大模型应用落地、意识解码与 AI 开发工具链 。 💡 创业路上,用技术换时间,一起把 AI 变成生产力 🚀 >


Data Agent Kit 安全防护速查手册:Skill 与 IAM 双轨守门

什么时候用这份手册?
当你正在接入 Google Data Cloud(BigQuery、Bigtable、Spark 等)的编码智能体(coding agent),且已遇到以下任一问题:

  • 智能体误删生产表却未被拦截;
  • 本地测试通过,上线后因权限不足静默失败;
  • 安全策略混在 prompt 里,改一个词就绕过校验;
  • 运维团队抱怨“说好只读,它却建了临时视图”。

此时你需要立刻区分:该用 Skill 做软提示,还是用 IAM 做硬拦截?

An abstract conceptual illustration of dual-layer

① 重构前的症状

# ❌ 危险写法:仅靠 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  # 全库可写 —— 无法阻止单表误删

症状复现路径:

  1. 启动 MCP(Model Control Protocol)代理;
  2. 调用 bigquery.query() 执行含 DDL 的语句;
  3. 日志显示“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。
Logo

更多推荐