使用网关进行报头传播
什么是标题和查询参数传播
标头传播是指系统地将来自传入请求的精选 HTTP 标头通过您的网关转发到已配置的目标,并选择性地将响应标头转发回客户端。与标头传播类似,查询参数传播允许将 URL 查询参数从传入的请求转发到已配置的目标。此功能可用于需要在客户端和目标之间交换上下文、身份验证、跟踪和其他关键信息的用例。在调用工具调用网关中提供的或从自定义拦截器 lambda 发送的预先允许列表的标头将转发到特定目标。
此功能作为分担责任模型运行:
-
AWS 责任是安全地传递您为目标列入许可名单的标题和查询参数。
-
您的责任是谨慎行事,只允许将对目标至关重要的标头列入许可名单,以确保它们满足您的安全和功能要求。
标题限制
为了维护安全性并防止敏感信息泄露,以下标头受到限制,无法配置为传播:
|
授权* |
|
Proxy-Authorization |
|
WWW-Authenticate |
|
Accept |
|
Accept-Charset |
|
Accept-Encoding |
|
Accept-Language |
|
Content-Type |
|
Content-Length |
|
Content-Encoding |
|
Content-Language |
|
Content-Location |
|
Content-Range |
|
Cache-Control |
|
ETag |
|
过期时间 |
|
If-Match |
|
If-Modified-Since |
|
If-None-Match |
|
If-Range |
|
If-Unmodified-Since |
|
Last-Modified |
|
Pragma |
|
各不相同 |
|
Connection |
|
Keep-Alive |
|
Proxy-Connection |
|
升级 |
|
主机 |
|
User-Agent |
|
Referer |
|
来源 |
|
Range |
|
Accept-Ranges |
|
Transfer-Encoding |
|
TE |
|
Trailer |
|
服务器 |
|
日期 |
|
位置 |
|
Retry-After |
|
Set-Cookie |
|
Cookie |
|
Content-Security-Policy |
|
Content-Security-Policy-Report-Only |
|
Strict-Transport-Security |
|
X-Content-Type-Options |
|
X-Frame-Options |
|
X-XSS-Protection |
|
Referrer-Policy |
|
Permissions-Policy |
|
Cross-Origin-Embedder-Policy |
|
Cross-Origin-Opener-Policy |
|
Cross-Origin-Resource-Policy |
|
Access-Control-Allow-Origin |
|
Access-Control-Allow-Methods |
|
Access-Control-Allow-Headers |
|
Access-Control-Allow-Credentials |
|
Access-Control-Expose-Headers |
|
Access-Control-Max-Age |
|
Access-Control-Request-Method |
|
Access-Control-Request-Headers |
|
Origin |
|
Accept-CH |
|
Accept-CH-Lifetime |
|
DPR |
|
宽度 |
|
Viewport-Width |
|
下行链路 |
|
等等 |
|
RTT |
|
Save-Data |
|
Clear-Site-Data |
|
Feature-Policy |
|
Expect-CT |
|
Public-Key-Pins |
|
Public-Key-Pins-Report-Only |
|
X-Forwarded-For |
|
X-Forwarded-Host |
|
X-Forwarded-Proto |
|
X-Real-IP |
|
X-Requested-With |
|
X-CSRF-Token |
|
CF-Ray |
|
CF-Connecting-IP |
|
X-Amz-Cf-Id |
|
X-Cache |
|
X-Served-By |
|
:方法 |
|
:path |
|
:方案 |
|
:权威 |
|
:status |
|
Link |
|
Sec-WebSocket-Key |
|
Sec-WebSocket-Accept |
|
Sec-WebSocket-Version |
|
Sec-WebSocket-Protocol |
|
Sec-WebSocket-Extensions |
-
在创建目标期间,不能将授权标头列入许可名单。但是,当拦截器 lambda 提供时,它将被转发到目标。有关详细信息,请参见来自拦截器 lambda 的标头传播。
重要
除了上面提到的受限标头外,无法将 API 密钥和 REST API 架构中提供的标头配置为标头传播。
其他验证规则适用于允许的标头:
-
每个目标最多 10 个请求标头、10 个响应标头和 10 个查询参数,以防止滥用并保持性能
-
标头名称必须仅包含字母数字字符、连字符和下划线(regex:)
^[a-zA-Z0-9_-]+$ -
为了防止内存耗尽,标头值限制为最大 4KB
-
标题值必须仅包含可打印的 ASCII 字符
-
禁止使用以开头
X-Amzn-的标题( X-Amzn-Bedrock-AgentCore-Runtime-Custom-* 标题除外)
配置标题和查询参数传播
创建或更新网关目标时,可以在目标级别配置标头和查询参数。标头和查询参数是按目标指定的,确保每个目标只接收所需的标头。
Target-level 配置
通过在目标中添加allowedRequestHeadersallowedResponseHeaders、和allowedQueryParameters字段来配置标题传播metadataConfiguration:
{ "name": "my-target", "description": "my target description", "credentialProviderConfigurations": [{ "credentialProviderType": "OAUTH", "credentialProvider": { "oauthCredentialProvider": { "providerArn": "arn:aws:bedrock-agentcore:us-west-2:123456789012:credential-provider/example", "scopes": [] } } }], "targetConfiguration": { "mcp": { "mcpServer": { "endpoint": "https://example.com/mcp" } } }, "metadataConfiguration": { "allowedRequestHeaders": [ "request-header" ], "allowedResponseHeaders": [ "response-header" ], "allowedQueryParameters": [ "query-param" ] } }
使用 Python 开发工具包:
import boto3 # Initialize the client client = boto3.client('bedrock-agentcore', region_name='us-west-2') # Create target with header propagation response = client.create_gateway_target( gatewayId='gateway-123', name='mcp-target-with-headers', description='MCP target with header propagation', targetConfiguration={ 'mcp': { 'mcpServer': { 'endpoint': 'https://example.com/mcp' } } }, metadataConfiguration={ 'allowedRequestHeaders': ['x-correlation-id', 'x-tenant-id'], 'allowedResponseHeaders': ['x-rate-limit-remaining'], 'allowedQueryParameters': ['version'] } )
来自拦截器 lambda 的标头传播
在网关中使用自定义拦截器 lambda 时,您可以通过在拦截器 lambda 响应中包含标头来动态控制标头传播。
拦截器标头传播的工作原理
拦截器 lambda 可以通过以下方式影响标头传播:
-
授权标头覆盖:拦截器 lambda 响应中的
Authorization标头会自动传播到目标。虽然无法在目标的许可名单中配置Authorization标头,但当拦截器 lambda 提供标头时,它将被转发到目标。例如,如果您向目标添加了凭证提供程序,该提供者提供了类似
Authorization: Bearer client-token的授权令牌,而拦截器 lambda 提供的授权令牌Authorization: Bearer refreshed-token,则Bearer refreshed-token来自拦截器 lambda 的值将被转发到目标。 -
自定义标头注入:拦截器 lambda 响应中的其他标头将与配置的目标标头许可名单合并。
-
标头优先级:如果发生冲突,拦截器 lambda 提供的标头优先于客户端提供的标头。
例如,如果您在目标配置
x-tenant-id中加入了允许列表标头,而拦截器 lambda 提供的x-tenant-id: tenant-123则传入请求提供了该标头x-tenant-id: tenant-456,则tenant-456来自拦截器 lambda 的值将被转发到目标。 -
安全验证:所有 lambda 提供的标头都必须遵守与配置标头相同的验证规则。除 Authorization 标头外,所有其他标头都必须在目标创建期间列入许可名单,才能转发到目标。
在拦截器中实现标头传播
将拦截器 lambda 配置为返回应传播到目标的标头:
import json import boto3 def lambda_handler(event, context): # Extract request context request_context = event.get('requestContext', {}) user_identity = request_context.get('identity', {}) # Fetch credentials from secure store (example) credentials_client = boto3.client('secretsmanager') secret = credentials_client.get_secret_value( SecretId=f"mcp-credentials/{user_identity.get('userId')}" ) credentials = json.loads(secret['SecretString']) # Return response with headers to propagate return { "interceptorOutputVersion": "1.0", "mcp": { "transformedGatewayRequest": { "headers": { # Authorization header will be propagated automatically "Authorization": f"Bearer {credentials['access_token']}", # Custom headers (must be in target allowlist) "x-tenant-id": user_identity.get('tenantId'), "x-correlation-id": request_context.get('requestId') }, "body": event['mcp']['gatewayRequest']['body'] } } }
拦截器标头传播的常见用例包括:
- 凭证获取
-
从安全保管库中检索短期令牌并将其作为授权标头注入,防止客户端应用程序中的凭据泄露。
- 上下文注入
-
添加租户标识符、组织上下文或源自经过身份验证的用户声明(而不是信任客户提供的值)的用户属性。
- 标题转换
-
在标头到达目标之前,根据业务逻辑、合规性要求或安全策略对其进行转换或消毒。
- 动态路由
-
根据对用户属性或系统状态的实时分析,注入路由提示、功能标志或 A/B 测试标头。
安全注意事项
使用拦截器 lambda 实现标头传播时,请遵循以下安全最佳实践:
-
验证标头来源:仅传播在目标许可名单中明确配置或由可信拦截器 lambda 返回的标头
-
清理敏感数据:在将标头转发到外部 MCP 服务器之前,删除或屏蔽 PII 和敏感信息
-
使用最低权限:为拦截器 lambda IAM 角色配置凭证获取和上下文检索所需的最低权限
-
实施审计日志:用于安全监控和合规性的日志标头转换和凭据获取活动
-
验证标头内容:确保 lambda 生成的标头符合与配置标头相同的验证规则
最佳实践
在实现标头传播时,请遵循以下最佳实践:
- 使用特定于目标的配置
-
按目标配置标头,而不是全局配置标头。不同的目标可能需要不同的标头,并且特定于目标的配置可以提供更好的安全隔离。
- 尽量减少标题数量
-
只传播目标实际需要的标头。过多的标头会增加请求大小和处理开销。
- 使用语义标头名称
-
选择能够清楚表明其用途的描述性标头名称,例如
x-correlation-id用于跟踪或x-tenant-id用于多租户。 - 实施正确的错误处理
-
处理必需标题缺失或无效的情况。考虑是请求失败还是提供默认值。
- 监控标题使用情况
-
使用网关可观察性功能来监控哪些标头正在传播,并识别标头验证或处理中存在的任何问题。
- 测试标头传播
-
在开发和测试期间,验证标头是否正确传播到您的目标。使用请求记录或调试端点之类的工具来验证标头流。