Безопасность подписи веб-крючка Postmark Webhook
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)
По мне, это не так безопасно, как проверка подписи. Другие API, такие как Mailgun, имеют подписи и токены, а также hmac для проверки webhooks в заголовке запроса
Пример почтового пистолета:
import hashlib, hmac
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.
Basic Auth
Вы можете реализовать базовый auth в сервере приложений или веб-сервере.
Для 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
.
Firewall
< < <Который может выглядеть так:
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 WAF https://developers.cloudflare.com/waf/tools/ip-access-rules/.