Безопасность подписи веб-крючка 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/.

Вернуться на верх