https://postmarkapp.com/developer/webhooks/webhooks-overview
https://<username>:<password>@example.com/webhook
浏览Postmark API,似乎没有任何关于webhook签名或令牌或用于安全的hmac的信息。提到的唯一安全性是基本身份验证或防火墙。
你是如何设置基本的身份验证或防火墙来使用Postmark网络挂钩的?在nginx或apache上有什么需要做的吗?
像这样的基本身份验证?
requests.post('url',headers=headers,auth=('username','password'), json=json_data)
username:password@mysite.com
在我看来,这似乎不如签名验证安全。其他API,如Mailgun,在请求头中有签名和令牌以及用于验证webhook的hmac。
Mailgun示例:
https://documentation.mailgun.com/en/latest/user_manual.html#webhooks-1
import hashlib, hmac, json
def verify(signing_key, token, timestamp, signature):
hmac_digest = hmac.new(key=signing_key.encode(),
msg=('{}{}'.format(timestamp, token)).encode(),
digestmod=hashlib.sha256).hexdigest()
return hmac.compare_digest(str(signature), str(hmac_digest))
@csrf_exempt
def mailgun_webhook(request):
body_unicode = request.body.decode('utf-8')
body = json.loads(body_unicode)
signature = body['signature']['signature']
token = body['signature']['token']
timestamp = body['signature']['timestamp']
webhook_signing_key = 'KEY'
if verify(webhook_signing_key, token, timestamp, signature) is True:
print('do something')
return HttpResponse(status=200)
您是正确的Postmark只支持基本身份验证。他们进一步建议使用防火墙规则,因为它们可以为您提供静态IP以添加到允许列表中。
让我们探讨一下如何使用Nginx的防火墙规则和基本身份验证。
基本身份验证
您可以在应用程序服务器或web服务器中实现基本身份验证。
对于nginx,你可以在这里找到关于这个主题的文档https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-http-basic-authentication/.
你的nginx配置可能是这样的:
server {
...
location /webhooks {
auth_basic "Webhook Area";
auth_basic_user_file /etc/apache2/.htpasswd;
...
}
}
在Postmark中,您可以按照建议的格式创建一个webhook端点:https://<username>:<password>@yoursite.com/webhooks
,其中用户名和密码与.htpasswd
文件中的内容相匹配。
防火墙
此选项之所以可行,是因为Postmark保证其webhook将从一组静态IP发送。
在实现方面,防火墙因您运行的基础设施类型而异。有没有专门的应用程序主要负责处理webhook?你有网络服务器(nginx(代理吗?你在使用WAF吗?
按照上一节中提供的相同链接再次使用Nginx作为示例,您可以找到一个关于";"IP地址访问限制";。
看起来像:
server {
...
location /webhooks {
#...
allow 3.134.147.250;
allow 50.31.156.6;
allow 50.31.156.77;
allow 18.217.206.57;
deny all;
...
}
}
您可以查阅Postmarks文档以获取IP的最新列表https://postmarkapp.com/support/article/800-ips-for-firewalls#webhooks.
如果您正在使用WAF,他们还应该支持基于IP的规则,例如Cloudflare WAFhttps://developers.cloudflare.com/waf/tools/ip-access-rules/.