随着大语言模型(LLM)在生产环境中的广泛应用,保护这些高价值、高消耗的API端点成为了AI基础设施团队的首要任务。一个未受保护的LLM API不仅可能导致高昂的运行成本,更面临数据泄露和恶意Prompt Injection的风险。
本篇文章将聚焦于如何利用云服务商提供的API安全功能——具体是AWS的API Gateway与Web应用防火墙(WAF)——来构建一个强大的、多层次的LLM安全屏障。
1. LLM API的安全挑战与架构
LLM服务通常部署在SageMaker或EKS集群中,并暴露为REST API。我们应该始终将API Gateway置于LLM端点之前,充当请求的入口点和安全策略的执行者。
安全挑战:
1. 认证/授权不足: 任何人都可以调用API。
2. 资源滥用/DoS: 恶意的或失控的客户端短时间内发送大量请求。
3. Prompt Injection: 通过恶意输入绕过安全机制,或尝试数据窃取。
2. 实施强认证和授权 (Lambda Authorizer)
AWS API Gateway支持多种授权机制,其中Lambda Authorizer提供了最大的灵活性,可以集成企业级的身份验证系统(如JWT/OAuth)。
Lambda Authorizer会在请求到达LLM后台之前执行,验证请求头中的Token,并根据验证结果决定是否放行请求。
2.1 Lambda Authorizer示例代码 (Python)
以下是一个简单的Lambda Authorizer,用于验证请求中携带的Authorization Token:
import json
import os
def generate_policy(principalId, effect, resource):
# 构造IAM策略文档,用于授权API Gateway执行下一步
auth_response = {'principalId': principalId}
if effect and resource:
policy_document = {
'Version': '2012-10-17',
'Statement': [
{
'Action': 'execute-api:Invoke',
'Effect': effect,
'Resource': resource
}
]
}
auth_response['policyDocument'] = policy_document
return auth_response
def lambda_handler(event, context):
# 获取请求头中的Token
token = event.get('authorizationToken')
method_arn = event['methodArn']
# 生产环境中应替换为实际的JWT解析和签名验证逻辑
if token and token.startswith("Bearer") and "VALID_LLM_TOKEN" in token:
# 认证成功,允许访问
user_id = "authenticated-user-123"
return generate_policy(user_id, 'Allow', method_arn)
else:
# 认证失败,抛出异常(返回401 Unauthorized)
print("Unauthorized request detected.")
raise Exception('Unauthorized')
配置API Gateway使用此Lambda Authorizer后,所有未携带有效Token的请求都将在到达LLM服务之前被拦截。
3. 速率限制和配额管理 (Usage Plans)
为了防止成本失控和DoS攻击,必须对API调用进行严格的速率限制。API Gateway的“使用计划 (Usage Plans)”是实现这一目标的最佳工具。
实操步骤:
1. 创建使用计划: 定义最大请求速率(Rate)和突发容量(Burst)。例如:Rate: 10 req/s, Burst: 5。
2. 关联API Key: 为不同的用户或应用程序生成唯一的API Key。
3. 分配配额: 可选,设置每月或每天的调用次数上限。
通过CLI或控制台配置示例:
# 假设我们已经创建了API key ID: 1a2b3c4d
aws apigateway create-usage-plan \
--name "LLM-Standard-Tier" \
--api-stages items='{"apiId":"<Your-API-ID>", "stage":"prod"}' \
--throttle rateLimit=10,burstLimit=5
# 将API Key关联到使用计划
aws apigateway create-usage-plan-key \
--usage-plan-id <Usage-Plan-ID> \
--key-id 1a2b3c4d \
--key-type API_KEY
4. 利用WAF应对Prompt Injection攻击
Prompt Injection是LLM服务特有的高风险漏洞。攻击者试图通过输入特定的指令来覆盖或欺骗模型的预期行为。AWS WAF是防御此类应用层攻击的利器,因为它能够在请求到达LLM之前,检查HTTP请求体(即Prompt内容)。
我们可以配置WAF规则集,专门针对那些包含常见攻击指令或数据外泄尝试的请求。
4.1 WAF规则配置实操(针对Prompt Injection)
关键在于检查请求JSON Payload中包含Prompt的字段(例如 prompt 或 input)。
步骤 1:创建WAF Web ACL并关联到API Gateway Stage。
步骤 2:创建自定义规则,使用字符串匹配或正则表达式阻止恶意指令。
以下是针对Prompt Injection的关键防御规则示例:
| 规则类型 | 匹配字段/位置 | 匹配内容 | 动作 (Action) | 目的 |
|---|---|---|---|---|
| String Match | Request Body (JSON) | system prompt | Block | 阻止内部指令覆盖尝试 |
| Regex Match | Request Body (JSON) | **(select | delete | union).*from** | Block | 阻止SQL注入风格的提示 |
| String Match | Request Body (JSON) | ignore the previous | Block | 阻止经典的绕过提示 |
| String Match | Request Body (JSON) | exfiltrate data to | Block | 阻止数据泄露指令 |
WAF规则配置示例 (使用JSON体检查):
假设LLM服务的请求体是 {“prompt”: “user input here”}。
{
"Name": "LLM_Injection_Blocker",
"Priority": 10,
"Statement": {
"ByteMatchStatement": {
"SearchString": "system prompt",
"FieldToMatch": {
"JsonBody": {
"MatchPattern": {
"All": {}
},
"MatchScope": "ALL"
}
},
"TextTransformation": [
{
"Type": "LOWERCASE"
}
],
"PositionalConstraint": "CONTAINS"
}
},
"Action": {
"Block": {}
}
}
通过将此规则集应用到API Gateway,任何包含 system prompt 或其他已定义恶意字符串的请求,将在到达后端LLM推理服务之前,就被WAF立即阻止,从而有效降低安全风险和资源消耗。
总结
保护生产级LLM API是一项涉及认证、流量控制和内容过滤的系统性工作。通过结合使用Lambda Authorizer实现身份验证、API Gateway Usage Plans实现速率限制,以及AWS WAF实现针对Prompt Injection的深度内容检查,我们可以构建一个稳健且高效的AI安全基础设施。
汤不热吧