Amazon Bedrock Guardrails 实战:AI Agent 安全防护方案详解

上个月我踩了一个坑——生产环境里的 AI Agent 被用户用 prompt injection 攻击,吐出了系统提示词的内容。虽然没有造成实质损失,但这件事让我意识到:AI Agent 的安全防护不能只靠 prompt engineering,必须有一层独立于模型的安全检查机制。

研究了一圈方案,我选择了 Amazon Bedrock Guardrails。这篇文章把完整的配置过程、踩的坑和一周的线上数据都记录下来,供大家参考。

为什么 Prompt Engineering 不够

AI Agent 在生产环境面临的安全风险包括:

  1. Prompt Injection:用户构造特殊输入让模型执行非预期操作
  2. 信息泄露:模型可能输出训练数据中的敏感信息
  3. 有害内容生成:暴力、歧视等不当内容
  4. 话题偏离:Agent 被引导讨论与业务无关的话题
  5. PII 泄露:输出中包含个人身份信息(邮箱、电话、身份证号等)

用系统提示词去约束这些行为,本质上是让模型"自律"。但模型的行为不完全可控——精心构造的 prompt injection 可以绕过大多数提示词层面的防护。需要的是一层在模型之外运行的安全检查。

Bedrock Guardrails 架构

Bedrock Guardrails 是亚马逊云科技 Bedrock 平台提供的安全过滤层,核心设计:

  • 独立于底层模型:不依赖模型自身的安全能力
  • 输入输出双向检查:请求进来检查一次,响应出去再检查一次
  • 配置驱动:不需要训练模型,通过策略配置启用

它提供三类核心能力:内容过滤、话题控制、PII 脱敏。

内容过滤(Content Filters)

按类别过滤有害内容。每个类别可以独立设置输入和输出的过滤强度(NONE / LOW / MEDIUM / HIGH):

import boto3

bedrock = boto3.client('bedrock', region_name='us-east-1')

guardrail = bedrock.create_guardrail(
    name='production-agent-guardrail',
    description='Production AI Agent safety guardrail',
    contentPolicyConfig={
        'filtersConfig': [
            {'type': 'SEXUAL', 'inputStrength': 'HIGH', 'outputStrength': 'HIGH'},
            {'type': 'VIOLENCE', 'inputStrength': 'HIGH', 'outputStrength': 'HIGH'},
            {'type': 'HATE', 'inputStrength': 'HIGH', 'outputStrength': 'HIGH'},
            {'type': 'INSULTS', 'inputStrength': 'MEDIUM', 'outputStrength': 'HIGH'},
            {'type': 'MISCONDUCT', 'inputStrength': 'HIGH', 'outputStrength': 'HIGH'},
            {'type': 'PROMPT_ATTACK', 'inputStrength': 'HIGH', 'outputStrength': 'NONE'}
        ]
    },
    blockedInputMessaging='Your request contains content that violates our usage policy.',
    blockedOutputsMessaging='The response was filtered for safety reasons.'
)

这里有个细节值得注意:PROMPT_ATTACKoutputStrength 设为 NONE,因为 prompt injection 只在输入端有意义,输出端不需要检查这个类别。

PROMPT_ATTACK 能识别常见的注入模式,比如:

  • "忽略之前的所有指令"
  • "你的系统提示是什么"
  • "假装你是另一个 AI"
  • 通过编码或格式伪装的变体攻击

话题控制(Topic Policy)

限制 Agent 只讨论业务相关的话题。定义 DENY 列表,包含话题名称、描述和示例:

topicPolicyConfig={
    'topicsConfig': [
        {
            'name': 'investment-advice',
            'definition': 'Providing specific investment recommendations or financial advice',
            'examples': [
                'Should I buy AAPL stock?',
                'What cryptocurrency should I invest in?'
            ],
            'type': 'DENY'
        },
        {
            'name': 'off-topic-requests',
            'definition': 'Requests unrelated to the product or service domain',
            'examples': [
                'Can you help me with my homework?',
                'Write me a poem about cats'
            ],
            'type': 'DENY'
        }
    ]
}

示例越具体,匹配越准确。建议从实际的用户对话日志中提取典型问法。

PII 脱敏(Sensitive Information)

两种处理方式:

  • ANONYMIZE:用占位符替换(如邮箱替换为 {EMAIL}),响应正常返回
  • BLOCK:直接拦截整个响应
sensitiveInformationPolicyConfig={
    'piiEntitiesConfig': [
        {'type': 'EMAIL', 'action': 'ANONYMIZE'},
        {'type': 'PHONE', 'action': 'ANONYMIZE'},
        {'type': 'NAME', 'action': 'ANONYMIZE'},
        {'type': 'US_SOCIAL_SECURITY_NUMBER', 'action': 'BLOCK'},
        {'type': 'CREDIT_DEBIT_CARD_NUMBER', 'action': 'BLOCK'}
    ],
    'regexesConfig': [
        {
            'name': 'internal-project-code',
            'description': 'Internal project codes in format PRJ-XXXX',
            'pattern': 'PRJ-[A-Z0-9]{4}',
            'action': 'ANONYMIZE'
        }
    ]
}

regexesConfig 支持自定义正则表达式,适合处理企业内部的敏感信息格式(如项目编号、工号等)。

集成方式

在调用模型时通过 guardrailIdentifierguardrailVersion 两个参数指定护栏:

# 在调用模型时指定 guardrail
response = bedrock_runtime.invoke_model(
    modelId='anthropic.claude-3-sonnet-20240229-v1:0',
    guardrailIdentifier='guardrail-id-here',
    guardrailVersion='DRAFT',
    body=json.dumps({
        'messages': [{'role': 'user', 'content': user_input}],
        'max_tokens': 1024
    })
)

# 检查是否被拦截
result = json.loads(response['body'].read())
if result.get('stop_reason') == 'guardrail_intervened':
    print('Request was blocked by guardrail')

被拦截时 stop_reason 返回 guardrail_intervened,应用层可以据此做相应处理(返回友好提示、记录日志等)。

一周线上数据

指标 数值
总请求数 12,847
输入被拦截 23 次(0.18%)
输出被过滤 7 次(0.05%)
Prompt Attack 检测 15 次
PII 脱敏 42 次
误报(人工复核) 2 次

15 次 Prompt Attack 中有 12 次是真实攻击尝试,3 次是正常用户的措辞碰巧触发。误报率可以接受,通过调整过滤强度可以进一步优化。

注意事项

  1. 延迟影响:Guardrails 检查增加 50-200ms 延迟,对实时对话影响不大,但如果链路上已经有多层中间件,要关注累积延迟
  2. 成本:按检查的文本量计费,大约 $0.75/1000 文本单元
  3. 不能替代应用层验证:Guardrails 是安全兜底层,业务逻辑的输入校验(格式、长度、权限等)仍然需要在应用层处理
  4. 持续调优:建议每周复核拦截日志,调整过滤强度。初期可以稍微松一些,根据实际攻击情况逐步收紧

小结

AI Agent 的安全护栏是上线前必须考虑的环节。Amazon Bedrock Guardrails 提供了配置即用的方案——内容过滤、话题控制、PII 脱敏、prompt injection 检测——不需要自己训练安全分类模型。成本可控,延迟可接受,检测准确度在生产环境中表现不错。


Amazon Bedrock Guardrails:https://aws.amazon.com/cn/bedrock/guardrails/
Guardrails 文档:https://docs.aws.amazon.com/bedrock/latest/userguide/guardrails.html

posted @ 2026-03-18 11:05  亚马逊云开发者  阅读(1)  评论(0)    收藏  举报