最近很多人在部署 AI Agent------接个大模型 API,写几个工具函数,跑起来就上线了。
但有个问题大家不太提:Agent 的权限管理。
传统应用,代码写了什么就执行什么,行为是确定的。Agent 不一样------它根据 prompt 和上下文动态决定调什么 API、传什么参数。你代码里给了它 S3 的读写权限,它可能在你没预期的时候去读了不该读的文件。
不是恶意,是它「觉得有必要」。
所以 Agent 的安全策略需要从「信任代码」转向「约束行为」。这篇讲怎么用亚马逊云科技的 IAM、VPC、CloudTrail、Bedrock Guardrails 搭一套四层防护。
第一层:IAM 最小权限
核心原则:Agent 只能做你明确允许的事。
给 Agent 配专用 IAM Role,权限精确到具体 Action 和 Resource:
json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream"
],
"Resource": "arn:aws-cn:bedrock:*::foundation-model/anthropic.claude-*"
}
]
}
几个要点:
bedrock:InvokeModel而不是bedrock:*- Resource 限定到具体模型系列
- 不给 ListFoundationModels(Agent 不需要「探索」)
还可以加 Condition 约束:
json
{
"Condition": {
"StringEquals": {
"aws:RequestedRegion": "cn-northwest-1"
}
}
}
限定区域,防止 Agent 跨区域调用。
第二层:VPC 网络隔离
把 Agent 跑在私有子网里。没有公网 IP,没有 NAT Gateway(除非业务必须)。
Agent 访问 Bedrock 走 VPC Endpoint(内网),不走公网:
markdown
Agent (私有子网) → VPC Endpoint → Bedrock
↑
流量不出 VPC
安全组只放行 TCP 443 到 Endpoint,其他全拒。
VPC Endpoint 还可以加 Endpoint Policy,在网络层再做一次权限过滤:
json
{
"Statement": [{
"Principal": {"AWS": "arn:aws-cn:iam::123456789012:role/AgentRole"},
"Effect": "Allow",
"Action": "bedrock:InvokeModel",
"Resource": "arn:aws-cn:bedrock:*::foundation-model/anthropic.claude-*"
}]
}
IAM 管「谁能做什么」,Endpoint Policy 管「这个入口允许什么」。双重保险。
第三层:CloudTrail 审计
Agent 的每个 API 调用都会被 CloudTrail 记录。重点配置:
1. 开启 Bedrock 模型调用日志
日志写入 S3 + CloudWatch Logs,包含调用时间、模型、token 量。
2. 设置 CloudWatch 告警
| 告警 | 条件 | 动作 |
|---|---|---|
| 调用频率异常 | 5 分钟内 > 100 次 | SNS 通知 |
| 非工作时间活动 | 北京 22:00-06:00 有调用 | SNS 通知 |
| 权限拒绝 | Agent Role 出现 AccessDenied | 通知 + 暂停 |
3. 定期审计
每周 review 一次 Agent 的 API 调用日志,看有没有异常模式。
第四层:Bedrock Guardrails
在模型调用层面加防护:
- 内容过滤:屏蔽不当内容
- 话题限制:Agent 只讨论业务相关话题
- PII 检测:自动脱敏个人身份信息
- 词汇过滤:自定义禁用词
python
response = client.invoke_model(
modelId='anthropic.claude-3-sonnet-20240229-v1:0',
guardrailIdentifier='my-agent-guardrail',
guardrailVersion='1',
body=json.dumps({
"anthropic_version": "bedrock-2023-05-31",
"messages": [{"role": "user", "content": user_input}],
"max_tokens": 4096
})
)
加上应用层的输入验证(长度限制、注入检测),完整的防护链就搭好了。
完整架构
markdown
请求 → WAF限流 → 输入验证 → Guardrails
↓
IAM Role(最小权限)
↓
VPC 私有子网 → Endpoint → Bedrock
↓
CloudTrail + CloudWatch 审计告警
四层,每层独立。某一层被绕过,其他层仍然有效。
部署 Checklist
- Agent 有专用 IAM Role
- IAM 策略精确到 Action + Resource
- 加了 Condition 约束(区域、token 上限)
- 运行在 VPC 私有子网
- 通过 VPC Endpoint 访问(不走公网)
- CloudTrail 开启
- Bedrock 调用日志开启
- CloudWatch 告警已配
- Guardrails 已配置
- 应用层有输入验证
别等出事了再补。先搭好框架,后面加 Agent 就是填配置的事。
🔗 Amazon Bedrock:aws.amazon.com/cn/bedrock/ 🔗 Bedrock Guardrails:aws.amazon.com/cn/bedrock/... 🔗 IAM:docs.aws.amazon.com/iam/ 🔗 CloudTrail:aws.amazon.com/cn/cloudtra...