如何限制仅允许https://app.datadoghq.com访问我的API网关?
解决API Gateway仅允许Datadog Webhook访问的安全配置问题
首先明确:CORS配置对Datadog的服务器端Webhook请求无效,CORS是浏览器端的跨域限制机制,而Datadog发送的是服务器到服务器的请求,不受CORS规则约束,所以你需要通过以下几种方式组合实现访问限制:
1. 配置API Gateway资源策略做基础过滤
资源策略可以直接在API Gateway层面限制请求来源,结合Datadog的IP范围和请求头做双重校验。
示例资源策略(适配HTTP API)
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:你的AWS区域:你的账号ID:你的API ID/*/*/*", "Condition": { "StringEquals": { "aws:Referer": "https://app.datadoghq.com" }, "IpAddress": { "aws:SourceIp": [ "3.216.0.0/14", "34.192.0.0/12", "52.0.0.0/7" ] } } } ] }
- 替换
你的AWS区域、你的账号ID、你的API ID为实际值 SourceIp里的IP段是Datadog公开的Webhook出站IP范围,建议定期确认官方更新aws:Referer验证请求来自Datadog官方域名
2. 验证Datadog请求签名(最可靠的身份校验)
Datadog Webhook支持基于HMAC的签名验证,会在请求头中携带DD-SIGNATURE,你可以在Lambda函数中验证这个签名,确保请求确实来自Datadog。
步骤:
- 在Datadog的Webhook设置页面,配置一个自定义签名密钥
- 在Lambda函数中添加签名验证逻辑,示例代码(Python):
import hmac import hashlib import base64 def verify_datadog_signature(request_body, signature_header, secret): # 拆分签名格式:v1=xxx if not signature_header or '=' not in signature_header: return False _, signature = signature_header.split('=', 1) # 计算请求体的HMAC-SHA256签名 computed_hmac = hmac.new( secret.encode('utf-8'), request_body.encode('utf-8'), hashlib.sha256 ).digest() computed_signature = base64.b64encode(computed_hmac).decode('utf-8') # 用安全的比较方式避免时序攻击 return hmac.compare_digest(computed_signature, signature) def lambda_handler(event, context): # 获取请求体和签名头 request_body = event.get('body', '') signature_header = event['headers'].get('DD-SIGNATURE', '') datadog_secret = '你在Datadog配置的签名密钥' # 验证签名 if not verify_datadog_signature(request_body, signature_header, datadog_secret): return { 'statusCode': 403, 'body': 'Invalid request signature' } # 后续存储数据到S3的逻辑 # ... return { 'statusCode': 200, 'body': 'Data received successfully' }
3. 额外添加请求头验证规则
在HTTP API的路由配置中,你可以添加强制请求头校验,比如要求请求必须包含DD-SIGNATURE或X-Datadog-Webhook-Name这类Datadog专属请求头,直接拒绝不符合要求的请求。
配置方式:
- 进入API Gateway控制台,找到你的HTTP API对应的路由
- 在“请求验证”中添加“请求头”验证规则,设置为“必须存在”指定的Datadog请求头
内容的提问来源于stack exchange,提问作者user15569323
相关产品推荐
相关产品推荐

